• Homework
  • Thirds
  • Upper Thirds
  • Fourth
  • Divisions
    • ICT
    • Computer Science
  • Fifth
  • Lower Sixth
  • Upper Sixth
    • Upper Sixth Theory
  • Blog
  • Careers
  • Unity
  • Networking

The bouncing ball challenge

Getting started:
The program uses an additional unit called console, which allows you to position the cursor on the screen, read keystrokes, clear the screen and other useful goodies.  You can download it from the link below:
console.pas
File Size: 29 kb
File Type: pas
Download File

Setting up:
We'll start by creating two variables, x and y.  These will store the position of the ball on the screen.  By changing these variables, we'll be able to make it move.
The program also needs a loop - the simplest kind of loop, a while loop that never ends.  The easy way to do this is to use the line
while True do
Then we position the cursor to our x and y position using the command gotoxy and write a cross.
uses
  SysUtils,console; //make sure you have console.pas in the same folder

var
    x,y :integer;   //set up some variables
begin
    x := 40;        //set the starting values in the middle of the console
    y := 12;
    while True do   //loop forever
    begin
       gotoxy(x,y); //position the cursor
       write('X');  //and draw
    end;
end.
That's OK, but it doesn't move.  Let's make it move by changing the value of x and y
    begin
       x := x+1;    //add one to x
       y := y+1;    //add one to y
       gotoxy(x,y); //position the cursor
       write('X');  //and draw
    end;
Now we have a screen filled with crosses.  It's not really clear what's happening so let's slow it down and clear the screen each time there's a loop, so we can see what's going on.
    begin
       clrscr;      //clear screen
       x := x+1;    //add one to x
       y := y+1;    //add one to y
       gotoxy(x,y); //position the cursor
       write('X');  //and draw

       sleep(100);  //sleep for 100 milliseconds
    end;
That's better.  Now the cross is moving, but it gets to the bottom and just slides along.  We need to make it bounce.

This requires some thinking.  The screen dimensions are 80 across and 25 down.  In other words, if we get to position x=80 or y=25, we need to do something to reverse the direction of travel.

The direction of travel is made by the +1 in the x := x+1 and y := y+1.  To go backwards we need to make this -1.
So we need to detect whether the ball is at the edge and change the plus one to minus one for either x or y.
When we get to the other edge, where x or y is 0, then we need to change it back to plus one.

The best way seems to be to use another variable, or rather two variables to store the direction.  Those variables will either be plus or minus one.  We can change the value when we reach the edge.
var
    x,y :integer;   //set up some variables

    dx,dy :integer; //set variables for direction
begin
    x := 40;        //set the starting values in the middle of the console
    y := 12;

    dx := 1;        //set the initial direction
    dy := 1;
    while true do   //loop forever
    begin
       clrscr;      //clear screen

        //================================
       if y > 24 then dy := -1;     //bounce at the bottom
       if y < 1 then dy := 1;       //bounce at the top
       //=================================
       x := x+dx;    //add dx to x
       y := y+dy;    //add dy to x
       gotoxy(x,y); //position the cursor
       write('X');  //and draw
       sleep(100);  //sleep for 100 milliseconds
    end;
end.
This works for the y value, it will now bounce off the bottom and top of the screen.  Can you do the same for the x values?
Powered by Create your own unique website with customizable templates.