Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- Pong Game for SimpleOS
- -- CC: Tweaked compatible
- local w, h = term.getSize()
- h = h - 1 -- Leave room for score
- -- Game state
- local paddle1Y, paddle2Y = math.floor(h/2) - 1, math.floor(h/2) - 1
- local paddleHeight = 4
- local ballX, ballY = math.floor(w/2), math.floor(h/2)
- local ballDX, ballDY = 1, 0
- local score1, score2 = 0, 0
- local gameOver = false
- local speed = 0.08
- local aiMode = true -- Single player by default
- -- Reset ball
- local function resetBall(direction)
- ballX = math.floor(w/2)
- ballY = math.floor(h/2)
- ballDX = direction or (math.random(2) == 1 and 1 or -1)
- ballDY = (math.random(3) - 2) * 0.5
- end
- -- Draw game
- local function draw()
- term.setBackgroundColor(colors.black)
- term.clear()
- -- Draw center line
- term.setTextColor(colors.gray)
- for y = 1, h do
- if y % 2 == 0 then
- term.setCursorPos(math.floor(w/2), y)
- term.write("|")
- end
- end
- -- Draw paddles
- term.setBackgroundColor(colors.white)
- for i = 0, paddleHeight - 1 do
- term.setCursorPos(2, paddle1Y + i)
- term.write(" ")
- term.setCursorPos(w - 1, paddle2Y + i)
- term.write(" ")
- end
- -- Draw ball
- term.setBackgroundColor(colors.black)
- term.setTextColor(colors.yellow)
- term.setCursorPos(math.floor(ballX), math.floor(ballY))
- term.write("O")
- -- Draw score bar
- term.setBackgroundColor(colors.gray)
- for x = 1, w do
- term.setCursorPos(x, h + 1)
- term.write(" ")
- end
- term.setTextColor(colors.white)
- term.setCursorPos(2, h + 1)
- term.write("P1: " .. score1)
- term.setCursorPos(w - 7, h + 1)
- term.write("P2: " .. score2)
- term.setCursorPos(math.floor(w/2) - 3, h + 1)
- term.write("[Q]uit")
- end
- -- AI movement
- local function moveAI()
- local targetY = ballY - paddleHeight / 2
- if paddle2Y < targetY - 1 then
- paddle2Y = math.min(paddle2Y + 1, h - paddleHeight + 1)
- elseif paddle2Y > targetY + 1 then
- paddle2Y = math.max(paddle2Y - 1, 1)
- end
- end
- -- Update ball
- local function update()
- ballX = ballX + ballDX
- ballY = ballY + ballDY
- -- Top/bottom bounce
- if ballY <= 1 then
- ballY = 1
- ballDY = -ballDY
- elseif ballY >= h then
- ballY = h
- ballDY = -ballDY
- end
- -- Paddle 1 collision
- if ballX <= 3 and ballX >= 2 then
- if ballY >= paddle1Y and ballY < paddle1Y + paddleHeight then
- ballDX = math.abs(ballDX)
- local hitPos = (ballY - paddle1Y) / paddleHeight
- ballDY = (hitPos - 0.5) * 2
- end
- end
- -- Paddle 2 collision
- if ballX >= w - 2 and ballX <= w - 1 then
- if ballY >= paddle2Y and ballY < paddle2Y + paddleHeight then
- ballDX = -math.abs(ballDX)
- local hitPos = (ballY - paddle2Y) / paddleHeight
- ballDY = (hitPos - 0.5) * 2
- end
- end
- -- Scoring
- if ballX < 1 then
- score2 = score2 + 1
- resetBall(-1)
- elseif ballX > w then
- score1 = score1 + 1
- resetBall(1)
- end
- -- Win condition
- if score1 >= 10 or score2 >= 10 then
- gameOver = true
- end
- end
- -- Game over screen
- local function showGameOver()
- term.setBackgroundColor(colors.black)
- term.setTextColor(colors.yellow)
- term.setCursorPos(math.floor(w/2) - 5, math.floor(h/2) - 1)
- if score1 >= 10 then
- term.write("PLAYER 1 WINS!")
- else
- term.write("PLAYER 2 WINS!")
- end
- term.setTextColor(colors.white)
- term.setCursorPos(math.floor(w/2) - 10, math.floor(h/2) + 1)
- term.write("Press ENTER to restart")
- term.setCursorPos(math.floor(w/2) - 7, math.floor(h/2) + 2)
- term.write("Press Q to quit")
- end
- -- Main game loop
- local function run()
- resetBall()
- score1, score2 = 0, 0
- gameOver = false
- paddle1Y = math.floor(h/2) - paddleHeight/2
- paddle2Y = math.floor(h/2) - paddleHeight/2
- -- Mode selection
- term.setBackgroundColor(colors.black)
- term.clear()
- term.setTextColor(colors.yellow)
- term.setCursorPos(math.floor(w/2) - 3, math.floor(h/2) - 2)
- term.write("PONG")
- term.setTextColor(colors.white)
- term.setCursorPos(math.floor(w/2) - 10, math.floor(h/2))
- term.write("[1] Single Player (vs AI)")
- term.setCursorPos(math.floor(w/2) - 8, math.floor(h/2) + 1)
- term.write("[2] Two Players")
- while true do
- local event, key = os.pullEvent("key")
- if key == keys.one then
- aiMode = true
- break
- elseif key == keys.two then
- aiMode = false
- break
- elseif key == keys.q then
- return
- end
- end
- while true do
- draw()
- if gameOver then
- showGameOver()
- while true do
- local event, key = os.pullEvent("key")
- if key == keys.enter then
- resetBall()
- score1, score2 = 0, 0
- gameOver = false
- paddle1Y = math.floor(h/2) - paddleHeight/2
- paddle2Y = math.floor(h/2) - paddleHeight/2
- break
- elseif key == keys.q then
- return
- end
- end
- end
- local timer = os.startTimer(speed)
- while true do
- local event, p1 = os.pullEvent()
- if event == "key" then
- -- Player 1 controls (W/S)
- if p1 == keys.w then
- paddle1Y = math.max(1, paddle1Y - 1)
- elseif p1 == keys.s then
- paddle1Y = math.min(h - paddleHeight + 1, paddle1Y + 1)
- end
- -- Player 2 controls (Up/Down) - only in 2P mode
- if not aiMode then
- if p1 == keys.up then
- paddle2Y = math.max(1, paddle2Y - 1)
- elseif p1 == keys.down then
- paddle2Y = math.min(h - paddleHeight + 1, paddle2Y + 1)
- end
- end
- if p1 == keys.q then
- return
- end
- draw()
- elseif event == "timer" and p1 == timer then
- break
- end
- end
- if aiMode then
- moveAI()
- end
- update()
- end
- end
- run()
Advertisement
Add Comment
Please, Sign In to add comment