const RADIUS : int := 10
var chars : array char of boolean
var paddle1X : int := 5
var paddle1Y : int := maxy div 2 - 50
var paddle2X : int := maxx - 5
var paddle2Y : int := maxy div 2 - 50
var ballX : int := maxx div 2
var ballY : int := maxy div 2
var xInc : int := 1
var yInc : int := 1
var p1score : int := 0
var p2score : int := 0
var p1name : string
var p2name : string
var reply : string (1)
put "Please enter the name for player 1: " ..
get p1name
put "Please enter the name for player 2: " ..
get p2name
setscreen ("offscreenonly")
function MathDistance (x1, y1, x2, y2 : real) : real
var dx : real := x1 - x2
var dy : real := y1 - y2
result sqrt (dx * dx + dy * dy)
end MathDistance
function MathDistancePointLine (px, py, x1, y1, x2, y2 : real) : real
var lineSize : real := MathDistance (x1, y1, x2, y2)
if lineSize = 0 then
result MathDistance (px, py, x1, y1)
end if
var u : real := ((px - x1) * (x2 - x1) +
(py - y1) * (y2 - y1)) / (lineSize * lineSize)
if u < 0.0 then
result MathDistance (px, py, x1, y1)
elsif u > 1.0 then
result MathDistance (px, py, x2, y2)
else
var ix : real := x1 + u * (x2 - x1)
var iy : real := y1 + u * (y2 - y1)
result MathDistance (px, py, ix, iy)
end if
end MathDistancePointLine
loop
loop
cls
ballX += xInc
ballY += yInc
drawfillbox (0, 0, maxx, maxy, yellow)
drawline (paddle1X, paddle1Y, paddle1X, paddle1Y + 100, black)
drawline (paddle2X, paddle2Y, paddle2X, paddle2Y + 100, black)
drawfilloval (ballX, ballY, RADIUS, RADIUS, black)
Input.KeyDown (chars)
if chars ('w') then
paddle1Y += 1
elsif chars ('s') then
paddle1Y -= 1
end if
if chars (KEY_UP_ARROW) then
paddle2Y += 1
elsif chars (KEY_DOWN_ARROW) then
paddle2Y -= 1
end if
if paddle1Y + 100 >= maxy then
paddle1Y -= 1
elsif paddle1Y <= 0 then
paddle1Y += 1
end if
if paddle2Y + 100 >= maxy then
paddle2Y -= 1
elsif paddle2Y <= 0 then
paddle2Y += 1
end if
if ballY + RADIUS >= maxy then
yInc *= -1
elsif ballY - RADIUS <= 0 then
yInc *= -1
end if
if MathDistancePointLine (ballX, ballY, paddle1X, paddle1Y, paddle1X, paddle1Y + 100) <= RADIUS or MathDistancePointLine (ballX, ballY, paddle2X, paddle2Y, paddle2X, paddle2Y + 100) <= RADIUS
then
xInc *= -1
end if
if ballX - RADIUS <= 0 then
p2score := p2score + 1
cls
ballX := maxx div 2
ballY := maxy div 2
drawfillbox (0, 0, maxx, maxy, yellow)
drawline (paddle1X, paddle1Y, paddle1X, paddle1Y + 100, black)
drawline (paddle2X, paddle2Y, paddle2X, paddle2Y + 100, black)
drawfilloval (ballX, ballY, RADIUS, RADIUS, black)
put p2name, " scored!"
View.Update
delay (1000)
elsif ballX + RADIUS >= maxx then
p1score := p1score + 1
cls
ballX := maxx div 2
ballY := maxy div 2
drawfillbox (0, 0, maxx, maxy, yellow)
drawline (paddle1X, paddle1Y, paddle1X, paddle1Y + 100, black)
drawline (paddle2X, paddle2Y, paddle2X, paddle2Y + 100, black)
drawfilloval (ballX, ballY, RADIUS, RADIUS, black)
put p1name, " scored!"
View.Update
delay (1000)
end if
if p1score = 5 then
put p1name, " wins!"
cls
exit
elsif p2score = 5 then
put p2name, " wins!"
exit
end if
View.Update
end loop
cls
put "Would you like to play again? (y/n)"
View.Update
getch (reply)
if reply = 'n' then
exit
end if
end loop
|