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