Рефераты. Пасьянс "Три пика"

Функционально самостоятельная часть программы, обладающая собственным именем и набором локальных имен, известна как подпрограмма. Вызов подпрограммы осуществляется по ее имени из любых точек тела программы и любое количество раз. Помимо упрощения текстов программ и избавления от копирования, подпрограммы - это еще средство структурирования программ. Идея в том, что чтобы программа состояла не из огромного числа операторов, а из относительно самостоятельных частей (подпрограмм), каждой из которых назначена отдельно, сравнительно узкая роль. Причем подпрограммы могут включать в себя другие подпрограммы, т. е. допускается вложенность подпрограмм.

Подпрограмма, чтобы ее можно было вызывать в программе, должна быть объявлена в разделе описаний программы. Объявить подпрограмму - значит указать ее заголовок (с используемыми в ней формальными параметрами), описать локальные переменные и, наконец, задать ее тело. В разделе описаний подпрограммы могут быть объявлены новые подпрограммы, которые, в свою очередь, также могут включать подпрограммы. Иными словами, возможно множество уровней вложения подпрограмм.

В языке программирования Turbo Pascal приняты два вида подпрограмм: процедуры и функции, которые мы рассмотрим.

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

Структура процедуры повторяет структуру программы - в ней также есть заголовок, раздел описаний и тело. Начинается процедура с зарезервированного слова PROCEDURE, за которым через пробел следует имя процедуры. Строка заголовка должна обязательно завершаться точкой с запятой. Затем идет раздел описаний процедуры. После раздела описаний процедуры следует ее тело. Тело процедуры содержит последовательность операторов, заключенных в операторные скобки (представляющие собой пару зарезервированных слов BEGIN … END).

1.2.3 Описание функции.

Помимо процедур, в Turbo Pаscal применяются подпрограммы и иного вида - функции (чем отличаются функции от процедур, мы выясним позже). Структура функции (как и процедуры) повторяет структуру программы. Первой идет строка заголовка, которая начинается с зарезервированного слова FUNCTION. За ним через пробел следует имя функции, далее (в скобках) перечень формальных параметров, а затем двоеточие, за которым указывается тип значения, возвращаемого функцией. Завершается строка заголовка точкой с запятой. Сразу под заголовком функции расположен ее раздел описаний. После раздела описаний функции следует ее тело. Тело функции содержит последовательность операторов, заключенных в операторные скобки.

Кстати, в отличие от процедур, активизируемых с помощью оператора вызова (включающего имя процедуры и, может быть, фактические параметры), имя функции должно упоминаться в выражении. У функции (в отличие от процедуры) имеются и другие особенности. Например, в результате использования функции возвращается некоторое значение. Тип возвращаемого значения указывается в описании функции (в заголовке). Если имя используется только для ее вызова, то с именем функции ассоциируется некоторое возвращаемое значение. Чем еще функции отличаются от процедур? Поскольку функция должна возвращать некоторое значение, в ее теле обязательно должен присутствовать оператор присваивания, в правой части которого указано имя функции.

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

1.3 Модули.

1.3.1 Описание модулей.

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

Модуль состоит из заголовка, интерфейсной части, исполнительной части и секции инициализации.

Заголовок модуля похож на заголовок программы, однако вместо слова program ставится зарезервированное слово unit.

Модуль должен находится в файле, имя которого совпадает с именем в заголовке, файл должен иметь расширение .pas.

Интерфейсная часть служит для взаимодействия основной программы с модулем. Она начинается с зарезервированного слова interface. В ней должны быть указаны константы, типы данных, переменные, процедуры и функции, которые может использовать основная программа, вызывающая этот модуль. Если модуль использует еще какие-то модули, то они должны быть указаны в интерфейсной части следующим образом: пишется зарезервированное слово uses, затем перечисляются необходимые модули (заметим, что так же обозначаются и модули в разделе описания основной программы). Цепочка используемых модулей может быть сколь угодно длинной, однако она не может содержать циклы. Например, допустима цепочка:

unit A;

uses B,C;

...

end.

unit B;

uses C,D;

...

end.

А цепочка

unit A;

uses B;

...

end.

unit B;

uses A;

...

end.

недопустима, поскольку она содержит цикл A uses B uses A.

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

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

