|
(* Программа игры в русские шашки на языке Глагол. *)
(******************************************************************************)
(**) ОТДЕЛ Шашки64+;
(******************************************************************************)
(* НАЗНАЧЕНИЕ: создание экранных надписей и кнопочек *)
(* ПРИМЕЧАНИЯ: для управления можно использовать только мышку, *)
(* правила игры см. в отделе \Глагол\Приложения\Игры\Шашки\Игра.отд *)
(* и в отделе \Глагол\Приложения\Игры\Шашки\Доска.отд *)
(******************************************************************************)
ИСПОЛЬЗУЕТ
Игра ИЗ ".\Шашки\", (* алгоритм игры *)
Доска ИЗ ".\Шашки\", (* рисунок доски *)
Ввод ИЗ "...\Отделы\Обмен\",
ОС ИЗ "...\Отделы\Обмен\",
Окно ИЗ "...\Отделы\Обмен\",
Поле ИЗ "...\Отделы\Поле\",
Надел ИЗ "...\Отделы\Поле\",
Подложка ИЗ "...\Отделы\Поле\",
Черта ИЗ "...\Отделы\Поле\",
Записка ИЗ "...\Отделы\Поле\",
Кнопка ИЗ "...\Отделы\Поле\";
ПОСТ (* действия *)
дЗаново =1;
дВыход =2;
дПредУровень=3;
дСледУровень=4;
ПЕР
времяНижних,времяВерхних,времяОбновления:ЦЕЛ; (* для секундомера *)
зЖдите,зВремяН,зВремяВ,зУровень:Записка.Доступ; (* надписи *)
(******************************************************************************)
ЗАДАЧА ОбновитьСекундомер(номерЧасов:ЦЕЛ);
(* обновить секундомер *)
ПЕР
прошлоВремени:ЦЕЛ;
сек:ЦЕЛ;
ЗАДАЧА ВыводХода(ход-:Игра.Ход);
(* вывод на табло хода машины *)
ПЕР
x0,y0,x1,y1:ЦЕЛ;
ЗАДАЧА NвXY(n,x+,y+:ЦЕЛ);
УКАЗ
ЕСЛИ НЕ Доска.нижниеБелые ТО
n:=100-n
КОН;
x:=Игра.NвX[n];
y:=Игра.NвY[n]
КОН NвXY;
УКАЗ
ЕСЛИ ход.откудаN = ход.кудаN ТО
Записка.Изменить(зЖдите,"") (* пустой ход *)
ИНАЧЕ
NвXY(ход.откудаN,x0,y0);
NвXY(ход.кудаN,x1,y1);
ЕСЛИ ход.битых > 0 ТО
Записка.ИзЧЦел(зЖдите, "%c%d:%c%d", x0+ВЦЕЛ("a")-1, y0, x1+ВЦЕЛ("a")-1, y1)
ИНАЧЕ
Записка.ИзЧЦел(зЖдите, "%c%d-%c%d", x0+ВЦЕЛ("a")-1, y0, x1+ВЦЕЛ("a")-1, y1)
КОН;
КОН
КОН ВыводХода;
УКАЗ
прошлоВремени:=ОС.Время()-времяОбновления;
времяОбновления:=ОС.Время();
ЕСЛИ Игра.конец ТО
Записка.Изменить(зЖдите,"--КОНЕЦ--")
ИНАЧЕ
ЕСЛИ Доска.думаютНижние ТО
УВЕЛИЧИТЬ(времяНижних,прошлоВремени);
ВыводХода(Игра.ходМашины)
ИНАЧЕ
УВЕЛИЧИТЬ(времяВерхних,прошлоВремени);
Записка.Изменить(зЖдите,"Подождите")
КОН
КОН;
сек:=времяВерхних ДЕЛИТЬ 1000;
Записка.ИзЧЦел(зВремяВ, "%.2d:%.2d", сек ДЕЛИТЬ 60, сек ОСТАТОК 60, 0,0);
сек:=времяНижних ДЕЛИТЬ 1000;
Записка.ИзЧЦел(зВремяН, "%.2d:%.2d", сек ДЕЛИТЬ 60, сек ОСТАТОК 60, 0,0);
КОН ОбновитьСекундомер;
(******************************************************************************)
ЗАДАЧА ПредУровень;
УКАЗ
ЕСЛИ Игра.уровень > 2 ТО
УМЕНЬШИТЬ(Игра.уровень);
Записка.ИзЧЦел(зУровень,"%d",Игра.уровень-1,0,0,0)
КОН
КОН ПредУровень;
(******************************************************************************)
ЗАДАЧА СледУровень;
УКАЗ
ЕСЛИ Игра.уровень < 10 ТО
УВЕЛИЧИТЬ(Игра.уровень);
Записка.ИзЧЦел(зУровень,"%d",Игра.уровень-1,0,0,0)
КОН
КОН СледУровень;
(******************************************************************************)
ЗАДАЧА НачатьЗаново(поле:Поле.Доступ);
(* начать новую игру *)
УКАЗ
Записка.Изменить(зЖдите,"") (* пустой ход *)
Записка.Изменить(зВремяН,"");
Записка.Изменить(зВремяВ,"");
времяНижних:=0;
времяВерхних:=0;
времяОбновления:=ОС.Время();
Игра.НачатьЗаново;
Доска.НачатьЗаново;
Поле.Рисовать(поле)
КОН НачатьЗаново;
(******************************************************************************)
ЗАДАЧА Приём(поле:Поле.Доступ; посылка+:Ввод.Посылка);
(* получить и обработать управляющие послания *)
УКАЗ
ДЛЯ посылка ВИДА
| Ввод.ОтКлавиш:
ЕСЛИ посылка.упрАльт И (посылка.код = 58H) (* Alt+'X' *)
ИЛИ (посылка.код = 1BH) (* Esc *)
ТО
поле.состояние:=дВыход;
посылка.код:=0
КОН
| Кнопка.Посылка:
ВЫБРАТЬ посылка.кнопка.действие ИЗ
| дЗаново: НачатьЗаново(поле)
| дВыход: поле.состояние:=дВыход
| дПредУровень: ПредУровень
| дСледУровень: СледУровень
КОН
| Доска.Посылка:
ОбновитьСекундомер(1)
ИНАЧЕ
КОН
КОН Приём;
(******************************************************************************)
ЗАДАЧА СоздатьПоле():Поле.Доступ;
(* создает рабочее поле экрана *)
ПЕР
поле:Поле.Доступ; (* рабочее поле экрана *)
чВертикаль,
чГоризонталь:Черта.Доступ; (* черты *)
кнЗаново,кнВыход,
кнБольше,кнМеньше:Кнопка.Доступ; (* управляющие кнопки *)
зСловоУровень:Записка.Доступ; (* слово "Уровень" *)
доска:Доска.Доступ; (* игровая доска *)
подложка:Подложка.Доступ; (* подложка поля *)
УКАЗ
(* создаём поле *)
поле:=Поле.Создать(0,0,10,30,ПУСТО,ОТКЛ,Приём);
(* создаём наделы *)
<*ЕСЛИ Доска.Оборотень ТО*>
подложка:=Подложка.Создать(0,0,0,0,"Оборотень");
<*ИНАЧЕ*>
подложка:=Подложка.Создать(0,0,0,0,"");
<*КОН*>
доска:=Доска.Создать(1,1);
зВремяВ:=Записка.Создать(1,18,1,5,"");
зВремяН:=Записка.Создать(8,18,1,5,"");
зЖдите:= Записка.Создать(2,18,1,9,"");
Игра.уровень:=5;
зУровень:=Записка.Создать(5,23,1,1,"4");
зСловоУровень:=Записка.Создать(4,20,1,7,"Уровень");
(* создаём черты *)
чВертикаль :=Черта.Создать(0,17,0,1);
чГоризонталь:=Черта.Создать(3,17,1,0);
(* создаём кнопки *)
кнМеньше:=Кнопка.Создать(5,18,"[<~М]",дПредУровень,ВКЛ);
кнБольше:=Кнопка.Создать(5,25,"[~Б>]",дСледУровень,ВКЛ);
кнЗаново:=Кнопка.Создать(6,19,"[ ~Заново]",дЗаново,ВКЛ);
кнВыход :=Кнопка.Создать(7,19,"[ ~Выход ]",дВыход,ВКЛ);
(* добавляем наделы в порядке отрисовки и получения ввода *)
Поле.ДобавитьНадел(поле,подложка);
Поле.ДобавитьНадел(поле,зВремяВ);
Поле.ДобавитьНадел(поле,зВремяН);
Поле.ДобавитьНадел(поле,зЖдите);
Поле.ДобавитьНадел(поле,зУровень);
Поле.ДобавитьНадел(поле,зСловоУровень);
Поле.ДобавитьНадел(поле,чВертикаль);
Поле.ДобавитьНадел(поле,чГоризонталь);
Поле.ДобавитьНадел(поле,доска);
Поле.ДобавитьНадел(поле,кнМеньше);
Поле.ДобавитьНадел(поле,кнБольше);
Поле.ДобавитьНадел(поле,кнЗаново);
Поле.ДобавитьНадел(поле,кнВыход);
ВОЗВРАТ поле
КОН СоздатьПоле;
(******************************************************************************)
ЗАДАЧА Поехали;
ПЕР
поле:Поле.Доступ;
часы:ЦЕЛ;
УКАЗ
Окно.Графическое("Шашки","Lucida Console",30,ОбновитьСекундомер);
(*
Окно.Текстовое(ОбновитьСекундомер);
*)
поле:=СоздатьПоле();
Поле.ОкноНаВсёПоле(поле);
Поле.Рисовать(поле);
НачатьЗаново(поле);
часы:=Окно.СоздатьЧасы(1,1000); (* обновляем часы через 1000 мс *)
Окно.Показать;
(* проверяем и обрабатываем ввод от человека *)
ПОКА поле.состояние = Поле.сРабота ВЫП
Поле.Проверить(поле)
КОН;
Окно.УдалитьЧасы(часы)
КОН Поехали;
(******************************************************************************)
УКАЗ
Поехали
КОН Шашки64.
▲ Вопросы, замечания и предложения высылайте на atimopheyev@yahoo.com или Издателю Глагола:
|
|