Процедура Rect(x,y,c:integer).




Аннотация.

«Крестики-нолики» - популярная игра людей всех возрастов. Она отличается простотой, способствует развитию внимания и элементарной логики. В данной работе эта игра реализована на языке Turbo Pascal.

"Tic-Tac-Toe" – is a popular game of people of all ages. It differs simplicity, promotes development of attention and elementary logic. In this work “Tic-Tac-Toe” is realized in language Turbo Pascal.

 

 

Содержание

Введение………………………………………………………………3

1. Основная часть

1.1. Системные требования………………………………………5

1.2. Инструкция для пользователя………………………………5

1.3. Функциональная схема алгоритма………………………….6

Описание процедур……………………………………………….6

Заключение………………………………………………………...9

Список использованной литературы……………………………...10

2. Приложения

2.1. Исходный код………………………………………………….11

2.2. Демонстрация работы программы……………………………15

 

Введение

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

Например, популярные в последнее время небольшие игры (чаще всего многопользовательские, через сеть Интернет) создаются по технологии Flash с использованием языка ActionScript. Такие игры крайне популярны на разнообразных развлекательных интернет-ресурсах и а социальных сетях.

Большие, сложные игры с реалистичной 3D графикой пишутся на C++, отдельные модули к ним могут быть написаны на других языках (например AI – «искусственный интеллект» - на Lisp). Вообще, язык для создания игры выбирается как компромисс между требованиями к игре, к компьютерному железу и к стоимости разработки.

На подавляющем большинстве мобильных телефонов установлены ARM процессоры. Поэтому игры для мобильных телефонов на платформе Java пишутся на специальном языке для мобильных телефонов MobileBasic, а также на диалекте языка Pascal – MIDletPascal.

Игры для коммуникаторов на базе ОС Windows 5/6 зачастую пишутся на языке Python.

Также существуют специальные программы для написания игр. Яркий пример – программа GameMaker, автором которой является Марк Овермас. Эта программа позволяет написать захватывающую игру даже без знания языков программирования!

 

Передо мной стояла цель написать небольшую игру с применением 2D графики, и я выбрал язык высокого уровня Pascal.

 

Основная часть

Системные требования

Рекомендуемые системные требования:

CPU PI MMX 166MHz, RAM 64 Mb, Video S3 trioV2 1Mb, 1.5Мб свободного места на жестком диске.

Операционная система MS-DOS, FreeDOS, Caldera DR-DOS или любая другая с возможностью эмулирующая DOS.

Инструкция для пользователя

Что это за игра? Это – популярные «крестики нолики». Это игра между двумя противниками на поле размером 3х3 клетки. Один игрок играет «крестиками», другой – «ноликами». Игроки по очереди ставят свои символы в клетки игрового поля. Побеждает тот, кто первым заполнил своими символами три клетки подряд по вертикали, горизонтали или диагонали. Если свободные клетки поля закончились, но никто из игроков не одержал победы, то считают, что игра закончилась «ничьей».

Как играть? Игроки по очереди при помощи клавиш-«стрелок» выбирают нужную ячейку и при нажатии клавиши “Enter” устанавливают в ячейку свой символ.

Список файлов, необходимых для игры:

· GAME.EXE

· EGAVGA.BGI

Оба файла должны находиться в одной директории. Запуск игры происходит при открытии GAME.EXE. Сразу после запуска игры пользователь попадает на стартовую страницу игры, которая содержит информацию по игре, о разработчике, об управлении. После нажатия на любую клавишу начинается игра. Выход из игры возможен при нажатии на “Escape”.

Инструкция для программиста.

Функциональная схема алгоритма

Описание процедур

Процедура StartMenu.

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

· SetTextStyle(шрифт,направление,размер_шрифта); - устанавливает стиль выводимого текста (библиотека GRAPH);

· OutTextXY(x, y, S); - печатает строку S, начиная с позиции (x, y); (библиотека GRAPH);

· SetColor(цвет); - выбирает цвет; (библиотека GRAPH);

Процедура Lattice. Данная процедура выводит на экран игровое поле: рамка + игровая решетка + заголовок, все желтого цвета. В этой процедуре используются стандартные функции и процедуры:

· Line(x1, y1, x2, y2); - проводит линию из точки (x1, y1) в точку (x2, y2); (библиотека GRAPH);

· SetTextStyle(шрифт,направление,размер_шрифта); - устанавливает стиль выводимого текста; (библиотека GRAPH);

· OutTextXY(x, y, S); - печатает строку S, начиная с позиции (x, y);

