Source
--PONG - GAME OF THE MONTH - JANUARY 1977 - 101 MAGAZINE
-- game datas
function _init()
board = {
limit_top = 1,
limit_down = 128,
limit_left = 1,
limit_right = 192,
middle_height = 128/2,
middle_width = 192/2
}
pad = {
height = 30,
width = 6,
speed = 1
}
pad1 = {
x = 8,
y = board.middle_height - pad.height/2
}
pad2 = {
x = 186,
y = board.middle_height - pad.height/2
}
ball = {
x = board.middle_width - 2,
y = board.middle_height - 3,
velocity_x = 0,
velocity_y = 0,
angle = 0,
speed = 3,
size = 5
}
angles1 = {0.2, 0.1, 0.0, 0.9, 0.8}
angles2 = {0.3, 0.4, 0.5, 0.6, 0.7}
collision = 0
game = true
max_score = 10
score1 = 0
score2 = 0
reset_ball()
end
-- setup functions
function reset_ball()
pad1.y = board.middle_height - pad.height/2
pad2.y = board.middle_height - pad.height/2
ball.x = board.middle_width - 2
ball.y = board.middle_height - 3
local random_nb = rand()
if random_nb < 0.5 then
ball.angle = 0.5
else
ball.angle = 0
end
set_velocities()
end
function set_velocities()
ball.velocity_x = (math.floor(math.cos(math.rad(360 * ball.angle)) * 100) / 100) * ball.speed
ball.velocity_y = (math.floor(math.sin(math.rad(360 * ball.angle)) * 100) / 100) * ball.speed
end
function set_angle(p)
-- for pad 1
if p == 1 then
if ball.y + ball.size >= pad1.y
and ball.y + ball.size < pad1.y + (pad.height * 1/10)
then
ball.angle = angles1[5]
elseif ball.y + ball.size >= pad1.y + (pad.height * 1/10)
and ball.y < pad1.y + (pad.height * 4/10)
then
ball.angle = angles1[4]
elseif ball.y >= pad1.y + (pad.height * 4/10)
and ball.y < pad1.y + (pad.height * 6/10)
then
ball.angle = angles1[3]
elseif ball.y >= pad1.y + (pad.height * 6/10)
and ball.y < pad1.y + (pad.height * 9/10)
then
ball.angle = angles1[2]
elseif ball.y >= pad1.y + (pad.height * 9/10)
and ball.y < pad1.y + pad.height
then
ball.angle = angles1[1]
end
end
-- for padd 2
if p == 2 then
if ball.y + ball.size >= pad2.y
and ball.y + ball.size < pad2.y + (pad.height * 1/10)
then
ball.angle = angles2[5]
elseif ball.y + ball.size >= pad2.y + (pad.height * 1/10)
and ball.y < pad2.y + (pad.height * 4/10)
then
ball.angle = angles2[4]
elseif ball.y >= pad2.y + (pad.height * 4/10)
and ball.y < pad2.y + (pad.height * 6/10)
then
ball.angle = angles2[3]
elseif ball.y >= pad2.y + (pad.height * 5.5/10)
and ball.y < pad2.y + (pad.height * 9/10)
then
ball.angle = angles2[2]
elseif ball.y >= pad2.y + (pad.height * 9/10)
and ball.y < pad2.y + pad.height
then
ball.angle = angles2[1]
end
end
set_velocities()
end
function reset_game()
game = true
max_score = 10
score1 = 0
score2 = 0
reset_ball()
end
-- action functions
function move_paddles()
-- for paddle 1
if btn(2,1)
and pad1.y > board.limit_top + 1
then
pad1.y = pad1.y - pad.speed
elseif btn(3,1)
and pad1.y + pad.height < board.limit_down
then
pad1.y = pad1.y + pad.speed
end
-- for paddle 2
if btn(2,0)
and pad2.y > board.limit_top + 1
then
pad2.y = pad2.y - pad.speed
elseif btn(3,0)
and pad2.y + pad.height < board.limit_down
then
pad2.y = pad2.y + pad.speed
end
end
function move_ball()
ball.x = ball.x + ball.velocity_x
ball.y = ball.y + ball.velocity_y
end
function action()
move_paddles()
move_ball()
end
-- checking functions
function ball_bounce()
if ball.y <= board.limit_top + 1 then
ball.velocity_y = -ball.velocity_y
end
if ball.y + ball.size > board.limit_down - 1 then
ball.velocity_y = -ball.velocity_y
end
end
function ball_collision()
if collision > 0 then collision = collision - 1 end
-- for pad 1
if ball.x < pad1.x + pad.width
and ball.y + ball.size >= pad1.y
and ball.y < pad1.y + pad.height
and collision == 0
then
ball.x = pad1.x + pad.width
set_angle(1)
end
-- for pad 2
if ball.x + ball.size > pad2.x - pad.width
and ball.y + ball.size >= pad2.y
and ball.y < pad2.y + pad.height
and collision == 0
then
ball.x = pad2.x - pad.width - ball.size
set_angle(2)
end
if ball.x < pad1.x + pad.width
or ball.x + ball.size > pad2.x - pad.width
then
collision = 10
end
end
function ball_score()
if ball.x < board.limit_left then
score2 = score2 + 1
reset_ball()
end
if ball.x > board.limit_right then
score1 = score1 + 1
reset_ball()
end
if score1 == max_score
or score2 == max_score
then
game = false
end
end
function check()
ball_bounce()
ball_collision()
ball_score()
end
-- drawing functions
function draw_board()
rect_line(board.limit_left, board.limit_top, board.limit_right, board.limit_down, 7)
for i=board.limit_top, board.limit_down, 10 do
line(board.middle_width, i, board.middle_width, i + 6, 7)
end
end
function draw_paddles()
rect(pad1.x, pad1.y, pad.width, pad.height, 7)
rect(pad2.x - pad.width, pad2.y, pad.width, pad.height, 7)
end
function draw_ball()
rect(ball.x, ball.y, ball.size, ball.size, 7)
end
function draw_score()
color(7)
print(score1, board.limit_right * 2/10, 10)
print(score2, board.limit_right * 8/10, 10)
end
function draw()
clear(1)
draw_board()
draw_paddles()
draw_ball()
draw_score()
end
-- main loop function
function _update()
if game == true then
action()
check()
draw()
else
game_over()
end
end
-- game over event
function game_over()
clear(1)
draw_score()
if score1 > score2 then
print("PLAYER 1 WIN!", 70, 50)
else
print("PLAYER 2 WIN!", 70, 50)
end
print("Press Button 1 to play again", 40, 60)
if btn(4, 0) or btn(4, 1) then
reset_game()
end
end
Last updated
Was this helpful?