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;