Автор работы: Пользователь скрыл имя, 06 Мая 2014 в 19:11, курсовая работа
В данной курсовой работе речь пойдет о создании несложной игровой программы «Турбозмей», которая и будет являться объектом исследова-ния.
В первой главе данной курсовой работы рассматриваются язык про-граммирования Pascal и его турбооболочка, в пункте 1.1. приводится аналитический обзор игрового программного обеспечения. В пункте 1.2. приводится описание процедур и функций модуля Crt, используемых при реализации практической части курсовой работы.
Введение 3
PASCAL 5
Модули Pascal, используемые в программе 6
Модуль Crt 6
РАЗРАБОТКА ПРОГРАММЫ 9
Постановка задачи 9
Алгоритм реализации работы 10
Алгоритм реализации игровой программы 10
Процедуры и функции программы 13
Описание пользовательского интерфейса 16
ЗАКЛЮЧЕНИЕ 17
Литература 18
Каждый четвертый подобранный объект «еда» вызывает очистку игрового поля и создание новых «искусственных препятствий» в случайных точках игрового поля.
С течением времени «игрок» визуально растет и занимает все большее место на игровом поле, тем самым усложняя доступ к «еде» (рис.2)
При столкновении игрока с «искусственным препятствием» или со своим «следом» текущий сеанс игры завершается с сообщением «You loosed with score: количество_набранных_очков» Далее выводится точность игрока, запрос имени текущего игрока и предыдущий наилучший результат с именем игрока из таблицы рекордов. (Рис.3)
Функция Str2Dec
Используется для перевода целого числа из строкового представления (string) в числовое представление (real), для удобства последующей обработки. А именно при сравнении результатов из текстового файла таблицы рекордов.
Процедура SortW
Перебирает элементы массива со значениями результатов игроков и сортирует в массиве (методом перестановок) данные результаты в порядке убывания, при этом для сравнения количества набранных очков используется функция Str2Dec. После сортировки результатов записывает их в файл records.txt в формате «место.имя_игрока: результат»
Процедура FindWord
Посимвольно считывает информацию из файла таблицы рекордов records.txt. Это происходит следующим образом: символы считанные до знака точки отбрасываются, далее каждый символ записывается в строковую переменную до достижения знака двоеточия и результат сохраняется в массиве строк (имя игрока) под определенным номером (индексом). После достижения знака двоеточия происходит чтение количества набранных очков до знака перевода строки. Считанное количество очков записывается в другой массив строк, но с тем же индексом, что и имя игрока. В конце работы процедуры в переменную nrec заносится текущее количество результатов, которое требуется при следующей обработке таблицы.
Процедура Rec
Цель работы процедуры – проверка наличия файла с таблицей рекордов records.txt. Далее в зависимости от наличия или отсутствия происходит следующая последовательность действий: если файла нет, то создается новый файл records.txt в той же директории, где находится сам запускаемый файл игры. Если файл с таблицей существует, то начинается его обработка процедурами FindWord и SortW. Таким образом к началу игры программа уже будет иметь данные о предыдущих результатах игрока.
Процедура Clear
Задача процедуры – очистка экрана и игрового поля. Причем очистка происходит не только в том плане, что удаляются все символы с экрана (ClrScr), но и очищается (путем обнуления всех элементов) массив игрового поля, в котором хранится информация о «занятости» определенной позиции экрана произвольным символом. Кроме того данная процедура рисует верхнюю и нижнюю границы игрового поля, путем цикличного печатания символа нижнего подчеркивания до границ экрана.
Процедура Labgen
Генерирует «искусственны препятствия» на игровом поле. Алгоритм данной процедуры следующий:
Процедура Mor
Заключает в себе всю систему передвижения игрока по игровому полю с проверками на столкновения с препятствиями всех видов и перемещением игрока в противоположный конец игрового поля при пересечении границ. При столкновении игрока с препятствием происходит очистка экрана функцией Clear и в центре экрана печатается с сообщением о проигрыше (со звуковым сопровождением, если оно включено) и результатом и пересортировка таблицы рекордов. В противном случае игра продолжается и определяется следующая координата игрока в зависимости от направления, единицами заполняется массив игрового поля и печатается символ «о» в определяемом положении игрока.
Процедура Scoring
Проверяет положение «игрока» относительно «еды» и если расстояние между ними меньше 1, то удаляет существующую «еду» и прибавляет +1 к счетчику очков (score), +100 к счетчику коэффициента сложности (h) и +1 к счетчику обновления игрового поля (rs). Причем все это сопровождается соответствующим звуком.
Процедура Fset
При отсутствии объекта «еда» на игровом поле создает его в случайной точке игрового поля, проверяя координаты относительно границ поля и сверяясь с матрицей игрового поля, создает «еду» в свободной точке. Причем не исключается возможность создания «еды» в непосредственной близости к игроку или в замкнутом и недоступном игроку месте. Последнее создает дополнительное «правило» игры, которое приучает игрока не создавать замкнутых пространств.
Процедура Pausing
Проверяет состояние переменной pause, которая определяется нажатием клавиши P и в зависимости от состояния снимает или ставит игру на паузу, в то же время выводит в нижнюю часть экрана информацию по управлению и по основным горячим клавишам. Пауза реализована в виде бесконечного цикла, условием выхода из которого является нажатие на клавишу P.
Более подробно смотрите исходный текст программы Приложение 1.
P – поставить игру на паузу или возобновить ее, вывести в низ экрана информацию по горячим клавишам программы.
Q – мгновенный выход из игры, без сохранения результатов.
W, A, S, D – управление направлением игрока, вверх, влево, вниз, вправо соответственно.
M – включить или выключить звуковое сопровождение (включено по умолчанию)
В результате выполнения данной курсовой работы был получен игровой программный продукт, названный «Турбозмей». Было проведено исследование компонентов программной среды Turbo Pascal 7.1, которые использовались при создании игры.
В результате исследования были выявлены следующие недостатки полученного программного продукта:
Однако, помимо недостатков, есть и достоинства у этого программного продукта:
В результате учета всех сделанных выше замечаний возможно улучшение созданного программного продукта, на которое потребуется минимум изменений исходного кода программы.
Исходный текст
Program tsnake;
uses crt;
const
Xs=78;
Ys=20;
Dig:set of char = ['0'..'9'];
Let:set of char = ['A'..'Z'];
var
X0,Y0,X,Y,X2,Y2,n,i,k,d,f,h,
xy:array [0..Xs+2, 0..Ys+2] of integer;
recs:text;
c:char;
t:real;
rest,quit,pause,snd:byte;
zn,id:array[0..100] of string;
function Str2Dec(s:string): real;
var
val,k:real;
i,ch:longint;
begin
Str2Dec:=0;ch:=0;
s:='*'+s;
i:=length(s);k:=1;val:=0;
while (s[i]<>'*') and (s[i] in ['0'..'9']) do
begin
ch:=ord(s[i])-ord('0');
val:=(ch*k+val);
k:=k*10;
i:=i-1;
end;
Str2Dec:=val;
end;
procedure SortW;
var tstr:string[10];
i,n:integer;
begin
for i:=2 to nrec do
if Str2Dec(zn[i])>=Str2Dec(zn[i-
tstr:=zn[i-1];zn[i-1]:=zn[i];
tstr:=id[i-1];id[i-1]:=id[i];
end;
rewrite(recs);
for i:=1 to nrec do begin
writeln(recs,i,'.',id[i],': ',Str2Dec(zn[i]):3:0);
end;
close(recs);
end;
procedure FindWord;
var
tstr:string[10];
ch:char;
ex:byte;
begin
i:=1;
while not Eof(recs) do begin
while not Eoln(recs) do begin
ch:='0';ex:=0;
id[i]:='';zn[i]:='';
while (ch in Dig+Let) or (ch='.') or (ch=' ')do begin
read(recs,ch);
ch:=upcase(ch);
if (ch in Dig+Let) or (ch='.') or (ch=' ') then id[i]:=id[i]+ch;
Delete(id[i],1,Pos('.',id[i]))
end;
if (ch=' ') then read(recs,ch);
if ch=':' then begin
while not(Eoln(recs)) do begin
read(recs,ch);
zn[i]:=zn[i]+ch;
end;
i:=i+1;
end;
end;
readln(recs);
end;
nrec:=i-1;
end;
procedure Rec;{score record}
begin
assign(recs,'records.txt');
{$I-}
reset(recs);{}
{$I+}
if (IOresult <> 0) then begin
rewrite(recs);
writeln(recs,'1.SZ: 80');
writeln(recs,'1.SZ: 80');
close(recs);
end
else
Findword;
SortW;
end;
procedure Clear;
begin
ClrScr;
for n:=0 to Xs do begin
gotoXY(n+1,Ys+1);textcolor(3);
gotoXY(n+1,1);write('_');
for i:=0 to Ys do
xy[n,i]:=0;
end;
end;
procedure Labgen;
var
N:0..100;
I,wx,wy:integer;
begin
randomize; N:=random(7)+h div 100;
for I:=1 to N do begin
repeat
wx:=random(Xs-8)+2;
wy:=random(Ys-5)+2;
until (xy[wx,wy]=0) and (sqrt((X-wx)*(X-wx)+(Y-wy)*(Y-
xy[wx,wy]:=1;
gotoXY(wx,wy);
textcolor(3);
write('#');
end;
end;
procedure Mor;{move or restart}
begin
if xy[X,Y]=1
then begin
rest:=1;
if snd=1 then begin
sound(700);
delay(40000);
sound(400);
delay(30000);
sound(380);
delay(30000);
nosound;
end;
Clear;
GotoXY((Xs div 2)-10,Ys div 2);
textcolor(3);
writeln(' You loosed with score: ',score:3);
GotoXY(Xs div 2-9,(Ys div 2)+2);
writeln(' Accuracy: ',score/t*0.1:4:3,' ');
GotoXY(Xs div 2-9,(Ys div 2)+5);
write(' Highscore: ',zn[1],' - ',id[1]);
nrec:=nrec+1;
str(round(score+score/t*0.1),
GotoXY(Xs div 2-7,(Ys div 2)+4);write('Name: ');
readln(id[nrec]);
SortW;
end;
xy[X,Y]:=1;{array filling}
case d of
0: Y:=Y-1;
1: X:=X+1;
2: Y:=Y+1;
3: X:=X-1;
end;
X0:=X;Y0:=Y;
if X>Xs then X:=1;
if X<1 then X:=Xs;
if Y>Ys then Y:=2;
if Y<2 then Y:=Ys;
GotoXY(X,Y); TextColor(2);
writeln('o');{Snake drawing}
end;
procedure Scoring;
begin
{Eating and Scoring}
if sqrt((X-X2)*(X-X2)+(Y-Y2)*(Y-
GotoXY(X2,Y2); writeln(' ');
GotoXY(X2-1,Y2);writeln(' ');
GotoXY(X2,Y2-1);writeln(' ');
GotoXY(X2,Y2+1);writeln(' ');
xy[X0,Y0]:=0;
textcolor(7);
GotoXY(X0,Y0);writeln('o');
f:=0; score:=score+1;h:=h+100; rs:=rs+1;
if snd=1 then begin
sound(600);
delay(10000);
sound(900);
delay(10000);
nosound;
end;
end;
end;
procedure Fset;
begin
{Food setting}
if f=0 then begin
repeat
X2:=random(Xs-8)+2;
Y2:=random(Ys-8)+4;
until xy[X2,Y2]=0;
GotoXY(X2,Y2); TextColor(7); writeln('xx'); f:=1;
GotoXY(X2-1,Y2);writeln('x');
GotoXY(X2,Y2-1);writeln('x');
GotoXY(X2,Y2+1);writeln('x');
end; {Food draw}
end;
procedure Pausing;
begin
{Pause}
if pause=1 then
repeat
textcolor(7);
GotoXY(Xs div 2,Ys+3);
writeln('Game Paused');
GotoXY(1,Ys+4);
writeln(' Help: P - start/pause; Q - quit; W,A,S,D - moving;M - mute;');
c:=readkey;c:=upcase(c);
if c='Q' then pause:=0;
if c='M' then if snd=0 then snd:=1 else snd:=0;
{UnPause}
if c='P' then begin
pause:=0;
gotoXY(1,Ys+3); ClrEol;
gotoXY(1,Ys+4); ClrEol;
gotoXY(Xs div 2,Ys+3); write('Score: ',score:3);
end;
until (pause=0);
end;
begin
Rec;{record read}
quit:=0;
snd:=1;
while quit=0 do begin
randomize;t:=0;rest:=0;
Clear;
X:=30+random(10);
Y:=5+random(10);
d:=1; f:=0; {Direction=1 and no food}
score:=0;
h:=0;
Labgen;
rs:=1; {restart screen}
pause:=1;
repeat {until restart}
repeat {until keypress}
randomize;
gotoXY(Xs div 2,Ys+3); write('Score: ',score:3);
t:=t+0.001;
if rs >= 5 then begin
Clear;
rs:=1;
Labgen;
end;
Mor;
Fset;
Scoring;
Pausing;
if h<30000 then delay(30000-h); {Speed of game}
until (keypressed) or (rest=1);
c:=readkey; c:=upcase(c);
case c of
'W': if d<>2 then d:=0;
'D': if d<>3 then d:=1;
'S': if d<>0 then d:=2;
'A': if d<>1 then d:=3;
'P': pause:=1;
'Q': quit:=1;
'M': if snd=0 then snd:=1 else snd:=0;
end;
until (rest=1) or (quit=1);
for n:=1 to nrec do
Rec;{Recordsfix}
end;{Quit from game}
end.
Блок схема