Смекни!
smekni.com

Разработка игровой программы на языке программирования Turbo Pascal (стр. 2 из 4)

3. Управление режимами работы программы

Игра осуществляется с помощью меню.

4. Входные данные

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

5. Выходные данные

Сообщение о победе после каждого пройденного уровня «Level complete», о проигрыше «Game over», либо сообщения, сопровождающие успешные или неуспешные действия игрока «Looser» - неудача, «2 hit combo» - при уничтожение сразу двух врагов, «Ough! 4 mans at once» - при уничтожении сразу четырех врагов, «Aaaaaaaaamazing!!!» -при уничтожении более четырех врагов.

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

6.Ошибки

При инициализации программы предусмотрена выдача сообщений при отсутствии VGA совместимого видеоадаптера, ошибки инициализации графического режима.

3. СТРУКТУРНАЯ ДИАГРАММА


Refrace
SiegeSpr

3.1 Описание назначения модулей.

S i e g e – основная программа, вызывающая на выполнение программные модули.

Модуль S i e g e S p r - модуль, содержащий игровые объекты (картинки).

Модуль V G A S p r – модуль для рисования спрайтов.

Модуль L o g o s c r e e n –заставка курсовой работы.

Модуль S i e g e L o g o – модуль, содержащий меню, инструкцию, предысторию.

Модуль B u t t o n s – модуль, позволяющий осуществлять нажатие и отпускание клавиши, информацию о состоянии клавиш в реальном времени и об отпущенных клавишах.

Модуль R e t r a c e – модуль,позволяющий осуществлять синхронизацию вывода в видеопамять.

Модуль V G A 1 3 H - модуль для работы с графикой.

ЗАКЛЮЧЕНИЕ

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

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

СПИСОК ИСПОЛЬЗУЕМОЙ ЛИТЕРАТУРЫ

1. Игнатьева А.И. Компьютерные игры. (с. 3-10, 31-35) М. 1988.

2. Домашний компьютер - №4(с. 62-68),1999

3. Домашний компьютер - №12(с. 78-88),1999

4. Инфо–№2: Компьютерные игры в обучение (с.61-65) /Под ред. Марнуми Е., Когов Ю. 1990.

5. Лукашенко М.А. «Информатика в играх и задачах» (с.1-5) //Нач.шк. /Приложение к газете «1 сентября» - 1994, №44

6. Инфо-№4: Компьютерная игра: учим или играем (64-67) /Под ред.

Марусева И.В. 1997.

7. Коубс Р. и Влейминк И. Интерфейс (36-40) 1991.

8. Ла Мот А. Секреты программирования игр (7-10) 1995.

9. Фридланд А.Я. Информатика. Толковый словарь основных терминов. (57-62) М. 1998.

10. 350 игр для IBM PC, Дж. Дворак, «Пергамент» - Санкт -Петербург, 1994 .

11. Turbo Pascal 7. 0, Фаронов В.В. /Изд. «Нолидж», 1999.

ПРИЛОЖЕНИЕ:

Program Siege;

Uses LogoScreen,

DOS, VGA13h, VGASpr, Retrace, Buttons,

SiegeLogo, SiegeS

pr;

Type

EnemyType = record

X,Y,D,S,A:Integer;

Falling:Boolean;

Free:Boolean;

end;

Const

MaxEnemies = 50;

ComboStr:Array [0..5] of String[20] =

('Looser!!!',

'',

'2 hit combo',

'Eat this!',

'Ough! 4 mans at once',

'Aaaaaaaaamazing!!!');

Var

ManX,StoneY,StoneX,EnemyDelay,EnemyLimit:Integer;

Enemies:Array [1..MaxEnemies] of EnemyType;

Score,Level,Kills,Combo:Word;

Timer:Longint;

GameOver:Boolean;

{==================================================================}

Const

ca:Word = 0;

cc:String[20] = '';

Procedure ComboString(s:String);

begin

if s<>'' then

begin

cc:=s;

ca:=10;

end;

if ca>0 then

begin

DrawString(Base2,160-Byte(cc[0])*4,90,cc);

Dec(ca);

