Создание игры в среде Turbo Pascal

Автор работы: Пользователь скрыл имя, 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

Вложенные файлы: 1 файл

Курсовая ЗП.doc

— 171.00 Кб (Скачать файл)

Каждый четвертый подобранный объект «еда» вызывает очистку игрового поля и создание новых «искусственных препятствий» в случайных точках игрового поля.

С течением времени «игрок» визуально растет и занимает все большее место на игровом поле, тем самым усложняя доступ к «еде» (рис.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

Генерирует «искусственны препятствия» на игровом поле. Алгоритм данной процедуры следующий:

    1. Вызов процедуры перегенерации зерна псевдослучайных чисел.
    2. Определение количества вновь создаваемых препятствий по формуле случайное число от (0 до 7) + сотая часть коэффициента сложности, который определяется текущим количеством набранных очков.
    3. Определение координат создаваемого препятствия случайным образом пока элемент массива игрового поля с индексами вновь подобранных соответствующих координат не будет равен 0 и проверка расстояния между игроком и создаваемым препятствием.
    4. Заполнение элемента массива игрового поля с индексами координаты созданного препятствия единицей, и рисование препятствия на игровом поле как символ #.

Процедура 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, которые использовались при создании игры.

В результате исследования были выявлены следующие недостатки полученного программного продукта:

  1. Отсутствие полноценной графики
  2. Высокая сложность игрового процесса для рядового пользователя
  3. Работоспособность приложения только в среде Windows
  4. Фиксированный размер экрана

Однако, помимо недостатков, есть и достоинства у этого программного продукта:

  1. Небольшой размер исполняемого файла за счет отсутствия графики
  2. Совершенно новый игровой процесс, хоть и основан на классической версии «змейки»
  3. Возрастающая сложность игры
  4. Автоматизированная таблица рекордов
  5. Программный продукт малотребователен к системным ресурсам компьютера. Минимальная конфигурация: процессор – не ниже Pentium, оперативная память – не ниже 16 Mb, операционная система – Windows 95 / 98/ Me / NT / 2000 / XP

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

 

Литература

    1. Эхерн, Люк Создание компьютерных игр М.: ДМК Пресс - Москва, 2001. - 304 c.
    2. Фаронов В.В. Турбо Паскаль 7.0. Начальный курс. Учебное пособие.
    3. М.:Нолидж, 1997. -616с. 
    4. Павловская, Т.А. Паскаль. Программирование на языке высокого уровня; СПб: Питер - Москва, 2003. - 393 

 

Приложение 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,score,nrec,rs:integer;

  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-1]) then begin

        tstr:=zn[i-1];zn[i-1]:=zn[i];zn[i]:=tstr;

        tstr:=id[i-1];id[i-1]:=id[i];id[i]:=tstr;

      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);write('_');

      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-wy))>=3);

      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),zn[nrec]);

      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-Y2))<=1 then begin

      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. 

Приложение 2

Блок схема


 




 

 



 

 

 

 

 


 


 



Информация о работе Создание игры в среде Turbo Pascal