Bouncing Balls

 
 

program Balls;

uses Common, QuickDrawII, EventMgr, MscToolSet;


type

  Ball = Object

    x, y, sx, sy: Integer;

    procedure setup;

    procedure move;

    procedure draw(num: Integer);

  end;


var

  i: Integer;

  tick: LongInt;

  balls: Array[1..15] of Ball;


procedure Ball.setup;

begin

  x := randomInteger mod 300 + 10;

  y := randomInteger mod 180 + 10;


  if random > 0 then

    sx := randomInteger mod 2 + 1

    else sx := -(randomInteger mod 2 + 1);


    if random > 0 then

      sy := randomInteger mod 2 + 1

    else sy := -(randomInteger mod 2 + 1);

end;


procedure Ball.move;

begin

  x := x + sx;

  y := y + sy;


  if (x < 0) or (x > 310) then

    sx := -sx;


  if (y < 0) or (y > 190) then

    sy := -sy;

end;


procedure Ball.draw;

var

  r: Rect;


begin

  setRect(r, x, y, x + 5 + num, y + 5 + num);

  setSolidPenPat(num);

  paintOval(r);

  setRect(r, x - 2, y - 2, x + 7 + num, y + 7 + num);

  setSolidPenPat(black);

  frameOval(r);

end;


begin

  startDesk(320);

  clearScreen(black);

  hideCursor;

  tick := getTick;

  setPenSize(3, 3);


  { Setup balls }


  for i := 1 to 15 do begin

    new(balls[i]);

    balls[i].setup;

  end;


  { Move balls }


  repeat

    for i := 1 to 15 do begin

      balls[i].draw(i);

      balls[i].move;

    end;


    repeat until getTick > tick;

    tick := tick + 1;

  until button(0);


  { Remove balls }


  for i := 1 to 15 do

    dispose(balls[i]);


  endDesk;

end.

Orca/Pascal version, written using Object Pascal to demonstrate object oriented programming.


GSoft BASIC comparison:

      TYPE BALL

        X AS INTEGER

        Y AS INTEGER

        SX AS INTEGER

        SY AS INTEGER

      END TYPE


      DIM R AS RECT

      DIM B AS BALL

      DIM BALLS(15) AS BALL


      HGR

      SETPENSIZE (3, 3)


      FOR I = 1 TO 15

        BALLS(I).X = RND (1) * 300 + 10

        BALLS(I).Y = RND (1) * 180 + 10


        IF RND (1) > 0.5 THEN

          BALLS(I).SX = INT ( RND (1) * 2) + 1

        ELSE

          BALLS(I).SX = - INT ( RND (1) * 2) - 1

        END IF


        IF RND (1) > 0.5 THEN

          BALLS(I).SY = INT ( RND (1) * 2) + 1

        ELSE

          BALLS(I).SY = - INT ( RND (1) * 2) - 1

        END IF

      NEXT


      DO

        FOR I = 1 TO 15

          B = BALLS(I)

          SETRECT (R, B.X, B.Y, B.X + 5 + I, B.Y + 5 + I)

          SETSOLIDPENPAT (I)

          PAINTOVAL (R)

          SETRECT (R, B.X - 2, B.Y - 2, B.X + 7 + I, B.Y + 7 + I)

          SETSOLIDPENPAT (0)

          FRAMEOVAL (R)


          BALLS(I).X = B.X + B.SX

          BALLS(I).Y = B.Y + B.SY


          IF BALLS(I).X < 0 OR BALLS(I).X > 310 THEN

            BALLS(I).SX = - B.SX

          IF BALLS(I).Y < 0 OR BALLS(I).Y > 190 THEN

            BALLS(I).SY = - B.SY

        NEXT

      LOOP