· SetColor(цвет); - выбирает цвет; (библиотека GRAPH);

 

ПроцедураManual.

Данная процедура выводит на экран (справа от игрового поля) инструкцию по игре. Набот стандартных процедур идентичен такому набору процедуры Lattice.

 

Процедура UpDown.

Данная процедура перемещает курсор в игровом поле по вертикали (вверх или вниз).

Входные данные: x, y:integer; – координаты текущего положения курсора.

Эта процедура вызывается при нажатии на клавиши «стрелки» («вверх» или «вниз»), и, в зависимости от нажатых клавиш, перемещает курсор вверх или вниз. Если курсор находится в самой верхней ячейке и нажата клавиша «вверх», то курсор перемещается в самую нижнюю ячейку этого же столбца.

В этой процедуре используются стандартная функция из библиотеки CRT – ReadKey, которая при нажатии на клавишу сразу присваивает значение переменной.

Также, в ходе работы, эта процедура вызывает другую процедуру Rect, описанную ниже.

 

Процедура LeftRight.

Данная процедура идентична UpDown, разве что она перемещает курсор влево или вправо по игровому полю и вызывается из тела основной программы при нажатии клавиш «влево» или «вправо».

 

Процедура Rect(x,y,c:integer).

Данная процедура служит для вывода на экран квадратного курсора, с помощью которого можно перемещаться между ячейками игрового поля и фиксировать символ в нужной ячейке.

Входные данные:

· x, y:integer; – координаты верхнего левого угла курсора, показывающие, куда его нужно переместить.

· с:integer; – цвет курсора. Может принимать значения 15 (белый) и 0 (черный, для маскировки предыдущего положения курсора).

В этой процедуре были использованы следующие стандартные функции и процедуры:

· SetColor(цвет); - выбирает цвет; (библиотека GRAPH);

· Rectangle(x1, y1, x2, y2); - рисует прямоугольник по заданным координатам, (х1,у1) – верхний левый угол, (х2,у2) – нижний правый угол; (библиотека GRAPH);

Процедура Rect вызывается процедурами UpDown и LeftRight.

 

Процедура Symbol.

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

 

Входные данные:

· x,y:integer; - текущие координаты курсора.

· zn:char; - символ для установки в ячейку, «Х» или «О».

· clr:shortint; - цвет выводимого символа, синий для крестика и зеленый для нолика.

Используемые стандартнее функции и процедуры:

· SetColor(цвет); - выбирает цвет; (библиотека GRAPH);

· SetTextStyle(шрифт,направление,размер_шрифта); - устанавливает стиль выводимого текста; (библиотека GRAPH);

· OutTextXY(x, y, S); - печатает строку S, начиная с позиции (x, y); (библиотека GRAPH);

После получения координат курсора данная функция с помощью оператора Case переходит от них к координатам символа и уже по ним устанавливает символ в игровом поле.

 

Процедура ExitMenu.

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

Используемые стандартные функции и процедуры:

· Line(x1, y1, x2, y2); - проводит линию из точки (x1, y1) в точку (x2, y2); (библиотека GRAPH);

· SetTextStyle(шрифт,направление,размер_шрифта); - устанавливает стиль выводимого текста; (библиотека GRAPH);

· OutTextXY(x, y, S); - печатает строку S, начиная с позиции (x, y);

· SetColor(цвет); - выбирает цвет; (библиотека GRAPH);

 

В теле основной программы сначала происходит инициализация графики. Затем в цикле с постусловием вызывается процедура StartMenu, она выполняется пока не нажата любая клавиша. После этого начинается еще один цикл с постусловием, который по сути является основным циклом игры. В нем задаются начальные координаты курсора, обнуляются элементы массива и начинается третий цикл с постусловием, который представляет из себя игровой кон.

В этом цикле вначале определяется символ («Х» или «О») по четности переменной i. После этого вызываются процедуры Lattice и Manual, которые непрерывно находятся на экране до окончания игры. Затем по команде readkey; считывается с клавиатуры символ, и если это одна из клавиш-стрелок или клавиша Enter, то происходят соответствующие действия: «влево» или «вправо» - вызывается процедура LeftRight, «вверх» или «вниз» - процедура UpDown, «Enter» - вызывается процедура Symbol, и соответствующему элементу массива присваивается значение 1 или 2, в зависимости от текущего символа («Х» или «О»). После этого происходит проверка вариантов победы каждого из игроков или «ничьей». Цикл текущего игрового кона заканчивается после положительного результата одной из этих проверок, либо по нажатии клавиши “Escape”.

