Space Game
Space Game
program Space;
uses Types, QuickDraw, Events, MiscTool;
const
MAX_ROCKS = 5;
type
Object = Record
x, y, speed: Integer;
end;
var
i, j, k, x, y, pos, score: Integer;
tick: longInt;
mouse: Point;
r: Rect;
rock: Object;
stars: Array[0..31] of Object;
rocks: Array[1..MAX_ROCKS] of Object;
gameOver: Boolean;
{ Draw spaceship }
procedure drawShip;
begin
setRect(r, pos, 180, pos + 20, 188);
eraseRect(r);
getMouse(mouse);
pos := mouse.h;
if pos > 300 then pos := 300;
setSolidPenPat(7);
setRect(r, pos, 183, pos + 20, 188);
paintOval(r);
setSolidPenPat(4);
setRect(r, pos + 5, 180, pos + 15, 185);
paintOval(r);
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
rock := rocks[i];
setRect(r, rock.x, rock.y, rock.x + 10,
rock.y + 10);
eraseOval(r);
rocks[i].y := rock.y + rock.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;
rock := rocks[i];
setSolidPenPat(2);
setRect(r, rock.x, rock.y, rock.x + 10,
rock.y + 10);
paintOval(r);
end;
end;
begin
{ Setup }
graphics(320);
clearScreen(black);
setBackColor(black);
setForeColor(9);
setSolidBackPat(black);
hideCursor;
score := 0;
tick := getTick;
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;
repeat until getTick > tick;
tick := tick + 1;
{ Check collision }
for i := 1 to MAX_ROCKS do begin
rock := rocks[i];
if (rock.y > 170) and (rock.y < 190) and
(rock.x > pos) and (rock.x < pos + 20)
then begin
{ Explosion }
x := rock.x;
y := rock.y;
for j := 1 to 15 do begin
k := j * 5;
drawStars;
drawRocks;
setSolidPenPat(j);
setRect(r, x - k, y - k, x + 5 + k,
y + 5 + k);
paintOval(r);
repeat until getTick - tick > 3;
tick := getTick;
end;
sysBeep;
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;
rock := rocks[i];
if (rock.x > pos) and (rock.x < pos + 10)
then begin
{ Destroy rock }
score := score + rocks[i].y div 10;
setRect(r, rock.x, rock.y, rock.x + 10,
rock.y + 10);
eraseOval(r);
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.
Shoots down the asteroids as they approaches your spaceship! The nearer the asteroid, the higher the score!
This game demonstrates many concepts including array, record, procedure, QuickDraw commands, mouse event and collision detection technique.
You can see the alternate Orca/Pascal version here. Orca/Pascal version is written using Object Pascal, an object oriented extension of the Pascal language.