5. Выходные данные
Сообщение о победе после каждого пройденного уровня «Level complete», о проигрыше «Game over», либо сообщения, сопровождающие успешные или неуспешные действия игрока «Looser» - неудача, «2 hit combo» - при уничтожение сразу двух врагов, «Ough! 4 mans at once» - при уничтожении сразу четырех врагов, «Aaaaaaaaamazing!!!» -при уничтожении более четырех врагов.
Выходными данными, связанными с графикой, являются изменение положения человечка и врагов на экране монитора, а так же количество набранных очков игроком в этой игре, номер уровня.
6.Ошибки
При инициализации программы предусмотрена выдача сообщений при отсутствии VGA совместимого видеоадаптера, ошибки инициализации графического режима.
3. СТРУКТУРНАЯ ДИАГРАММА
|
|
|
| ||||||||
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;
keyLeft = 75;
keyFive = 76;
keyRight = 77;
keyEnd = 79;
keyDown = 80;
keyPgDn = 81;
keyInsert = 82;
KeyPressed:Boolean = FALSE;
Var
Key :Array [1..128] of Boolean;
WasPressed:Array [1..128] of Boolean;
Const
CheckWarmReboot:Boolean = TRUE;
WarmRebootFlag :Boolean = FALSE;
Procedure InitButtons;
Procedure DoneButtons;
Function ButtonsInited:Boolean;
Function IsKeypressed:Boolean;
Function Pressed(Index:Byte):Boolean;
Procedure ClearKeys;
IMPLEMENTATION
Const
Init:Boolean=FALSE;
Var
OldKbdHandler:Pointer;
Procedure Int9; INTERRUPT;
Var
ScanCode,Tmp:Byte;
begin
ScanCode:=Port[$60];
if ScanCode and 128=0 then
begin
Key[ScanCode]:=TRUE;
KeyPressed:=TRUE;
end else
begin
ScanCode:=ScanCode xor 128;
Key[ScanCode]:=FALSE;
WasPressed[ScanCode]:=TRUE;
KeyPressed:=FALSE;
end;
if CheckWarmReboot and (ScanCode=keyDelete) then
begin
Tmp:=Mem[Seg0040:$0017];
if Tmp and 12=12 then
begin
Tmp:=Tmp xor 21;
WarmRebootFlag:=TRUE;
end;
Mem[Seg0040:$0017]:=Tmp;
end;
asm
in al,61h
or al,82h
out 61h,al
and al,7Fh
out 61h,al
mov al,20h
out 20h,al
end;
end;
Procedure InitButtons;
begin
if not Init then
begin
GetIntVec($9,OldKbdHandler);
SetIntVec($9,@Int9);
FillChar(Key,SizeOf(Key),FALSE);
FillChar(WasPressed,SizeOf(WasPressed),FALSE);
CheckWarmReboot:=TRUE;
WarmRebootFlag:=FALSE;
Init:=TRUE;
end;
end;
Procedure DoneButtons;
begin
if Init then
begin
SetIntVec($9,OldKbdHandler);
WarmRebootFlag:=FALSE;
Init:=FALSE;
end;
end;
Function ButtonsInited;
begin
ButtonsInited:=Init;
end;
Function IsKeypressed;
Var
i:Byte;
f:Boolean;
begin
f:=false;
i:=1;
While (i<=128) and not f do
begin
f:=Key[i];
Inc(i);
end;
IsKeypressed:=f;
end;
Function Pressed;
begin
if WasPressed[Index] then
begin
WasPressed[Index]:=FALSE;
Pressed:=TRUE;
end else Pressed:=FALSE;
end;
Procedure ClearKeys;
begin
FillChar(Key,SizeOf(Key),false);
FillChar(WasPressed,SizeOf(WasPressed),false);
end;
END.
UNIT LogoScreen;
INTERFACE
IMPLEMENTATION
uses graph,crt;
const
a = 'Vera & Yulya presents';
b = ' science game';
d = ' for kids';
e = 'Magnitogorsk - 2001';
t = 'Siege';
var driver,mode,x1,x,y,
color:integer;i,j:word;
x2,y2,o:array[1..500] of integer; g,n:integer;
label 1;
begin
detectgraph(driver,mode);
initgraph(driver,mode,'c:\');
if graphresult<>0 then write('Ошибка!')
else for g:=1 to 500 do
begin
n:=random(18);
case n of
1: o[g]:=1;
2: o[g]:=3;
3: o[g]:=4;
4: o[g]:=5;
5: o[g]:=9;
6: o[g]:=11;
7: o[g]:=12;
8: o[g]:=13;
9: o[g]:=14;
10: o[g]:=15
end;
x2[g]:=random(640);
y2[g]:=random(480);
putpixel(x2[g],y2[g],o[g])
end;
setcolor(9);
begin
j:=getmaxx-250;
i:=1;
settextstyle(7,0,4);
while i<=getmaxx-length(a)-400 do
begin
setcolor(black);
outtextxy(i-length(a)-2,10,a);
outtextxy(j+2,50,b);
outtextxy(j+2,90,d);
setcolor(1+random(14));
outtextxy(i-length(a),10,a);
outtextxy(j,50,b);
outtextxy(j,90,d);
j:=j-2;
i:=i+2;
if keypressed then goto 1;
end;
color:=getcolor;
settextstyle(4,0,1);
for i:=1 to 10 do
begin
setcolor(black);
outtextxy(230,getmaxy-20-i+1,e);
delay(100);
setcolor(color);
outtextxy(230,getmaxy-20-i,e);
end;
settextstyle(4,0,15);
setviewport(1,1,639,479,false);
repeat
for i:=15 downto 1 do
begin
if(i=1)or(i=5)then continue;
setcolor(i);
outtextxy((GetMaxX div 2)-(TextWidth(t) div 2),180,t);
delay(100);
end;
for i:=1 to 15 do
begin
if(i=1)or(i=5)then continue;
setcolor(i);
outtextxy((GetMaxX div 2)-(TextWidth(t) div 2),180,t);
delay(100);
end;
until keypressed;
1:
setcolor(black);
setfillstyle(1,1);
SetBkcolor(1);
setviewport(1,1,639,479,true);
for i:=1 to 90 do
begin
sector(getmaxx div 2,getmaxy div 2,0,i,400,400);
sector(getmaxx div 2,getmaxy div 2,90,90+i,400,400);
sector(getmaxx div 2,getmaxy div 2,180,180+i,400,400);
sector(getmaxx div 2,getmaxy div 2,270,270+i,400,400);
end;
setcolor(Magenta);
settextstyle(7,0,8);
outtextxy((getmaxx div 2)-(TextWidth('Good luck!!!') div 2),
(getmaxy div 2)-180,'Good luck!!!');
Delay(1000);
closegraph;
end;
END.
UNIT Retrace;
INTERFACE
Procedure WaitRetraceMode;
IMPLEMENTATION
Procedure WaitRetraceMode;
begin
While Port[$3DA] and 8<>0 do;
end;
END.
UNIT SiegeLogo;
INTERFACE
Uses Buttons, VGA13h;
Type
PFont = ^TFont;
TFont = Array [0..255,0..7] of Byte;
Var
Font:PFont;
Procedure DrawString(Base:Word;xp,yp:Integer;Const s:String); Function Logo:Byte;
Procedure Info;
Procedure Story;
IMPLEMENTATION
Procedure DrawString;
Var
x,y,l,t:Byte;
begin
if Byte(s[0])>0 then
begin
for l:=1 to Byte(s[0]) do
begin
for y:=0 to 7 do
begin
t:=Font^[Byte(s[l])][y];
for x:=0 to 7 do
begin
if t and 128=128 then PutPixel(Base,xp+x,yp+y,15);
t:=t shl 1;
end;
end;
xp:=xp+8;
end;
end;
end;
Function Logo;
Var
Res,Old:Byte;
begin
ClearKeys;
Old:=0;
Res:=1;
ClearBase(Base1);
DrawString(Base1,30,60,'Play the game');
DrawString(Base1,30,70,'Instructions');
DrawString(Base1,30,80,'Story');
DrawString(Base1,30,90,'Exit to DOS');
Repeat
if Old<>Res then
begin
Bar(Base1,20,60,28,100,0);
DrawString(Base1,20,60+(Res-1)*10,'>');
Old:=Res;
end;
if Pressed(keyUp) then
begin
Res:=Res-1;
if Res<1 then Res:=4;
end;
if Pressed(keyDown) then
begin
Res:=Res+1;
if Res>4 then Res:=1;
end;
Until Key[keyEnter];
Logo:=Res;
end;
Procedure Center(y:Integer;Const s:String);
begin
DrawString(Base1,160-(Length(s)*8 div 2),y,s);
end;
Procedure Info;
begin
ClearBase(Base1);
Center(2,'Instructions');
Center(20,'Arrows - moving Hero');
Center(30,'Space - throw stone');
Center(40,'Esc - exit the game');
Center(190,'Press any key');
ClearKeys;
Repeat Until IsKeypressed;
end;
Procedure Story;
begin
ClearBase(Base1);
Center(2,'Предыстория');
DrawString(Base1,1,20,'Много лет назад на Землю упал метеорит.');
DrawString(Base1,1,30,'При исследовании в лаборатории ученые ');
DrawString(Base1,1,40,'обнаружили в нем биологическое вещес- ');
DrawString(Base1,1,50,'тво внеземного происхождения. Поняв всю');
DrawString(Base1,1,60,'опасность этого вируса, они попытались ');
DrawString(Base1,1,70,'нейтрализовать его.Но вирус стал быстро');
DrawString(Base1,1,80,'распространяться и заразил всех участни ');
DrawString(Base1,1,90,'ков исследования. Выйдя за стены лабора-');
DrawString(Base1,1,100,' тории он стал зарожать людей.Зараженные');
DrawString(Base1,1,110,'вирусом внешне не отличались от обычных');
DrawString(Base1,1,120,'людей, но подчинялись внеземному разуму.');
DrawString(Base1,1,130,'Их задачей было:уничтожить оставшееся ');
DrawString(Base1,1,140,'население.Тогда люди стали объединять- ');
DrawString(Base1,1,150,'ся,чтобы защитить себя. Они устроили ');
DrawString(Base1,1,160,'засаду в крепости. Но агрессивных "лик-');
DrawString(Base1,1,170,'видаторов ничто не могло остановить.....');
ClearKeys;
Repeat Until IsKeypressed;
end;
END.
UNIT SiegeSpr;
INTERFACE
Const
BrickHgt = 10;
BrickWdt = 10;
BrickSpr:Array [1..BrickHgt,1..BrickWdt] of Byte =
((7,7,7,7,7,7,7,7,7,7),
(4,4,4,4,4,4,4,4,4,7),
(4,4,4,4,4,4,4,4,4,7),
(4,4,4,4,4,4,4,4,4,7),
(4,4,4,4,4,4,4,4,4,7),
(7,7,7,7,7,7,7,7,7,7),
(4,4,4,4,7,4,4,4,4,4),
(4,4,4,4,7,4,4,4,4,4),
(4,4,4,4,7,4,4,4,4,4),
(4,4,4,4,7,4,4,4,4,4));
Const
StoneHgt = 8;
StoneWdt = 8;
StoneSpr:Array [1..StoneHgt,1..StoneWdt] of Byte =
((0,0,8,8,8,8,0,0),
(0,8,7,7,8,8,8,0),
(8,7,8,8,8,8,8,8),
(8,7,8,8,8,8,8,8),
(8,8,8,8,8,8,8,8),
(8,8,8,8,8,8,8,8),
(0,8,8,8,8,8,8,0),
(0,0,8,8,8,8,0,0));
Const
ManHgt = 20;
ManWdt = 16;
ManSpr:Array [1..2,1..ManHgt,1..ManWdt] of Byte =
(((00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00),
(00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00),
(00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00),
(00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00),
(00,00,00,00,00,00, 7, 7, 7, 7,00,00,00,00,00,00),
(00,00,00,00,00, 7, 7, 7, 7, 7, 7,00,00,00,00,00),
(00,00,00,00,00, 7,15,15,15,15, 7,00,00,00,00,00),
(00,00,00,00,00,15, 3, 1, 1, 3,15,00,00,00,00,00),
(00,00,00,00,00,15,15,15,15,15,15,00,00,00,00,00),
(00,00,00,00,00,15,15, 8, 8,15,15,00,00,00,00,00),
(00,00,00,00,00,15,15,13,13,15,15,00,00,00,00,00),
(00,00,00,00,00,00,15,15,15,15,00,00,00,00,00,00),
(00,00,00,00,12,12,15,15,15,15,12,12,00,00,00,00),
(00,12,12,12,12,12,12,14,14,12,12,12,12,12,12,00),
(12,12,12,12,12,12,12,14,14,12,12,12,12,12,12,12),
(12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12),
(12,12, 8,12,12,12,12,12,12,12,12,12,12, 8,12,12),
(12,12, 8,12,12,12,12,12, 8,12,12,12,12, 8,12,12),
(12,12, 8,12,12,12,12,12,12,12,12,12,12, 8,12,12),
(12,12, 8,12,12,12,12,12, 8,12,12,12,12, 8,12,12)),
((00,00,00,15,00,00,00,00,00,00,00,00,15,00,00,00),
(00,00,00,15,00,00,00,00,00,00,00,00,15,00,00,00),
(00,00,12,12,00,00,00,00,00,00,00,00,12,12,00,00),
(00,00,12,12,00,00,00,00,00,00,00,00,12,12,00,00),
(00,00,12,12,00,00, 7, 7, 7, 7,00,00,12,12,00,00),
(00,00,12,12,00, 7, 7, 7, 7, 7, 7,00,12,12,00,00),
(00,12,12,00,00, 7,15,15,15,15, 7,00,00,12,12,00),
(00,12,12,00,00,15, 3, 1, 1, 3,15,00,00,12,12,00),
(00,12,12,00,00,15,15,15,15,15,15,00,00,12,12,00),
(00,12,12,00,00,15,15, 8, 8,15,15,00,00,12,12,00),
(00,12,12,00,00,15,15,13,13,15,15,00,00,12,12,00),
(00,12,12,12,00,00,15,15,15,15,00,00,12,12,12,00),
(00,00,12,12,12,12,15,15,15,15,12,12,12,12,00,00),
(00,00,12,12,12,12,12,14,14,12,12,12,12,12,00,00),
(00,00,12,12,12,12,12,14,14,12,12,12,12,12,00,00),
(00,00,12,12,12,12,12,12,12,12,12,12,12,12,00,00),
(00,00,00,12,12,12,12,12,12,12,12,12,12,00,00,00),
(00,00,00,12,12,12,12,12, 8,12,12,12,12,00,00,00),
(00,00,00,12,12,12,12,12,12,12,12,12,12,00,00,00),
(00,00,00,12,12,12,12,12, 8,12,12,12,12,00,00,00)));
Const
EnemyHgt = 42;
EnemyWdt = 16;
EnemySpr:Array [1..2,1..EnemyHgt,1..EnemyWdt] of Byte =
(((00,00,00,00,00,00,00,00,00,00,00,00,00,00,15,00),
(00,00,00,00,00,00,00,00,00,00,00,00,00,00,15,00),
(00,00,00,00,00,00,00,00,00,00,00,00,00,10,10,00),
(00,00,00,00,00,00,00,00,00,00,00,00,00,10,10,00),
(00,00,00,00,00,00, 7, 7, 7, 7,00,00,00,10,10,00),
(00,00,00,00,00, 7, 7, 7, 7, 7, 7,00,00,10,10,00),
(00,00,00,00,00, 7, 7, 7, 7, 7, 7,00,00,10,10,00),
(00,00,00,00,00, 7, 7, 7, 7, 7, 7,00,00,10,10,00),
(00,00,00,00,00, 7, 7, 7, 7, 7, 7,00,00,10,10,00),
(00,00,00,00,00,15, 7, 7, 7, 7,15,00,00,10,10,00),
(00,00,00,00,00,15, 7, 7, 7, 7,15,00,00,10,10,00),
(00,00,00,00,00,00,15,15,15,15,00,00,10,10,10,00),
(00,00,00,00,10,10,15,15,15,15,10,10,10,10,00,00),
(00,10,10,10,10,10,10,10,10,10,10,10,10,10,00,00),
(10,10,10,10,10,10,10,10,10,10,10,10,10,10,00,00),
(10,10,10,10,10,10,10,10,10,10,10,10,10,10,00,00),
(10,10,00,10,10,10,10,10,10,10,10,10,10,00,00,00),
(10,10,00,10,10,10,10,10,10,10,10,10,10,00,00,00),
(10,10,00,10,10,10,10,10,10,10,10,10,10,00,00,00),
(00,10,10,10,10,10,10,10,10,10,10,10,10,00,00,00),
(00,10,10,10,10,10,10,10,10,10,10,10,10,00,00,00),
(00,10,10,10,10,10,10,10,10,10,10,10,10,00,00,00),
(00,00,00,10,10,10,10,10,10,10,10,10,10,00,00,00),
(00,00,00, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,00,00,00),
(00,00,00, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,00,00,00),
(00,00, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,00,00,00),
(00,00, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,00,00,00),
(00, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,00,00,00),
(00, 8, 8, 8, 8,00,00,00,00, 8, 8, 8, 8,00,00,00),
( 8, 8, 8, 8, 8,00,00,00,00, 8, 8, 8, 8, 8,00,00),
( 8, 8, 8, 8,00,00,00,00,00,00, 8, 8, 8, 8,00,00),
( 8, 8, 8, 8,00,00,00,00,00,00, 8, 8, 8, 8,00,00),
( 8, 8, 8, 8,00,00,00,00,00,00, 8, 8, 8, 8,00,00),
(00, 8, 8, 8,00,00,00,00,00,00, 8, 8, 8, 8,00,00),
(00, 8, 8, 8,00,00,00,00,00,00, 8, 8, 8, 8,00,00),
(00,00, 8, 8, 8,00,00,00,00,00,00, 8, 8, 8, 8,00),
(00,00, 8, 8, 8,00,00,00,00,00,00, 8, 8, 8, 8,00),
(00,00, 8, 8, 8,00,00,00,00,00,00, 8, 8, 8, 8,00),
(00,00,00,00,00,00,00,00,00,00,00, 8, 8, 8, 8,00),
(00,00,00,00,00,00,00,00,00,00,00, 8, 8, 8, 8,00),
(00,00,00,00,00,00,00,00,00,00,00, 8, 8, 8, 8,00),
(00,00,00,00,00,00,00,00,00,00,00, 8, 8, 8, 8,00)),
((00,15,00,00,00,00,00,00,00,00,00,00,00,00,00,00),
(00,15,00,00,00,00,00,00,00,00,00,00,00,00,00,00),
(00,10,10,00,00,00,00,00,00,00,00,00,00,00,00,00),
(00,10,10,00,00,00,00,00,00,00,00,00,00,00,00,00),
(00,10,10,00,00,00, 7, 7, 7, 7,00,00,00,00,00,00),
(00,10,10,00,00, 7, 7, 7, 7, 7, 7,00,00,00,00,00),
(00,10,10,00,00, 7, 7, 7, 7, 7, 7,00,00,00,00,00),
(00,10,10,00,00, 7, 7, 7, 7, 7, 7,00,00,00,00,00),
(00,10,10,00,00, 7, 7, 7, 7, 7, 7,00,00,00,00,00),
(00,10,10,00,00,15, 7, 7, 7, 7,15,00,00,00,00,00),
(00,10,10,00,00,15, 7, 7, 7, 7,15,00,00,00,00,00),
(00,10,10,10,00,00,15,15,15,15,00,00,00,00,00,00),
(00,00,10,10,10,10,15,15,15,15,10,10,10,10,00,00),
(00,00,10,10,10,10,10,10,10,10,10,10,10,10,10,00),
(00,00,10,10,10,10,10,10,10,10,10,10,10,10,10,10),
(00,00,10,10,10,10,10,10,10,10,10,10,10,10,10,10),
(00,00,00,10,10,10,10,10,10,10,10,10,10,00,10,10),
(00,00,00,10,10,10,10,10,10,10,10,10,10,00,10,10),
(00,00,00,10,10,10,10,10,10,10,10,10,10,00,10,10),
(00,00,00,10,10,10,10,10,10,10,10,10,10,10,10,00),
(00,00,00,10,10,10,10,10,10,10,10,10,10,10,10,00),
(00,00,00,10,10,10,10,10,10,10,10,10,10,10,10,00),
(00,00,00,10,10,10,10,10,10,10,10,10,10,00,00,00),
(00,00,00, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,00,00,00),
(00,00,00, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,00,00,00),
(00,00,00, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,00,00),
(00,00,00, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,00,00),
(00,00,00, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,00),
(00,00, 8, 8, 8, 8, 8,00,00,00,00, 8, 8, 8, 8,00),
(00,00, 8, 8, 8, 8, 8,00,00,00,00, 8, 8, 8, 8, 8),
(00,00, 8, 8, 8, 8,00,00,00,00,00,00, 8, 8, 8, 8),
(00,00, 8, 8, 8, 8,00,00,00,00,00,00, 8, 8, 8, 8),
(00,00, 8, 8, 8, 8,00,00,00,00,00,00, 8, 8, 8, 8),
(00,00, 8, 8, 8, 8,00,00,00,00,00,00, 8, 8, 8,00),
(00,00, 8, 8, 8, 8,00,00,00,00,00,00, 8, 8, 8,00),
(00, 8, 8, 8, 8,00,00,00,00,00,00, 8, 8, 8,00,00),
(00, 8, 8, 8, 8,00,00,00,00,00,00, 8, 8, 8,00,00),
(00, 8, 8, 8, 8,00,00,00,00,00,00, 8, 8, 8,00,00),
(00, 8, 8, 8, 8,00,00,00,00,00,00,00,00,00,00,00),
(00, 8, 8, 8, 8,00,00,00,00,00,00,00,00,00,00,00),
(00, 8, 8, 8, 8,00,00,00,00,00,00,00,00,00,00,00),
(00, 8, 8, 8, 8,00,00,00,00,00,00,00,00,00,00,00)));
IMPLEMENTATION
END.
UNIT VGA13h;
INTERFACE
Type
PScreen = ^TScreen;
TScreen = Array [0..199,0..319] of Byte;
Const
ScreenHeight = 200;
ScreenWidth = 320;
GetMaxY = ScreenHeight-1;
GetMaxX = ScreenWidth-1;
MidX = GetMaxX div 2;
MidY = GetMaxY div 2;
PageSize = ScreenHeight*ScreenWidth;
QuarterSize = PageSize div 4;
VideoSegment:Word = 0;
Base1:Word = 0;
Base2:Word = 0;
Page1:PScreen = NIL;
Page2:PScreen = NIL;
Function DetectVGA:Boolean;
Procedure SetGraphMode;
Procedure SetTextMode;
Procedure MakePixelSquare;
Procedure CopyBase(Source,Destin:Word);
Procedure ClearBase(Base:Word);
Procedure FillBase(Base,Ofs,Count:Word;Color:Longint);
Procedure MoveBase(Source,Destin,Count:Word);
Procedure TileBase(Base,Ofs,Count:Word;Tile:Pointer;Len:Word);
Procedure PutPixel(Base:Word;x,y:Integer;Color:Byte);
Function GetPixel(Base:Word;x,y:Integer):Byte;
Procedure Line(Base:Word;x1,y1,x2,y2:Integer;Color:Byte);
Procedure VLine(Base:Word;x,y1,y2:Integer;Color:Byte);
Procedure HLine(Base:Word;y,x1,x2:Integer;Color:Byte);
Procedure Bar(Base:Word;x1,y1,x2,y2:Integer;Color:Byte);
Procedure Polygon(Base:Word;x1,y1,x2,y2,x3,y3,x4,y4:Integer;c:Byte);
Function InitVirtualPage:Boolean;
Procedure DoneVirtualPage;
IMPLEMENTATION
Var
VirtualPage:Pointer;
{$L VGA13H.OBJ}
Function DetectVGA; external;
Procedure SetGraphMode; external;
Procedure SetTextMode; external;
Procedure MakePixelSquare; external;
Procedure CopyBase; external;
Procedure ClearBase; external;
Procedure FillBase; external;
Procedure MoveBase; external;
Procedure TileBase; external;
Procedure PutPixel; external;
Function GetPixel; external;
Procedure HLine; external;
Procedure VLine; external;
Procedure Polygon;
Var
xpos:array [0..199,0..1] of Word;
mny,mxy,y:Integer;
i:Word;
s1,s2,s3,s4:Shortint;
begin
mny:=y1;
if y2<mny then mny:=y2;
if y3<mny then mny:=y3;
if y4<mny then mny:=y4;
mxy:=y1;
if y2>mxy then mxy:=y2;
if y3>mxy then mxy:=y3;
if y4>mxy then mxy:=y4;
s1:=byte(y1<y2)*2-1;
s2:=byte(y2<y3)*2-1;
s3:=byte(y3<y4)*2-1;
s4:=byte(y4<y1)*2-1;
y:=y1;
if y1<>y2 then
Repeat
xpos[y,byte(y1<y2)]:=integer(x2-x1)*(y-y1) div (y2-y1)+x1;
y:=y+s1;
Until y=y2+s1
else xpos[y,byte(y1<y2)]:=x1;
y:=y2;
if y2<>y3 then
Repeat
xpos[y,byte(y2<y3)]:=integer(x3-x2)*(y-y2) div (y3-y2)+x2;
y:=y+s2;
Until y=y3+s2
else xpos[y,byte(y2<y3)]:=x2;
y:=y3;
if y3<>y4 then
Repeat
xpos[y,byte(y3<y4)]:=integer(x4-x3)*(y-y3) div (y4-y3)+x3;
y:=y+s3;
Until y=y4+s3
else xpos[y,byte(y3<y4)]:=x3;
y:=y4;
if y4<>y1 then
Repeat
xpos[y,byte(y4<y1)]:=integer(x1-x4)*(y-y4) div (y1-y4)+x4;
y:=y+s4;
Until y=y1+s4
else xpos[y,byte(y1<y4)]:=x4;
for y:=mny to mxy do HLine(Base,y,xpos[y,0],xpos[y,1],c);
end;
Procedure Line;
Var
dx,dy,sx,sy,d,d1,d2,x,y,i:Integer;
begin
dx:=Abs(x2-x1);
dy:=Abs(y2-y1);
if x2>=x1 then sx:=+1 else sx:=-1;
if y2>=y1 then sy:=+1 else sy:=-1;
Mem[Base:(y1 shl 8)+(y1 shl 6)+x1]:=Color;
if dy<=dx then
begin
d:=(dy shl 1)-dx;
d1:=dy shl 1;
d2:=(dy-dx) shl 1;
x:=x1+sx;
y:=y1;
for i:=1 to dx do
begin
if d>0 then
begin
d:=d+d2;
y:=y+sy;
end else d:=d+d1;
Mem[Base:(y shl 8)+(y shl 6)+x]:=Color;
x:=x+sx;
end;
end
else begin
d:=(dx shl 1)-dy;
d1:=dx shl 1;
d2:=(dx-dy) shl 1;
x:=x1;
y:=y1+sy;
for i:=1 to dy do
begin
if d>0 then
begin
d:=d+d2;
x:=x+sx;
end else d:=d+d1;
Mem[Base:(y shl 8)+(y shl 6)+x]:=Color;
y:=y+sy;
end;
end;
end;
Procedure Bar;
Var
Row,Column:Integer;
begin
for Row:=y1 to y2 do
for Column:=x1 to x2 do
Mem[Base:(Row shl 8)+(Row shl 6)+Column]:=Color;
end;
Function InitVirtualPage;
Var
Temp:Longint;
begin
VirtualPage:=NIL;
Base2:=0;
Page2:=NIL;
InitVirtualPage:=false;
GetMem(VirtualPage,PageSize+15);
Temp:=(Longint(Seg(VirtualPage^)) shl 4)+Longint(Ofs(VirtualPage^));
if Temp and $F<>0 then Temp:=(Temp shr 4)+1 else Temp:=Temp shr 4;
Base2:=Temp;
Page2:=Ptr(Base2,0);
ClearBase(Base2);
InitVirtualPage:=true;
end;
Procedure DoneVirtualPage;
begin
FreeMem(VirtualPage,PageSize+15);
VirtualPage:=NIL;
Base2:=0;
Page2:=NIL;
end;
{==================================================================}
BEGIN
VideoSegment:=SegA000;
Base1:=VideoSegment;
Page1:=Ptr(Base1,0);
InitVirtualPage;
END.
UNIT VGASpr;
INTERFACE
Uses VGA13h;
Type
BA=Array [0..$FFF0] of Byte;
Var
TopX,TopY,BotX,BotY:Integer;
Procedure SetClipRect(x1,y1,x2,y2:Integer);
Procedure DrawTSpr(Base:Word;x,y:Integer;h,w:Word;Image:Pointer); Procedure DrawOSpr(Base:Word;x,y:Integer;h,w:Word;Image:Pointer); IMPLEMENTATION
Procedure SetClipRect;
Function Max(a,b:Integer):Integer;
begin
if a>b then Max:=a else Max:=b;
end;
Function Min(a,b:Integer):Integer;
begin
if a<b then Min:=a else Min:=b;
end;
begin
TopX:=Max(0,Min(x1,x2));
BotX:=Min(GetMaxX,Max(x1,x2));
TopY:=Max(0,Min(y1,y2));
BotY:=Min(GetMaxY,Max(y1,y2));
end;
Procedure DrawTSpr;
Var
fx,fy,x1,y1,x2,y2:Word;
c:Byte;
begin
if (x+w-1<TopX) or (y+h-1<TopY) or (x>BotX) or (y>BotY) then Exit;
if x<TopX then x1:=Abs(x) else x1:=0;
if y<TopY then y1:=Abs(y) else y1:=0;
if x+w>BotX then x2:=BotX-x else x2:=w-1;
if y+h>BotY then y2:=BotY-y else y2:=h-1;
for fy:=y1 to y2 do
for fx:=x1 to x2 do
begin
c:=BA(Image^)[fy*w+fx];
if c<>0 then Mem[Base:((y+fy) shl 8)+((y+fy) shl 6)+(x+fx)]:=c;
end;
end;
Procedure DrawOSpr;
Var
fx,fy,x1,y1,x2,y2:Word;
begin
if (x+w-1<TopX) or (y+h-1<TopY) or (x>BotX) or (y>BotY) then Exit;
if x<TopX then x1:=Abs(x) else x1:=0;
if y<TopY then y1:=Abs(y) else y1:=0;
if x+w>BotX then x2:=BotX-x else x2:=w-1;
if y+h>BotY then y2:=BotY-y else y2:=h-1;
for fy:=y1 to y2 do
for fx:=x1 to x2 do
Mem[Base:((y+fy) shl 8)+((y+fy) shl 6)+(x+fx)]:=BA(Image^)[fy*w+fx];
end;
BEGIN
SetClipRect(0,0,GetMaxX,GetMaxY);
END.
... созданный индекс или несколько различных индексов для всего издания. Ведение поиска должно сопровождаться ответствующими знаками, а найденные слова выделяться.[7] 1.4 Контролирующие программыВ традиционных системах обучения контроль знаний на экзамене проводится с помощью нескольких вопросов (два – три в билете плюс несколько дополнительных). Полученные обучаемым оценки за ответы на эти вопросы ...
... до expression2. В том случае, когда значение expression1 оказывается больше значения expression2, тело цикла не будет выполнятся вовсе. 2. РАЗРАБОТКА ПРОГРАММЫ 2.1 Постановка задачи Составить программу для игры в «Морской бой» игрока с компьютером. Программа должна позволять расставлять корабли на поле 10 х 10, контролировать правильность их расстановки, давать противникам возможность ...
... и фигур; флаги наложения, достижения дна ящика, свободной ячейки и др. Константы 3.4. Описание и обоснование выбора состава технических и программных средств. Для написания программы был выбран язык Паскаль. Отказ от библиотеки Turbo Vision был продиктован невозможностью работы с этой библиотекой в графическом режиме. 4. Ожидаемые технико-экономические показатели. Ожидаемая разработка будет ...
... те, что имеют ‘кислотные’ оттенки. Данный факт кому-то может показаться не столь значимым, но очевидно то, что желание пользователя работать с той или иной программой, будь то игровая (или какая другая программа), зачастую определяется не только сюжетом, жанром, смыслом самой игры, но и тем интерфейсом, который предлагают пользователю автор (или авторы) программы. Разработка программы ...
0 комментариев