В «основном цикле игры» в еще одном цикле с постусловием вызывается процедура ExitMenu; если нажат «Escape», то происходит выход из «основного» цикла с последующим завершением программы, если нажата любая другая клавиша, «основной » цикл начнется заново.

 

Заключение

Я проделал большую работу по написанию этой игры, в моем нелегком деле мне помогали бета-тестеры – студенты с моего курса. В ходе разработки мне пришлось несколько раз переписывать отдельные элементы игры, в том числе полностью переписать пришлось систему управления и ввода. Но труды того стоили. Теперь мы имеем небольшую, красочную и захватывающую игру, с которой можно провести досуг с друзьями!

Среди положительных сторон выполненной работы можно отметить:

· Красочный, дружелюбный и интуитивно понятный интерфейс.

· Использование курсора.

· Небольшой размер дистрибутива программы.

К недостаткам следует отнести отсутствие режима игры PvC (игрок против компьютера).

 

Список использованной литературы:

1. «Паскаль и Дельфи» А.Попов, М., 2004.

2. «Программирования на языках высокого уровня» Д.Страуструп, М. 2006.

3. «Учебник по Turbo Pascal 7» В.В. Зеленский, М. 2000.

 

Приложение

Исходный код

USES graph, crt; {подключение библиотек}

VAR gd,gm,x0,y0,i,k,j:integer; {Описание переменных. Целочисленный тип имеют: gd и gm – для инициализации графики, x0 и y0 – координаты курсора, i – для определения символа («крестик» или «нолик»), j и k – для использования в циклах-счетчиках }

ch,zn:char; {Символьный тип имеют: ch – считываемый с клавиатуры символ, zn – передается “X” или “O” для отображения в ячейке игровой решетки}

a:array[1..3,1..3] of shortint; {Массив, содержит данные в зависимости от заполненности ячеек. Его элементы принимают значения 0 (ячейка пуста), 1 (крестик) или 2 (нолик)}

n,w,e,ctrl:shortint; {n – передает цвет для выводимого на игровом поле символа, 1 (синий) для крестика, 2 (зеленый) для нолика, w и e – для перехода от координат курсора к индексам массива, ctrl – контроль заполненности массива }

{Процедура вывода стартовой страницы.}

procedure StartMenu;

begin

SetColor(15); {Все надписи на экране – белого цвета}

SetTextStyle(0,0,3);

OutTextXY(30,30,'TIC-TAK-TOE'); {Название игры}

SetTextStyle(0,0,1);

OutTextXY(320,45,'V. 1.1'); {Текущая версия}

OutTextXY(20,110,'CREATOR: Protasov Nikolai.'); {Создатель игры}

OutTextXY(20,130,'THANKS: Semyonov Dmitrij FOR BETA-TEST.'); {Благодарности}

OutTextXY(20,180,'MANUAL:'); {Далее следует инструкция по игре}

OutTextXY(40,200,'Use keys');

OutTextXY(60,220,'LEFT'); OutTextXY(115,220,chr(27));

OutTextXY(60,240,'RIGHT'); OutTextXY(115,240,chr(26));

OutTextXY(60,260,'UP'); OutTextXY(115,260,chr(24));

OutTextXY(60,280,'DOWN'); OutTextXY(115,280,chr(25));

OutTextXY(40,300,'for moving the cursor.');

OutTextXY(40,330,'Use ENTER for check your symbol.');

OutTextXY(60,380, 'PRESS ANY KEY TO START GAME');

end;

{Процедура, выводящая информационное окно по окончании игры}

procedure ExitMenu;

begin setcolor(15); {Надписи и рамка – белого цвета}

SetTextStyle(0,0,1);

OutTextXY(20,330,'If you want to exit, press ''ESCAPE''');

OutTextXY(20,360,'If you want to restart game, press ANY KEY');

line(0,302,450,302); {Рамка}

line(0,302,0,400);

line(0,400,450,400);

line(450,400,450,302);

end;

{Процедура, реализующая квадратный курсор на поле}

procedure rect(x,y,c:integer);

begin

setcolor(c); {Цвет рамки, белый, либо черный (для маскировки)}

rectangle(x,y,x+26,y+26); {Собственно, курсор}

end;

{Процедура, рисующая игровое поле: надпись, рамка и решетка}

procedure Lattice;

begin setcolor(14); {Игровое поле оформлено желтым цветом}

 

line(80,80,80,170); {Решетка, состоящая из 4 линий}

line(110,80,110,170);

line(50,110,140,110);

line(50,140,140,140);

