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.