Игры в Паскале

Игры в Паскале

Недавно мы изучили массивы и рассмотрели немного типовых задач, посвященных опять же массивам. Сегодня предлагаю рассмотреть тему написания игр на Pascal’е, потому что будет широко использоваться материал из только что изученной темы.

Недавно мы изучили массивы и рассмотрели немного типовых задач, посвященных опять же массивам. Сегодня предлагаю рассмотреть тему написания игр на Pascal’е, потому что будет широко использоваться материал из только что изученной темы.

Вспомним, что в Pascal’e существует текстовый режим и графический. Для создания игр можно использовать оба режима. Разница заключается в том, что в графическом режиме все можно организовать красивее, чем в текстовом, но написание более сложно чем в текстовом режиме. В сегодняшнем уроке мы в качестве примера рассмотрим написание игры «Лабиринт» в текстовом режиме.

Очень важно понять – в любом случае все игровое пространство необходимо разделить на фиксированные участки, в которых будут находиться разные объекты, с которыми будет взаимодействовать игрок. В текстовом режиме этих участков будет 80*25 (количество строк и столбиков), в графическом – 640*480 (разрешение экрана). В случае необходимости, скажем, если элементов слишком много, и уместить их на одном экране не представляется возможным, можно хитрить. К примеру, игрок движется только по оси Х, и ему за пределами экрана (скажем, 83 столбец в текстовом представлении) должен встретиться объект (камень, мина, деньги – не важно), тогда можно явно задавать координаты объекта и постоянно центрировать экран на персонаже, но пересчитывать координаты, за счет чего и будет осуществляться «передвижение». У нас же количество элементов будет спокойно умещаться в рамках экрана.

Давайте сделаем в текстовом режиме максимально удобную для пользователя игру. Для этого нам понадобится:

1. Меню игры

2. Игровая справка

3. Сама игра

3.1. В игре нужно будет отображать всю актуальную информацию (например, количество очков).

Первым пользователь увидит меню. Оно будет идеалом аскетизма и выглядеть примерно так:

Программный код:

Листинг : Описание program labirint; uses crt; var v:char; begin repeat clrscr; gotoxy (35,10); writeln (‘Главное меню’); gotoxy (35,15); writeln (‘1 игровая справка’); gotoxy (35,20); writeln (‘2 начало игры’); gotoxy (35,25); writeln (‘3 выход из игры’); v:=readkey; until v=’3’; end.

Можно было использовать строковый тип данных, но мы использовали символьный тип потому что он требует меньше памяти (в данной программе особого значения размер переменных не имеет, но с прицелом на будущее надо привыкать делать все компактно), а еще функция readkey работает только с переменными символьного типа. Данная функция позволяет считать вводимый с клавиатуры символ.

Написание справки тоже не должно вызвать сложностей, поэтому объяснения данного пункта мы опустим.

Листинг : Описание program labirint; uses crt; var v:char; begin repeat clrscr; gotoxy (35,10); writeln (‘Главное меню’); gotoxy (35,15); writeln (‘1 игровая справка’); gotoxy (35,20); writeln (‘2 начало игры’); gotoxy (35,25); writeln (‘3 выход из игры’); v:=readkey; if v=’1’ then begin clrscr; writeln; writeln (‘Вам представлена игра «Лабиринт». Цель – набрать 50 очков,’); writeln (‘собирая специальные знаки ($). Если же попадете на поле со’); writeln (‘знаком *, то лицевой счет уменьшится на единицу. Управление’); writeln (‘осуществляется клавишами w, a,s, d, для выхода – 3.’); writeln; writeln (‘Для возвращения в главное меню, нажмите клавишу Enter.’); readln; until v=’3’; end.

Сейчас займемся помещением на игровое поле различных элементов (стен, бонусов и т. д.).

Сначала напишем полный код программы, а потом разъясним детали (читать комментарии по ходу полезно).

Листинг : Описание program lexam; uses crt; var v, c:char; s, i,x, y:integer; a:ARRAY[1..80,1..23] of integer; begin randomize; s:=0;

{menu} repeat clrscr; textcolor (white); gotoxy (35,10); writeln ('Главное меню'); gotoxy (30,15); writeln (' 1 игровая справка'); gotoxy (30,20); writeln (' 2 начало игры'); gotoxy (30,25); writeln (' 3 выход из игры'); v:=readkey;

{help} if v='1' then begin clrscr; writeln; writeln (‘Вам представлена игра «Лабиринт». Цель – набрать 50 очков,’); writeln (‘собирая специальные знаки ($). Если же попадете на поле со’); writeln (‘знаком *, то лицевой счет уменьшится на единицу. Управление’); writeln (‘осуществляется клавишами w, a,s, d, для выхода – 3.’); writeln; writeln (‘Для возвращения в главное меню, нажмите клавишу Enter.’); readln; end;