SetTextStyle(0,0,2);

OutTextXY(20,30,'Let''s play!'); {Заглавная надпись}

line(0,0,0,300); {Рамка}

line(223,0,223,300);

line(0,300,223,300);

line(0,0,223,0);

end;

{Процедура, выводящая инструкцию по игре слева от игрового поля}

procedure Manual;

begin setcolor(4); {Все поле с инструкцией красного цвета}

line(225,0,225,300); {Рамка}

line(225,300,450,300);

line(450,0,450,300);

line(225,0,450,0);

SetTextStyle(0,0,2);

OutTextXY(240,30,'How to play'); {Заголовок}

SetTextStyle(0,0,1);

OutTextXY(290,80,'Use keys'); {Инструкция}

OutTextXY(295,105,'LEFT'); OutTextXY(350,110,chr(27));

OutTextXY(295,125,'RIGHT'); OutTextXY(350,130,chr(26));

OutTextXY(295,145,'UP'); OutTextXY(350,150,chr(24));

OutTextXY(295,165,'DOWN'); OutTextXY(350,170,chr(25));

OutTextXY(245,190,'for moving the cursor.');

OutTextXY(290,230,'Use ENTER');

OutTextXY(250,250,'for check your symbol.');

end;

{Процедура вывода в игровом поле символа «Х» или «О»}

procedure Symbol(var x,y:integer;zn:char;clr:shortint);

begin SetColor(clr); {Цвет символа, синий для крестика и зеленый для нолика}

SetTextStyle(0,0,2);

case x of {Выбор координат вывода символа в зависимости от координат курсора}

52: begin case y of

82: OutTextXY(60,90,zn);

112: OutTextXY(60,120,zn);

142: OutTextXY(60,150,zn);

end;

end;

82: begin case y of

82: OutTextXY(90,90,zn);

112: OutTextXY(90,120,zn);

142: OutTextXY(90,150,zn);

end;

end;

112: begin case y of

82: OutTextXY(120,90,zn);

112: OutTextXY(120,120,zn);

142: OutTextXY(120,150,zn);

end;

end;

end;

end;

{Процедура перемещения курсора вверх или вниз при нажатии на соответствующую клавишу}

Procedure UpDown(var x,y: integer);

begin

if ch=#0 then ch:=readkey;

case ch of

#72: begin rect(x,y,0); {Маскировка предыдущего положения курсора}

if y=82 then y:=142 else y:=y-30; {Если курсор в самой верхней ячейке, то при нажатии клавиши «вниз», он переместится на самую нижнюю ячейку того же столбца}

rect(x,y,15); {Курсор на новую позицию}

end;

#80: begin rect(x,y,0); {Маскировка предыдущего положения курсора}

if y=142 then y:=82 else y:=y+30; {Если курсор в самой нижней ячейке, то при нажатии клавиши «вниз», он переместится на самую верхнюю ячейку того же столбца}

rect(x,y,15); {Курсор на новую позицию}

end;

end;

end;

{Процедура перемещения курсора влево-вправо при нажатии соответствующих клавиш}

procedure LeftRight(var x,y:integer);

begin if ch=#0 then ch:=readkey;

case ch of

#75: begin rect(x,y,0); {Маскировка предыдущего положения курсора}

if x=52 then x:=112 else x:=x-30; {Если курсор находится в крайней левой ячейке, то по нажатии «влево», он переместится в самую правую ячейку той же строки}

rect(x,y,15); {Курсор на новой позиции}

end;

#77: begin rect(x,y,0); {Маскировка предыдущего положения курсора}

if x=112 then x:=52 else x:=x+30; {Если курсор на крайней правой ячейке, то при нажатии «вправо» он смещается в крайнюю левую ячейку той же строки}

rect(x,y,15); {курсор на новой позиции}

end;

end;

end;

{ТЕЛО ОСНОВНОЙ ПРОГРАММЫ}

BEGIN

gd:=vga;

gm:=2;

initgraph(gd,gm,''); {Инициализация графики}

repeat StartMenu; {Вызывается процедура стартовой страницы до тех пор, пока не нажата любая клавиша}

until keypressed;

REPEAT {Основной цикл игры. Выход из него – выход из всей программы, при нажатии на ESC}

ClearDevice; {Чистка экрана после стартовой страницы, а также при рестарте}

x0:=52; y0:=82; {начальное положение курсора}

i:=1; {Переменная, по четности-нечетности которой выбирается символ}

for k:=1 to 3 do {Обнуление элементов массива}

for j:=1 to 3 do a[k,j]:=0;

