|
|
|
program Space;
uses Types, QuickDraw, Events;
const
MAX_ROCKS = 5;
type
Object = record
x, y, speed: Integer;
end;
var
i, j, x, y, pos, score: Integer;
mouse: Point;
ship, rock, explosion: Rect;
stars: Array[0..31] of Object;
rocks: Array[1..MAX_ROCKS] of Object;
gameOver: boolean;
{ Draw spaceship }
procedure drawShip;
begin
setRect(ship, pos, 180, pos + 20, 188);
eraseRect(ship);
getMouse(mouse);
pos := mouse.h;
if pos > 300 then
pos := 300;
setSolidPenPat(7);
setRect(ship, pos, 183, pos + 20, 188);
paintOval(ship);
setSolidPenPat(4);
setRect(ship, pos + 5, 180, pos + 15, 185);
paintOval(ship);
end;
{ Draw stars }
procedure drawStars;
var
i: Integer;
begin
for i := 0 to 31 do begin
setSolidPenPat(black);
moveTo(stars[i].x, stars[i].y);
line(0, 0);
stars[i].y := stars[i].y + stars[i].speed;
if stars[i].y > 199 then begin
stars[i].y := 0;
stars[i].speed := random mod 5 + 1;
end;
setSolidPenPat(i mod 15 + 1);
moveTo(stars[i].x, stars[i].y);
line(0, 0);
end;
end;
{ Draw rocks }
procedure drawRocks;
var
i: Integer;
begin
for i := 1 to MAX_ROCKS do begin
setRect(rock, rocks[i].x, rocks[i].y, rocks[i].x + 10, rocks[i].y + 10);
eraseOval(rock);
rocks[i].y := rocks[i].y + rocks[i].speed;
if rocks[i].y > 190 then begin
rocks[i].x := random mod 310;
rocks[i].y := 0;
rocks[i].speed := random mod 6 + 3;
end;
setSolidPenPat(2);
setRect(rock, rocks[i].x, rocks[i].y, rocks[i].x + 10, rocks[i].y + 10);
paintOval(rock);
end;
end;
begin
{ Setup }
graphics(320);
clearScreen(black);
setBackColor(black);
setForeColor(9);
setSolidBackPat(black);
hideCursor;
score := 0;
gameOver := false;
getMouse(mouse);
pos := mouse.h;
for i := 1 to MAX_ROCKS do begin
rocks[i].x := random mod 310;
rocks[i].y := random mod 100;
rocks[i].speed := random mod 3 + 1;
end;
for i := 0 to 31 do begin
stars[i].x := i * 10;
stars[i].y := random mod 200;
stars[i].speed := random mod 5 + 1;
end;
repeat
drawStars;
drawRocks;
drawShip;
{ Check collision }
for i := 1 to MAX_ROCKS do begin
if (rocks[i].y > 170) and (rocks[i].y < 190)
and (rocks[i].x > pos) and (rocks[i].x < pos + 20) then begin
{ Explosion }
x := rocks[i].x;
y := rocks[i].y;
for j := 1 to 15 do begin
drawStars;
drawRocks;
setSolidPenPat(j);
setRect(explosion, x - j * 5, y - j * 5, x + 5 + j * 5, y + 5 + j * 5);
paintOval(explosion);
end;
gameOver := true;
end;
end;
{ Fire laser }
if button(0) then begin
setSolidPenPat(white);
moveTo(pos + 10, 0);
lineTo(pos + 10, 179);
for i := 1 to MAX_ROCKS do begin
drawStars;
if (rocks[i].x > pos) and (rocks[i].x < pos + 10) then begin
{ Destroy rock }
score := score + rocks[i].y div 10;
setRect(rock, rocks[i].x, rocks[i].y, rocks[i].x + 10,
rocks[i].y + 10);
eraseOval(rock);
rocks[i].x := random mod 310;
rocks[i].y := 0;
rocks[i].speed := random mod 6 + 3;
leave;
end;
end;
setSolidPenPat(black);
moveTo(pos + 10, 0);
lineTo(pos + 10, 179);
end;
until gameOver;
moveTo(50, 90);
setForeColor(9);
write('Game Over. Your Score is ', score, '.');
repeat until button(0);
end. |
|