Автор работы: Пользователь скрыл имя, 10 Февраля 2015 в 12:14, курсовая работа
Разработка игры является очень интересным и захватывающим процессом. Ведь данное искусство заключает в себе и совмещает множество других видов искусств. Так как для создания игры нужно: написать сценарий со связным сюжетом (если это не казуальная аркада), придумать совершенно новый и необычный игровой процесс, подобрать или написать соответствующую музыку, нарисовать красивые графические файлы или же придумать совершенно новое графическое оформление и, в конце концов, написать связывающий все это в единое целое алгоритм и запрограммировать его на определенном языке программирования.
Введение
PASCAL
Модули Pascal, используемые в программе
Модуль Crt
Разработка Программы
Постановка задачи
Алгоритм реализации работы
Алгоритм реализации игровой программы
Процедуры и функции программы
Описание пользовательского интерфейса
Заключение
Литература
Первоначально на экран выводится сообщение «Game paused», это означает что игроку следует снять игру с паузы (клавиша P) перед началом игры.
Каждый четвертый подобранный объект «еда» вызывает очистку игрового поля и создание новых «искусственных препятствий» в случайных точках игрового поля.
С течением времени «игрок» визуально растет и занимает все большее место на игровом поле, тем самым усложняя доступ к «еде» (рис.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
Генерирует «искусственны препятствия» на игровом поле. Алгоритм данной процедуры следующий:
Вызов процедуры перегенерации зерна псевдослучайных чисел.
Определение количества вновь создаваемых препятствий по формуле случайное число от (0 до 7) + сотая часть коэффициента сложности, который определяется текущим количеством набранных очков.
Определение координат создаваемого препятствия случайным образом пока элемент массива игрового поля с индексами вновь подобранных соответствующих координат не будет равен 0 и проверка расстояния между игроком и создаваемым препятствием.
Заполнение элемента массива игрового поля с индексами координаты созданного препятствия единицей, и рисование препятствия на игровом поле как символ #.
Процедура Mor
Заключает в себе всю систему передвижения игрока по игровому полю с проверками на столкновения с препятствиями всех видов и перемещением игрока в противоположный конец игрового поля при пересечении границ. При столкновении игрока с препятствием происходит очистка экрана функцией Clear и в центре экрана печатается с сообщением о проигрыше (со звуковым сопровождением, если оно включено) и результатом и пересортировка таблицы рекордов. В противном случае игра продолжается и определяется следующая координата игрока в зависимости от направления, единицами заполняется массив игрового поля и печатается символ «о» в определяемом положении игрока.
Процедура Scoring
Проверяет положение «игрока» относительно «еды» и если расстояние между ними меньше 1, то удаляет существующую «еду» и прибавляет +1 к счетчику очков (score), +100 к счетчику коэффициента сложности (h) и +1 к счетчику обновления игрового поля (rs). Причем все это сопровождается соответствующим звуком.
Процедура Fset
При отсутствии объекта «еда» на игровом поле создает его в случайной точке игрового поля, проверяя координаты относительно границ поля и сверяясь с матрицей игрового поля, создает «еду» в свободной точке. Причем не исключается возможность создания «еды» в непосредственной близости к игроку или в замкнутом и недоступном игроку месте. Последнее создает дополнительное «правило» игры, которое приучает игрока не создавать замкнутых пространств.
Процедура Pausing
Проверяет состояние переменной pause, которая определяется нажатием клавиши P и в зависимости от состояния снимает или ставит игру на паузу, в то же время выводит в нижнюю часть экрана информацию по управлению и по основным горячим клавишам. Пауза реализована в виде бесконечного цикла, условием выхода из которого является нажатие на клавишу P.
Более подробно смотрите исходный текст программы Приложение 1.
Описание пользовательского интерфейса - поставить игру на паузу или возобновить ее, вывести в низ экрана информацию по горячим клавишам программы.- мгновенный выход из игры, без сохранения результатов., A, S, D - управление направлением игрока, вверх, влево, вниз, вправо соответственно.- включить или выключить звуковое сопровождение (включено по умолчанию)
Заключение
В результате выполнения данной курсовой работы был получен игровой программный продукт, названный «Турбозмей». Было проведено исследование компонентов программной среды Turbo Pascal 7.1, которые использовались при создании игры.
В результате исследования были выявлены следующие недостатки полученного программного продукта:
Отсутствие полноценной графики
Высокая сложность игрового процесса для рядового пользователя
Работоспособность приложения только в среде Windows
Фиксированный размер экрана
Однако, помимо недостатков, есть и достоинства у этого программного продукта:
Небольшой размер исполняемого файла за счет отсутствия графики
Совершенно новый игровой процесс, хоть и основан на классической версии «змейки»
Возрастающая сложность игры
Автоматизированная таблица рекордов
Программный продукт малотребователен к системным ресурсам компьютера. Минимальная конфигурация: процессор - не ниже Pentium, оперативная память - не ниже 16 Mb, операционная система - Windows 95 / 98/ Me / NT / 2000 / XP
В результате учета всех сделанных выше замечаний возможно улучшение созданного программного продукта, на которое потребуется минимум изменений исходного кода программы.
Литература
Эхерн, Люк Создание компьютерных игр М.: ДМК Пресс - Москва, 2001. - 304 c.
Фаронов В.В. Турбо Паскаль 7.0. Начальный курс. Учебное пособие.
М.:Нолидж, 1997. -616с.
Павловская, Т.А. Паскаль. Программирование на языке высокого уровня; СПб: Питер - Москва, 2003. - 393
Приложение 1
Исходный текстtsnake;
uses crt;
Xs=78;
Ys=20;
Dig:set of char = ['0'..'9'];
Let:set of char = ['A'..'Z'];
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;Str2Dec(s:string): real;
val,k:real;
i,ch:longint;
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;;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;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;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;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;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;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;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;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');