end;

end;

Procedure NextLevel; forward;

{==================================================================}

Procedure InitEnemies;

Var

i:Byte;

begin

for i:=1 to MaxEnemies do Enemies[i].Free:=true;

end;

Procedure DrawEnemies;

Var

i:Byte;

begin

for i:=1 to MaxEnemies do

With Enemies[i] do if not Free then

DrawTSpr(Base2,X,Y,EnemyHgt,EnemyWdt,@EnemySpr[A]);

end;

Procedure MoveEnemies;

Var

i:Byte;

begin

for i:=1 to MaxEnemies do

With Enemies[i] do

if not Free then

begin

if Falling then

begin

Y:=Y+10;

if Y>199 then

begin

Free:=true;

if Kills=(Level+1)*20 then NextLevel;

end;

if D=0 then

begin

Inc(A);

if A>2 then A:=1;

D:=2;

end else Dec(D);

end else

if D=0 then

begin

Y:=Y-5;

if Y<40 then GameOver:=true;

Inc(A);

if A>2 then A:=1;

D:=S;

end else Dec(D);

end else

if (EnemyLimit>0) and (EnemyDelay=0) then

begin

X:=Random(38)*8;

Y:=200;

D:=0;

S:=(10-Level);

A:=1;

EnemyDelay:=(13-Level)*2+1;

Falling:=false;

Free:=false;

Dec(EnemyLimit);

end;

Dec(EnemyDelay);

end;

{==================================================================}

Procedure DrawScreen;

Var

x,y:Integer;

s:String[80];

tmp:String[6];

begin

Bar(Base2,0,0,319,9,8);

FillBase(Base2,3200,9600,$03030303);

for y:=0 to 15 do

for x:=0 to 31 do

DrawOSpr(Base2,x*10,40+y*10,BrickHgt,BrickWdt,@BrickSpr);

s:='ю ~SIEGE~ ю Level:';

Str(Level,tmp);

While Byte(tmp[0])<2 do tmp:='ъ'+tmp;

s:=s+tmp+' ю Score:';

Str(Score,tmp);

While Byte(tmp[0])<5 do tmp:='ъ'+tmp;

s:=s+tmp+' ю';

DrawString(Base2,1,1,s);

end;

{==================================================================}

Procedure DrawMan;

begin

if StoneY=0 then

begin

DrawTSpr(Base2,ManX*8,20,ManHgt,ManWdt,@ManSpr[2]);

DrawTSpr(Base2,ManX*8+4,17,StoneHgt,StoneWdt,@StoneSpr);

end else

begin

DrawTSpr(Base2,ManX*8,20,ManHgt,ManWdt,@ManSpr[1]);

DrawTSpr(Base2,StoneX,StoneY,StoneHgt,StoneWdt,@StoneSpr);

Inc(StoneY,10);

if StoneY>199 then

begin

StoneY:=0;

if Combo<7 then ComboString(ComboStr[Combo]) else ComboString('Kiiler!!!');

Combo:=0;

end;

end;

end;

{==================================================================}

Procedure CheckCollisions;

Var

i:Byte;

begin

if StoneY>0 then

for i:=1 to MaxEnemies do

With Enemies[i] do

if not Free and not Falling then

begin

if ((StoneX+8>X) and (StoneX<X+EnemyWdt)) and

((StoneY+8>Y) and (StoneY<Y+EnemyHgt)) then

begin

Falling:=true;

D:=0;

Inc(Score);

Inc(Kills);

Inc(Combo);

end;

end;

end;

{==================================================================}

Procedure NextLevel;

Var

i:Byte;

begin

Timer:=MemL[Seg0040:$006C];

Inc(Level);

for i:=1 to 30 do

begin

ClearBase(Base2);

DrawScreen;

DrawTSpr(Base2,ManX*8,20,ManHgt,ManWdt,@ManSpr[1+Byte(i and 1=1)]);

DrawString(Base2,132,80,'Level '+Char($30+Level));

WaitRetraceMode;

CopyBase(Base2,Base1);

While Timer=MemL[Seg0040:$006C] do;

Timer:=MemL[Seg0040:$006C];