{game} if v='2' then begin clrscr; textcolor (3); gotoxy (40,24); writeln ('$ - увеличение счета'); {информация для игрока} writeln ('* - уменьшение счета'); for x:=1 to 80 do for y:=1 to 23 do a[x, y]:=random (10);

{walls} for i:=1 to y do a[1,i]:=1; {постановка стен по краям поля} for i:=1 to y do a[x, i]:=1; for i:=1 to x do a[i,1]:=1; for i:=1 to x do a[i, y]:=1;

{chars} for x:=1 to 80 do begin for y:=1 to 23 do begin if a[x, y]=1 then {прорисовка остальных стен} begin textcolor (white); gotoxy (x, y); write ('=') end; if a[x, y]=2 then {прорисовка бонусов} begin textcolor (green); gotoxy (x, y); write ('$') end; if a[x, y]=3 then {прорисовка ловушек} begin textcolor (red); gotoxy (x, y); write ('*'); end; end; end; end;

{player} x:=20; {начальные координаты игрока} y:=20; repeat {прорисовка положения игрока} textcolor (blue); gotoxy (x, y); write ('о'); c:=readkey; textcolor (black); gotoxy (x, y); write ('о'); if c='a' then {перемещение} begin x:=x-1; if a[x, y]=1 then x:=x+1 end; if c='w' then begin y:=y-1; if a[x, y]=1 then y:=y+1 end; if c='s' then begin y:=y+1; if a[x, y]=1 then y:=y-1 end; if c='d' then begin x:=x+1; if a[x, y]=1 then x:=x-1 end; textcolor (3); if a[x, y]=2 then {пересчет данных при взятии бонуса} begin textcolor (0); gotoxy (10,30); write (' '); s:=s+1; a[x, y]:=0; textcolor (3); gotoxy (10,30); write ('ваш счет ',s) end; if a[x, y]=3 then {пересчет данных при попадании на ловушку} begin textcolor (0); gotoxy (10,30); write (' '); s:=s-1; a[x, y]:=0; textcolor (3); gotoxy (10,30); write ('ваш счет - ',s) end;

{conditions} if s=50 then {экран победы} begin clrscr; gotoxy (20,20); writeln ('Поздравляю с победой! Нажмите 3 для выхода') end; if s=-50 then {экран поражения} begin clrscr; gotoxy (20,20); writeln ('Сожалею, но вы проиграли. Нажмите 3 для выхода') end; until c='3'; {выход в меню} until v='3'; end.

В случае победы пользователь должен об этом знать, поэтому выдаем сообщение на специальном экране:

Все действия мы поручим компьютеру, чтобы каждый раз были разные вариации карт. Обо всем по порядку.

1. Добавляется двумерный массив. В нем мы будем хранить значения каждой клетки игрового поля, следовательно, все стены, ловушки, бонусы заносятся именно в него.

2. Почему рандом идет до (10), а фактически используется только 4 (0,1,2,3) значения? Делается это для того, чтобы на карте было не слишком много объектов. Чем число больше, тем меньше объектов будет, и наоборот.

3. Почему расстановка элементов идет до 23 строки, а не до 25? Потому что 2 строки остаются для информации – счет и т. д.

4. Почему стены и прочие объекты не перерисовываются? Потому что они не двигаются.

5. Почему используется readkey, а не readln? Представьте себе ситуацию, когда надо каждый раз после нажатия клавиши перемещения, подтверждать свой выбор – это страшно неудобно, поэтому и используется readkey.

6. Обратите внимание, что одновременно осуществляется несколько действий: перемещение игрока, проверка координат, пересчет данных, если встречается бонус или ловушка, изменение значения элемента массива с текущими координатами курсора и после всего этого перерисовка всего (!) поля с учетом последних изменений, только в этом случае работа будет максимально корректно.

7. Посмотрите, как осуществляется «взаимодействие» со стенами – если координаты стены и измененные координаты курсора совпадают, то координаты курсора «откатываются» на предыдущую позицию, а так как перерисовка карты осуществляется после всех операций, пользователь не видит всех изменений и курсор остается на прежнем месте.

Темой одного из наших уроков была блок-схема. Дабы несколько освежить данную информацию, построим блок-схему нашего "Лабиринта". Она получилась больше, чем на рядовом уроке информатики в школе, и для удобства восприятия выстроена в несколько столбиков. Следует обратить внимание, что циклы, отвечающие за главное меню и саму игру, заканчиваются в конце всей схемы. Для удобства также экраны сообщения о победе/поражения обозначены одним элементом (параллелограммом).

В графическом режиме все делается абсолютно также, но только с применением процедур конкретно графического, а не текстового режима.

Сегодня мы рассмотрели основной принцип написания игр на Pascal’e, но вполне естественно, что под каждую игру начинающий программист будет разрабатывать свой собственный алгоритм.


Карта сайта


Информационный сайт Webavtocat.ru