Иногда при вызове модуля следует произвести некоторые действия, например инициализировать какие-либо переменные, установить какие-либо связи и т.д. Все эти действия указываются в секции инициализации, которая выглядит, как обычное тело программы: между словами begin и end с точкой находятся операторы. Если при вызове модуля никаких подобных действий производить не нужно, то секция инициализации состоит лишь из слова end с точкой.

Чтобы использовать процедуры, функции и другие объекты модуля в основной программе, необходимо написать зарезервированное слово uses, затем имя модуля. После этого объекты модуля можно использовать так, как если бы они были описаны в основной программе.

Рассмотрим теперь модули, которые поставляются в стандартном комплексе Turbo Pascal, но функции и процедуры которых не являются стандартными.

1.3.2 Модуль CRT.

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

Подпрограммы этого модуля позволяют управлять текстовыми режимами экрана, использованием цветов и окнами, яркостью свечения символов, а также расширенными кодами клавиатуры и звуком.

В текстовом режиме весь экран разбивается на строки (их, как правило, 25), а каждая строка - на отдельные позиции (их обычно по 80 в каждой строке) находится в левом верхнем углу экрана.

1.3.2 Модуль DOS.

Здесь собраны процедуры и функции (а также переменные и константы), позволяющие из программ получать доступ к средствам MS DOS и управлять файлами.

1.3.3 Модуль GRAPH.

Содержит множество подпрограмм, а также констант, типов и переменных, предназначенных для управления графическим режимом экрана. Ресурсы модуля позволяют обратится к любому пикселю экрана и управлять его свечением.

Запустить программу, использующую модуль GRAPH, без графического драйвера (одного или нескольких - это файла с расширением .BGI) не удастся. Указанные драйверы не входят в состав модуля, но поставляются с Turbo Pascal (они содержаться в каталоге BGI). А если в программе используются векторные шрифты, в дополнение е драйверам потребуются также файлы шрифтов (файлы с расширением .CHR).

2. Решение задачи.

2.1 Структурная схема программы.

Итак, представим схему программ.

Program xxx;{заголовок необязателен}

Const

раздел описания констант

Label

Раздел описания меток

Type

Раздел описания типов

Var

Раздел описания переменных

Описания подпрограмм

Begin

Тело программы

End.

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

После заголовка на схеме представлены разделы описания констант, типов, меток и переменных. Причем Turbo Pascal не предписывает порядок, в котором должны следовать эти разделы.

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

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

После описания подпрограмм начинается тело программы (или ее раздел операторов). Оно всегда открывается зарезервированным словом BEGIN и завершается словом END (с точкой).

2.2 Условие задачи.

Пасьянс «Три пика» раскладывается 52 картами, 28 карт выкладываются в форме снежных горных пиков одна на другую. Остальные 24 помещаются в колоду.

Задача - очистить вершины от снега, т.е. убрать с «пиков» все карты.

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

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

Нужно стараться найти как можно более длинную цепочку.

Если не можем найти карту, достоинство которой на единицу отличается от верхней открытой, открываем следующую карту из закрытой колоды.

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

Начисление очков. За каждую карту, взятую из колоды, у вас вычитается 5 очков, так же за каждые 10 секунд вычитается по 1 очку. За каждую убранную из пика карту вы получаете на 1 очко больше, чем за предыдущую (счет растет до тех пор, пока не возьмем новую карту из колоды). После взятия новой карты из колоды очки снова начисляются с 1.

Если дошли до вершины пика, т.е. удалили верхнюю карту, то дается дополнительно 13 очков, и за каждый последующий пик на 13 очков больше.

Заключение.

В данной курсовой работе я попытался рассмотреть важный раздел современного программирования - создание компьютерных игр. Были определены основные фазы создания видеоигр. Я реализовал игру пасьянс «Три пика» и тем самым приобрел новые и укрепил старые навыки программирования на языке Turbo Pascal.

Список литературы.

1. Е. И. Емелина Основы программирования на языке Паскаль:М.:«Финансы и статистика»,1997.

2. О. А. Меженный Самоучитель Turbo Pascal:М., СПб., Киев:«Диалектика»,2003.

3. В. И. Грызлов, Т. П. Грызлова Турбо Паскаль 7.0:М.:«ДМК»,1998.

4. В. В. Фаронов Turbo Pascal 7.0:М.:«Нолидж»,1999.