end;

EnemyLimit:=(1+Level)*20;

EnemyDelay:=0;

Kills:=0;

ca:=0;

end;

Procedure GameOverProc;

Var

i:Byte;

begin

ClearBase(Base2);

DrawScreen;

DrawString(Base2,124,80,'Game Over');

WaitRetraceMode;

CopyBase(Base2,Base1);

Timer:=MemL[Seg0040:$006C];

for i:=1 to 30 do

begin

While Timer=MemL[Seg0040:$006C] do;

Timer:=MemL[Seg0040:$006C];

end;

end;

{==================================================================}

Procedure Init;

begin

if not DetectVGA then

begin

Writeln('Необходим VGA совместимый видеоадаптер.'#7);

Halt(1);

end;

SetGraphMode;

InitButtons;

Randomize;

ManX:=19;

Timer:=MemL[Seg0040:$006C];

EnemyLimit:=(Level+1)*20;

GetIntVec($43, Pointer(Font));

end;

Procedure Game;

begin

InitEnemies;

Level:=0;

Score:=0;

Kills:=0;

Combo:=0;

EnemyLimit:=(Level+1)*20;

GameOver:=false;

Repeat

ClearBase(Base2);

DrawScreen;

DrawEnemies;

DrawMan;

ComboString('');

MoveEnemies;

CheckCollisions;

if Key[keyLeft] then if ManX>0 then Dec(ManX);

if Key[keyRight] then if ManX<38 then Inc(ManX);

if Key[keySpace] then if StoneY=0 then

begin

StoneX:=(ManX*8)+4;

StoneY:=24;

end;

WaitRetraceMode;

CopyBase(Base2,Base1);

While Timer=MemL[Seg0040:$006C] do;

Timer:=MemL[Seg0040:$006C];

Until Key[keyEsc] or (Level>=10) or GameOver;

if GameOver then GameOverProc;

end;

Procedure Done;

begin

DoneButtons;

SetTextMode;

DoneVirtualPage;

end;

{==================================================================}

Var

choice:Byte;

begin

Init;

Repeat

choice:=Logo;

Case choice of

1:Game;

2:Info;

3:Story;

end;

Until choice=4;

Done;

end.

UNIT Buttons;

INTERFACE

Uses DOS;

Const

keyESC = 1;

keyF1 = 59;

keyF2 = 60;

keyF3 = 61;

keyF4 = 62;

keyF5 = 63;

keyF6 = 64;

keyF7 = 65;

keyF8 = 66;

keyF9 = 67;

keyF10 = 68;

keyF11 = 87;

keyF12 = 88;

keyScrollLock = 70;

keyTilde = 41;

key1 = 2;

key2 = 3;

key3 = 4;

key4 = 5;

key5 = 6;

key6 = 7;

key7 = 8;

key8 = 9;

key9 = 10;

key0 = 11;

keyUnderline = 12;

keyEquality = 13;

keyBackspace = 14;

keyTab = 15;

keyQ = 16;

keyW = 17;

keyE = 18;

keyR = 19;

keyT = 20;

keyY = 21;

keyU = 22;

keyI = 23;

keyO = 24;

keyP = 25;

keyIndex = 26;

keyBackIndex = 27;

keyEnter = 28;

keyCapsLock = 58;

keyA = 30;

keyS = 31;

keyD = 32;

keyF = 33;

keyG = 34;

keyH = 35;

keyJ = 36;

keyK = 37;

keyL = 38;

keyDoublePeriod = 39;

keyApostroph = 40;

keyLShift = 42;

keyBackSlash = 43;

keyZ = 44;

keyX = 45;

keyC = 46;

keyV = 47;

keyB = 48;

keyN = 49;

keyM = 50;

keyComma = 51;

keyPeriod = 52;

keySlash = 53;

keyRShift = 54;

keyCtrl = 29;

keyAlt = 56;

keySpace = 57;

keyNumLock = 69;

keyMultiply = 55;

keyMinus = 74;

keyPlus = 78;

keyDelete = 83;

keyHome = 71;

keyUp = 72;

keyPgUp = 73;