В программе широко использовались такие функции как Readkey (), GotoXY, а также циклы и оператор условия.
При тестировании программы был произведен подробный анализ каждой подпрограммы.
При запуске программы появилось главное меню со вкладками "Играть", "Рекорды", "Справка", "Выход" (Рис.8.1).
Рис. 8.1 - Главное меню
Выбираем меню "Рекорды". Перед нами появляется 10 лучших игроков с набранным ими результатом (Рис.8.2).
Рис. 8.2 - Вкладка "Рекорды"
После нажатия любой кнопки мы возвращаемся в главное меню. Выбираем меню "Справка". Перед нами появляется Меню 2-го уровня - "Справка" со вкладками "Правила игры", "Разработчик" и "Назад" (Рис.8.3).
Рис. 8.3 - Меню "Справка"
При выборе вкладки "Правила игры" на экране появляется соответствующая информация (Рис. 8.4).
Рис. 8.4 - Правила игры
После нажатия любой клавиши мы вернулись обратно в меню "Справка". При выборе вкладки "Разработчик", выводится соответствующая информация построчно с некоторой задержкой (Рис. 8.5).
Рис. 8.5 - Информация о разработчике
После нажатия любой клавиши мы вернулись опять же в меню "Справка". После выбора вкладки "Назад" мы возвращаемся в главное меню. Выбираем вкладку "Играть". Появляется меню выбора уровня сложности (Рис.8.6).
Рис. 8.6 - Выбор уровня сложности
После того, как мы выберем уровень, появится игровое поле и после нажатия клавиш управления начнется сам игровой процесс (Рис. 8.7).
Рис.8.7 - Игровой процесс
После того как игрок проиграет (столкнется со границей игрового поля или с "собственным хвостом") появится соответствующее сообщение (Рис.8.8).
Рис.8.8 - Конец игры
Далее, в случае того, если был набран результат выше результата, который занимал 10 место в списке рейтинга, вам предложат ввести своё имя (Рис.8.9).
Рис.8.9 - Ввод имени для сохранения результатов
Ваше имя можно будет увидеть в списке рейтинга при переходе по вкладке "Рекорды" главного меню. Ваше имя будет стоять на соответствующей, занятой вами, позиции (Рис. 8.10).
Рис. 8.10 - Вкладка "Рекорды" (После сохранения нового результата)
Выход из программы осуществляется кнопкой главного меню "Выход".
В ходе выполнения курсовой работы были изучены основы программирования на языке Pascal. Написание программы способствовало закреплению теоретического материала на практике.
Игра "Змейка" является логически завершенной игрой. Также возможны изменения и добавления некоторых моментов в геймплей, такие как мультиплеер и добавление на игровом поле препятствий.
Program Sme;
uses crt;
type
reca=record
name:string[10];
resultat:integer;
end;
var
aa:reca;
Xz,Yz:array [1..40] of byte;
us:array [1..11] of reca;
i,j,a,k,k2,kk,och,z:integer;
H,W,hl,hr,Ww,Wn,PlayE,Play:ShortInt;
X1,Y1,x,y,d:byte;
Kno,onk:Char;
SL,Schot:Word;
Ax,Ay,Bx,By,Ex,Ey,as,sa:Byte;
f1:text;
f2:file of integer;
f3:text;
f4:text;
namen:string[10];
resul:string[20];
prav:string;
q,wq,qq,qw:string[15];
Procedure stolknovenie;
begin
for i:=2 to d-2 do
begin
if (Xz[i]=Xz[i+2]) and (Yz[i]=Yz[i+2]) then
as:=0 else as:=1;
sa:=sa*as;
end;
for i:=1 to d-3 do
begin
if (sa<>0) and (xz[1]=xz[i+3]) and (yz[1]=yz[i+3]) then Play:=0;
end;
if (Xz[1]=3) or (Xz[1]=57) or (Yz[1]=3) or (Yz[1]=22) Then Play:=0;
end;
Procedure Ramka(Xr,Yr:Byte; tt: string; c:byte);
begin
TextColor(c);
GotoXY (Xr,Yr+1);
write (tt);
For i:=Xr to Xr+20 do
begin
GotoXY (i,Yr);
write ('*');
GotoXY (i,Yr+2);
write ('*');
end;
For i:=Yr to Yr+2 do
begin
GotoXY (Xr,i);
write ('*');
GotoXY (Xr+20,i);
write ('*');
end;
end;
Procedure Izm(vv:byte);
Begin
Ax:=Bx; Ay:=By;
Bx:=Xz[vv]; By:=Yz[vv];
Xz[vv]:=Ax; Yz[vv]:=Ay;
End;
Procedure menu2 (q,qq,wq,qw:string);
begin
Clrscr;
TextBackground (0);
TextColor (15);
For X1:=25 to 55 do
Begin
GotoXY (X1,4);
Write ('*');
GotoXY (X1,22);
Write ('*');
end;
For Y1:=4 to 22 do
begin
GotoXY (25,Y1);
Write ('*');
GotoXY (55,Y1);
Write ('*');
end;
GotoXY (31,7);
Write (q);
K2:=0;
repeat
K2:=k2+kk;
kk:=0;
If k2=0 Then Ramka (30,10,qq,128) else
Ramka (30,10,qq,15);
If k2=1 then Ramka (30,14,wq,128) else
Ramka (30,14,wq,15);
IF K2=2 Then Ramka (30,18,qw,128) else
Ramka (30,18,qw,15);
Kno:=ReadKey;
If Kno=#80 then Begin if k2<2 then kk:=1 else kk:=0; end else
if Kno=#72 then Begin if k2>0 then kk:=-1 else kk:=0; end;
until Kno=chr(13);
end;
Procedure Spravka;
begin
menu2(' СПРАВКА',' ПРАВИЛА ИГРЫ ',' РАЗРАБОТЧИК ',' НАЗАД ');
if k2=0 then
begin
clrscr;
assign(f4,'d:\kkk\pravila.pas');
reset(f4);
i:=3;
While not EOF(f4) do
begin
GotoXY(3,i);
i:=i+2;
readln(f4,prav);
writeln(prav);
end;
readln;
end;
if k2=1 then
begin
clrscr;
TextBackground(0);
TextColor (4);
For X1:=3 to 77 do
Begin
GotoXY (x1,2);
Write ('*');
GotoXY (X1,23);
write ('*');
end;
For Y1:=2 to 23 do
Begin
GotoXY (3,Y1);
Write ('*');
GotoXY (77,y1);
Write ('*');
end;
assign(f4,'d:\kkk\avtor.pas');
reset(f4);
d:=7;
While not EOF (f4) do
begin
textcolor(10);
readln(f4,prav);
GotoXY (19,d);
Write (prav);
d:=d+2;
for i:=1 to 4 do
Delay (59000);
end;
close(f4);
readln;
end;
if k2=2 then
TextBackground (0);
textcolor(15);
end;
Procedure Resultat;
begin
clrscr;
reset(f1);
for i:=1 to 10 do
begin
readln(f1,us[i].name);
end;
close(f1);
reset(f2);
for i:=1 to 10 do
read(f2,us[i].resultat);
close(f2);
gotoXy(25,12);
If schot>us[10].resultat then
begin
writeln('Ваш результат составил: ', schot);
gotoxy(30,13);
writeln('Введите ваше имя...');
gotoxy(36,14);
read(namen);
end
else
begin
GotoXY(23,13);
writeln('Вы не побили самый худший результат!!! :(');
GotoXY(13,14);
writeln('Но не огорчайтесь!!! Вы можете просто написать ваше имя!!!)))');
GotoXY(36,15);
readln(namen);
end;
us[11].name:=namen;
us[11].resultat:=schot;
for i:=1 to 11 do
for j:=2 to 11 do
begin
if us[j].resultat>us[j-1].resultat then
begin
aa:=us[j-1];
us[j-1]:=us[j];
us[j]:=aa;
end;
end;
rewrite(f1);
for i:=1 to 10 do
begin
write(f1,us[i].name);
writeln(f1,' ');
end;
close(f1);
rewrite(f2);
for i:=1 to 10 do
write(f2,us[i].resultat);
close(f2);
rewrite(f3);
for i:=1 to 10 do
writeln(f3,i,': ',us[i].resultat,' ',us[i].name);
close(f3);
end;
begin
assign (f3,'d:\kkk\itog.txt');
assign (f1,'d:\kkk\imena.txt');
assign (f2,'d:\kkk\rec.dat');
repeat
repeat
Clrscr;
TextBackground (0);
TextColor (15);
For X1:=25 to 55 do
Begin
GotoXY (X1,4);
Write ('*');
GotoXY (X1,22);
Write ('*');
end;
For Y1:=4 to 22 do
begin
GotoXY (25,Y1);
Write ('*');
GotoXY (55,Y1);
Write ('*');
end;
K:=0;
Repeat
k:=k+kk;
kk:=0;
If k=0 Then Ramka (30,6,' ИГРАТЬ ',128) else
Ramka (30,6,' ИГРАТЬ ',15);
If k=1 Then Ramka (30,10,' РЕКОРДЫ ',128) else
Ramka (30,10,' РЕКОРДЫ ',15);
If k=2 then Ramka (30,14,' СПРАВКА ',128) else
Ramka (30,14,' СПРАВКА ',15);
If k=3 then Ramka (30,18,' ВЫХОД ',128) else
Ramka (30,18,' ВЫХОД ',15);
Kno:=ReadKey;
If Kno=#80 then Begin if k<3 then kk:=1 else kk:=0; end else
if Kno=#72 then Begin if k>0 then kk:=-1 else kk:=0; end;
until Kno=chr(13);
If k=1 then
begin
Clrscr;
GotoXy(36,5);
writeln('РЕКОРДЫ');
reset (f3);
for i:=1 to 10 do
begin
readln(f3,resul);
GotoXY (32,7+i);
Write(resul);
end;
close(f3);
Readln;
end;
If k=2 then
repeat
spravka;
until k2=2;
If k=3 then
exit;
until (k=3) or (k=0);
If k=0 then begin
menu2 (' УРОВЕНЬ СЛОЖНОСТИ',' ГЛИСТ ',' ЗМЕЯ ',' АНАКОНДА ');
end;
If K2=0 then begin Sl:=40000; och:=25; d:=5 end else if k2=1 then begin
Sl:=30000; och:=50; d:=10 end else begin Sl:=20000; och:=100; d:=15 end;
TextBackground (1);
Textcolor (5);
clrscr;
schot:=0; playE:=1;
Xz[1]:=30;
Yz[1]:=13;
For i:=2 to 40 do
begin
Xz[i]:=Xz[1];
Yz[i]:=Yz[1];
end;
For X1:=3 to 57 do
Begin
GotoXY (x1,2);
Write ('*');
GotoXY (X1,23);
write ('*');
end;
For Y1:=2 to 23 do
Begin
GotoXY (3,Y1);
Write ('*');
GotoXY (57,y1);
Write ('*');
end;
Play:=1;
GotoXY(60,4);
write('СЧЕТ: ');
GotoXY(60,6);
write('Рост змеи: ');
gotoXY(60,8);
write('Лучшие результаты:');
reset(f3);
for i:=1 to 3 do
begin
readln(f3,resul);
GotoXY (60,9+i);
Write(resul);
end;
close(f3);
Repeat
If play=1 then begin
TextColor (4);
Ax:=xz[1]; Ay:=Yz[1];
Xz[1]:=Xz[1]+H; Yz[1]:=Yz[1]+W;
Bx:=Xz[2]; By:=Yz[2];
Xz[2]:=Ax; Yz[2]:=Ay;
For i:=3 to 40 do
izm(i);
GotoXY (Xz[1],Yz[1]);
write(chr(1));
For i:=2 to d do
begin
GotoXY (Xz[i],Yz[i]);
Write(chr(4));
end;
Delay(SL);
Textcolor (1);
GotoXY (Xz[1],Yz[1]);
write(chr(1));
For i:=2 to 40 do
begin
GotoXY (Xz[i],Yz[i]);
Write(chr(4));
end;
randomize;
if PlayE=1 then
begin
Ex:=Random(54)+4;
Ey:=random(18)+4;
If (K2=0) and (schot<>0) and ((schot mod 75)=0) then
d:=d+1;
if (k2=0) and (schot<>0) and ((schot mod 150)=0) then
Sl:=Sl-500;
If (K2=1) and (schot<>0) and ((schot mod 150)=0) then
d:=d+1;
if (k2=1) and (schot<>0) and ((schot mod 500)=0) then
Sl:=Sl-500;
If (K2=2) and (schot<>0) and ((schot mod 500)=0) then
d:=d+1;
if (k2=2) and (schot<>0) and ((schot mod 1000)=0) then
Sl:=Sl-500;
PlayE:=0; end;
Textcolor (6);
GotoXY(Ex,Ey);
write(chr(6));
if (Xz[1]=Ex) and (Yz[1]=Ey) then
begin
schot:=schot+och;
PlayE:=1;
Textcolor (1);
GotoXy(Ex,Ey);
write (' ');
end;
Case Kno of
#72: Begin W:=-1; H:=0; end;
#80: Begin W:=1; H:=0; end;
#77: Begin W:=0; H:=1; end;
#75: Begin W:=0; h:=-1; end;
end;
If Keypressed=true then begin onk:=readkey;Kno:=Readkey; end;
end;
GotoXY(66,4);
write(Schot);
GotoXY(70,6);
write(d);
sa:=10;
stolknovenie;
until Play=0;
If play=0 then begin
TextBackground (0);
Textcolor (15);
clrscr;
GotoXY(6,8);
write(' ***** ***** * * ******* ***** ** ** ******* ****** ');
GotoXY(6,9);
write('******* ******* ** ** ******* ******* ** ** ******* *******');
GotoXY(6,10);
write('** ** ** *** *** ** ** ** ** ** ** ** **');
GotoXY(6,11);
write('** ** ** **** **** ** ** ** ** ** ** ** **');
GotoXY(6,12);
write('** ** ** ** *** ** **** ** ** ** ** **** ** **');
GotoXY(6,13);
write('** ** ******* ** * ** **** ** ** ** ** **** ****** ');
GotoXY(6,14);
write('** *** ******* ** ** ** ** ** ** ** ** **** ');
GotoXY(6,15);
write('** ** ** ** ** ** ** ** ** ** ** ** ** ** ');
GotoXY(6,16);
write('******* ** ** ** ** ******* ******* *** ******* ** ** ');
GotoXY(6,17);
write(' ***** ** ** ** ** ******* ***** * ******* ** **');
GotoXY(25,23);
Write('Для продолжения нажмите ENTER');
repeat
kno:=readkey;
until Kno=chr(13);
end;
resultat;
H:=0; w:=0; k:=0; kk:=0;
until k=3; end.