Приложение.

Program ThreePeaks;

Uses EngPeaks,IntPeaks,CRT,DOS;

Procedure Init;

begin

InitCards;

GraphInit;

DrawCards;

DrawColode;

DrawScore;

DrawTime;

ShowMouse;

end;

Procedure CalcTime;{Считаем время}

begin

if GameBegin and ((CurTime-BeginTime)/18.2 >1) then {Считаем время}

begin

inc(seconds);

if (Seconds mod 10)=0 then {каждые 10 секунд -1 очко}

begin

dec(Score);

DrawScore;

end;

BeginTime :=curtime;

DrawTime;

end;

end;

Type

TUserInfo=record

UserName: string[50];

wcnt: word;{Сколько побед}

dcnt: word;{Сколько поpажений}

AllScore: longint;{Всего очков}

end;

Function DefeatOrWin(var UInf: TUserInfo):boolean; {Проверяем проигрыш или выйгрыш}

var

ch: char;

begin

if Defeat or (MoveCount=28) then {Если проиграли или выиграли}

begin

if Defeat then

begin

DrawText('You are lose game');

inc(UInf.dcnt);

UInf.AllScore := UInf.AllScore+Score;

end

else

begin

DrawText('You are win game');

inc(UInf.wcnt);

UInf.AllScore := UInf.AllScore+Score;

end;

repeat

if keypressed then ch:=readkey;

until (ch=#13) or (ch=#27);

if ch=#27 then

begin

DefeatOrWin := true;

exit;

end;

CloseGr;

Init;

end;

DefeatOrWin := false;

end;

Function GetUserName:string;

var

name: string[50];

begin

ClrScr;

write('Enter user name: ');

readln(name);

GetUserName := name;

end;

Procedure SaveToFile(UInfo: TUserInfo);

var

i: longint;

f: file of TUserInfo;

buf: TUserInfo;

begin

i := 0;

assign(f,'peaks.dat');

{$I-}

FileMode := 2;

reset(f);

{$I+}

if IOResult<>0 then

begin

rewrite(f);

write(f,UInfo);

close(f);

exit;

end;

repeat

read(f,buf);

inc(i);

until (i=filesize(f)) or (UInfo.UserName=buf.UserName);

if (UInfo.UserName=buf.UserName) then {Если пользователь уже есть}

begin

buf.wcnt := buf.wcnt + UInfo.wcnt;

buf.dcnt := buf.dcnt + UInfo.dcnt;

buf.allscore := buf.allscore + UInfo.allscore;

seek(f,filepos(f)-1);

write(f,buf);

close(f);

exit;

end;

seek(f,filesize(f));

write(f,UInfo);

close(f);

end;

Procedure DisplayStat;

var

i: longint;

f: file of TUserInfo;

buf: TUserInfo;

begin

assign(f,'peaks.dat');

{$I-}

reset(f);

{$I+}

if IOResult<>0 then exit;

for i:=1 to filesize(f) do

begin

read(f,buf);

with buf do

writeln('Name: ', UserName,' Wins: ',wcnt, ' Defeats: ',dcnt,

' Score: ', AllScore);

if (i mod 23) = 0 then

begin

writeln;

writeln('Press any key to continue...');

readkey;

ClrScr;

end;

end;

close(f);

writeln;

writeln('Press any key to exit...');

readkey;

end;

var

ch: char;

UserInfo: TUserInfo;{Информация об играющем}

begin

ChDir(workdir); {Переходим в каталог откуда запущенна программа}

randomize;

with UserInfo do

begin

UserName := GetUserName;

wcnt :=0;

dcnt :=0;

end;

Init;

repeat {Рабочий цикл программы}

if keypressed then ch:=readkey; {Сканируем нажатия клавиш}

ScanMouse; {Сканируем мышь}

CalcTime;{Считаем время}

until (ch=#27) or DefeatOrWin(UserInfo);

CloseGr;

if (UserInfo.wcnt>0) or (UserInfo.dcnt>0) then

SaveToFile(UserInfo);

DisplayStat;

ClrScr;

writeln('3 Peaks');

writeln('ver. 1.0');

Writeln('(c) 2004 by Denis Kireev')

end. {Конец программы}

Страницы: 1, 2, 3



2012 © Все права защищены
При использовании материалов активная ссылка на источник обязательна.