repeat {Игровой кон}

ctrl:=0; {Контроль заполненности массива нулями}

{Выбор символа и цвета в зависимости от четности-нечетности переменной i.}

if (i mod 2 = 1) then begin zn:='X'; n:=1; end {Нечетное – синий крестик}

else begin zn:='O'; n:=2; end; {Четное – зеленый нолик}

Lattice; {Вызов процедуры, рисующей игровое поле}

Manual; {Вызов процедуры с инструкцией к игре}

ch:=readkey; {Получение символа с клавиатуры}

 

if (ord(ch)=72) or (ord(ch)=80) then UpDown(x0,y0); {Нажаты «вверх» или «вниз», вызывается соответствующая процедура}

if (ord(ch)=75) or (ord(ch)=77) then LeftRight(x0,y0); {Нажаты «лево» или «право», вызывается соответствующая функция}

case x0 of {Переход от координат курсора к индексам элементов массива}

52: begin case y0 of

82: begin w:=1; e:=1; end;

112: begin w:=1; e:=2; end;

142: begin w:=1; e:=3; end;

end;

end;

82: begin case y0 of

82: begin w:=2; e:=1; end;

112: begin w:=2; e:=2; end;

142: begin w:=2; e:=3; end;

end;

end;

112: begin case y0 of

82: begin w:=3; e:=1; end;

112: begin w:=3; e:=2; end;

142: begin w:=3; e:=3; end;

end;

end;

end;

if ord(ch)=13 then begin {При нажатии на ENTER в соответствующей ячейке появляется крестик или нолик }

if a[w,e]=0 then

begin a[w,e]:=n;

inc(i); {увеличение i на 1}

symbol(x0,y0,zn,n);

end

else continue;

end;

{Проверка условий победы для игрока с «крестиком»}

if ((a[1,1]=1) and (a[1,2]=1) and (a[1,3]=1)) or

((a[2,1]=1) and (a[2,2]=1) and (a[2,3]=1)) or

((a[3,1]=1) and (a[3,2]=1) and (a[3,3]=1)) or

((a[1,1]=1) and (a[2,1]=1) and (a[3,1]=1)) or

((a[1,2]=1) and (a[2,2]=1) and (a[3,2]=1)) or

((a[1,3]=1) and (a[2,3]=1) and (a[3,3]=1)) or

((a[1,1]=1) and (a[2,2]=1) and (a[3,3]=1)) or

((a[3,1]=1) and (a[2,2]=1) and (a[1,3]=1)) then

begin setcolor(1); {синий цвет}

outtextxy(10,220,'Player X wins'); {Сообщение о победе}

break; {заканчивается цикл игрового кона}

end;

{Проверка условий победы игрока с «ноликом»}

if ((a[1,1]=2) and (a[1,2]=2) and (a[1,3]=2)) or

((a[2,1]=2) and (a[2,2]=2) and (a[2,3]=2)) or

((a[3,1]=2) and (a[3,2]=2) and (a[3,3]=2)) or

((a[1,1]=2) and (a[2,1]=2) and (a[3,1]=2)) or

((a[1,2]=2) and (a[2,2]=2) and (a[3,2]=2)) or

((a[1,3]=2) and (a[2,3]=2) and (a[3,3]=2)) or

((a[1,1]=2) and (a[2,2]=2) and (a[3,3]=2)) or

((a[3,1]=2) and (a[2,2]=2) and (a[1,3]=2)) then

begin setcolor(2); {зеленый цвет}

 

outtextxy(10,220,'Player O wins'); {сообщение о победе}

break; {заканчивается игровой кон}

end;

 

for k:=1 to 3 do {Проверка наличия в массиве нулей}

for j:=1 to 3 do

if a[k,j]=0 then inc(ctrl); {если есть нули, увеличивается ctrl}

if ctrl=0 then {Если же среди элементов массива нет нулей, но никто из игроков не одержал победу, значит «ничья»}

begin setcolor(15); {Сообщение белым цветом}

OutTextXY(20,220,'Drawn game!'); {Сообщение о «ничьей»}

break; {Прекращение цикла игрового кона}

end;

 

until ord(ch)=27; {Игровой кон также может окончиться по нажатию на ESC}

ExitMenu; {Выводится постигровое сообщение}

ch:=readkey; {считывается символ с клавиатуры}

UNTIL ord(ch)=27; {Если нажат ESC, то программа корректно завершится, если любой другой символ – начнется новый игровой кон}

closegraph;

END.

 

 

2.2. Демонстрация работы программы:



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2017-12-07 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: