Advanced Pong 2.0 - QBasic Source Code

Back to: Main Programming Page

I started off writing a clone to the original Pong game, then decided to make it a little more interesting by letting you move your player forward and backward, not just up and down. Careful, though - the ball moves as fast as the players, so if it gets behind you, you can't stop it.

 

Source Code:

'      QBasic Advanced Pong for the PC Version 2.0
'
'This program is similar to the original Pong game, where a ball bounced
'across the screen and the players used paddles to bounce the ball back and
'forth.  However, in the original Pong, players could only move up and down.
'In this game they can move left and right as well.  Also different from the
'original Pong game, the ball can be cradled in this game.  You will see what
'that means as you play the game.
'
'Controls:
'For Player 1, who is the blue paddle on the right, "8" is up, "2" is down,
'"6" is right, "4" is left, and "5" is the brake, which stops his movement.
'For Player 2, who is the red paddle on the left, "I" is up, "M" or "," is
'down, "L" is right, "J" is left, and "K" is the brake, which stops his movement.
'Press "F5" to start the game
'
'
'(More, press Page Down)
'If the game flickers too much, or goes too fast, make the number after
'"Flicker.Control =" bigger.  If the game goes too slow, make the number
'smaller.  Remember, on slower computers, there is always a trade-off
'between graphics quality and game speed.
Flicker.Control = 60000
'
'On some computers, the beep that this program does may slow down game play.
'If this is the case, make the number after "noise =" 0.  If you want the beep
'make the number 1.
noise = 0
'
'This is Version 2.0 of Advanced Pong for the PC, differing from Version 1.0
'in the fact that it's easier to control, and the graphics are slightly
'better.  Also, this version gives the user "Flicker.Control", and "noise",
'to allow the program to run better on their system.
'
'
'Programmed by Jeff Lewis
'
'
'
'
'
'

startover:
SCREEN 10

CLS
PRINT "What is the name of player 1?"
INPUT player1.name$
PRINT "What is the name of player 2?"
INPUT player2.name$
PRINT "How many rounds do you want to play?"
INPUT round.total
player1.score = 0
player2.score = 0
rounds = 0

new:
rounds = rounds + 1
     
'draw the field
SCREEN 7
CLS
PAINT (5, 5), (2)
LINE (0, 0)-(3, 199), 0, BF
LINE (0, 199)-(319, 194), 0, BF
LINE (318, 199)-(314, 0), 0, BF
PAINT (1, 1), (15), (2)
LINE (0, 0)-(0, 200), 0
LINE (1, 74)-(3, 144), 0, BF
LINE (314, 74)-(319, 144), 0, BF
LINE (1, 0)-(319, 20), 15, BF
LINE (0, 0)-(320, 15), 0, BF
LINE (317, 0)-(319, 199), 0, BF
LOCATE 1, 1
IF player1.score > player2.score THEN
COLOR 9
ELSE
COLOR 12
END IF

IF player1.score = player2.score THEN
COLOR 15
END IF

PRINT "Score:"; "   "; player2.name$; ":"; player2.score; "   "; player1.name$; ":"; player1.score

IF rounds > round.total THEN
GOTO quit
END IF

player1.x = 300
player1.y = 95
player2.x = 12
player2.y = 95
player1.move$ = "n"
player2.move$ = "n"
ball.x = 163
ball.y = 3 * INT(55 * RND) + 26

x = INT(2 * RND)
IF x = 1 THEN
ball.ns = 3
ELSE
ball.ns = -3
END IF

x = INT(2 * RND)
IF x = 1 THEN
ball.ew = 3
ELSE
ball.ew = -3
END IF

ball.x.2 = ball.x
ball.y.2 = ball.y
player1.x.2 = player1.x
player1.y.2 = player1.y
player2.x.2 = player2.x
player2.y.2 = player2.y

player1.ns = 0
player1.ew = 0
player2.ns = 0
player2.ew = 0

a:
CIRCLE (ball.x.2, ball.y.2), 6, 2
PAINT (ball.x.2, ball.y.2), (2), (2)

LINE (player1.x.2, player1.y.2 + 1)-(player1.x.2 + 6, player1.y.2 + 23), 2, BF
LINE (player2.x.2, player2.y.2 + 1)-(player2.x.2 + 6, player2.y.2 + 23), 2, BF

LINE (player1.x, player1.y + 1)-(player1.x + 6, player1.y + 23), 9, BF
LINE (player2.x, player2.y + 1)-(player2.x + 6, player2.y + 23), 12, BF
CIRCLE (ball.x, ball.y), 6, 14
PAINT (ball.x, ball.y), (14), (14)

FOR count = 1 TO Flicker.Control
NEXT count

ball.x.2 = ball.x
ball.y.2 = ball.y
player1.x.2 = player1.x
player1.y.2 = player1.y
player2.x.2 = player2.x
player2.y.2 = player2.y

ball.x = ball.x + ball.ew
ball.y = ball.y + ball.ns
player1.x = player1.x + player1.ew
player1.y = player1.y + player1.ns
player2.x = player2.x + player2.ew
player2.y = player2.y + player2.ns


IF ball.x - 6 <= 6 AND ball.y >= 74 AND ball.y <= 144 THEN
GOTO goal.1
END IF

IF ball.x + 6 >= 312 AND ball.y >= 74 AND ball.y <= 144 THEN
GOTO goal.2
END IF

IF ball.y - 6 <= 20 THEN
ball.ns = 3
END IF

IF ball.y + 6 >= 194 THEN
ball.ns = -3
END IF

IF ball.x - 6 <= 6 THEN
ball.ew = 3
END IF

IF ball.x + 6 >= 312 THEN
ball.ew = -3
END IF

IF ball.x + 6 >= player1.x AND ball.x - 6 <= player1.x + 6 AND ball.y >= player1.y AND ball.y <= player1.y + 24 THEN
ball.ew = -ball.ew
IF noise = 1 THEN
BEEP
END IF
END IF

IF ball.x + 6 >= player2.x AND ball.x - 6 <= player2.x + 6 AND ball.y >= player2.y AND ball.y <= player2.y + 24 THEN
ball.ew = -ball.ew
IF noise = 1 THEN
BEEP
END IF
END IF

IF player1.y <= 20 THEN
player1.ns = 3
END IF

IF player1.y + 24 >= 194 THEN
player1.ns = -3
END IF

IF player1.x <= 6 THEN
player1.ew = 3
END IF

IF player1.x + 6 >= 312 THEN
player1.ew = -3
END IF

IF player2.y <= 20 THEN
player2.ns = 3
END IF

IF player2.y + 24 >= 194 THEN
player2.ns = -3
END IF

IF player2.x <= 6 THEN
player2.ew = 3
END IF

IF player2.x + 6 >= 312 THEN
player2.ew = -3
END IF

move$ = INKEY$
SELECT CASE move$

CASE "p"
LOCATE 12, 3
COLOR 15
PRINT "Game Paused, Hit Space to Continue"
WHILE INKEY$ <> " "
WEND
LINE (10, 44)-(310, 144), 2, BF

CASE "q"
GOTO quit

'player1 change in movement
CASE "8"
player1.ns = -3

CASE "6"
player1.ew = 3

CASE "2"
player1.ns = 3

CASE "4"
player1.ew = -3

CASE "5"
player1.ew = 0
player1.ns = 0

'player2 change in movement
CASE "i"
player2.ns = -3

CASE "l"
player2.ew = 3

CASE ","
player2.ns = 3

CASE "m"
player2.ns = 3

CASE "j"
player2.ew = -3

CASE "k"
player2.ew = 0
player2.ns = 0

END SELECT

GOTO a

goal.1:
LOCATE 14, 2
COLOR 9
PRINT "Goal!"
player1.score = player1.score + 1
WHILE INKEY$ <> " "
WEND
GOTO new

goal.2:
COLOR 4
LOCATE 14, 35
PRINT "Goal!"
player2.score = player2.score + 1
WHILE INKEY$ <> " "
WEND
GOTO new

quit:
LOCATE 12, 6
COLOR 4
PRINT "           Game Over          "
LOCATE 13, 6
PRINT "Do you want to play again? y/n"
DO
y.n$ = INKEY$
LOOP UNTIL y.n$ = "y" OR y.n$ = "n"
IF y.n$ = "y" THEN
GOTO startover
END IF