top of page

Pong Game in Python (BuildLog)

This was my first foray into making a piece of usable software in any programming language. I've always wanted to learn to program, but was so tired of the "hello, world" exercises and books that outlined concepts but never tied them to real-world scenarios and use cases. So I thought "let's set a goal to create a simple game, and learn from there" and it was the most productive way of learning I've ever found. This project was written in Python 2.8 on a Macbook Pro. When I exported it to a Windows machine, the object speeds had to be drastically reduced because everything moved as lightspeed.

Code if anyone is interested is here- it's a python-based script so you could copy+paste this into an empty file, give it a .py extension and execute/play it yourself:

# This is me learning how to write something real in Python
# Comments have to have 2 spaces between the command, and 1 space after the hashtag
# By Cameron Skokowski

import turtle  # import means you import a module, like in powershell or anything else
import os

wn = turtle.Screen()  # wn is defined as a window using turtle.screen that defines it as youre using turtle
wn.title("Pong by onesixski")  # title, bgcolor, everything are all variable properties you can choose and define
wn.setup(width=800, height=600)
wn.tracer(0)  # this is to speed up the games as tracer being ON stops the screen from updating during every loop

# Score
score_a = 0
score_b = 0

# Paddle A
paddle_a = turtle.Turtle()
paddle_a.shapesize(stretch_wid=5, stretch_len=1)

# Paddle B
paddle_b = turtle.Turtle()
paddle_b.shape("square")  # 20 pixels wide and tall by default
paddle_b.shapesize(stretch_wid=5, stretch_len=1)  # 100 pixels up and down, 20 pixels left and right
paddle_b.penup()  #without this you'll see a pen moving between the points
paddle_b.goto(350,0)  # this should be 350 pixels left of center of the window

# Ball
ball = turtle.Turtle()
ball.goto(0, 0)  # objects all start in the center of the screen by default, but this explicitly tells it to
ball.dx = 3
ball.dy = 4

# Pen for words on top of screen
pen = turtle.Turtle()
pen.hideturtle()  # this hides while it's drawing
pen.goto(0, 225)
pen.write("CAMPONG", align="center", font=("courier", 66, "bold"))
pen.goto(0, -260)  # this puts it near the top of the screen as the second value is window height
pen.write("Player A: 0                       Player B: 0", align="center", font=("courier", 24, "normal"))

# Function
def paddle_a_up():  # functions are defined with 'def', they're like actions for variables
    y = paddle_a.ycor()  # this sends the Paddle A variable to move up and down using the ycor method in turtle
    y += 20 # this sets the coordinate to 20 pixels higher where it currently started
    paddle_a.sety(y)  # this just defined the sety property to be defined by the y function you just made

def paddle_a_down():  
    y = paddle_a.ycor() 
    y -= 20 # this sets the coordinate to 20 pixels lower where its last position was

def paddle_b_up():
    y = paddle_b.ycor()
    y += 20

def paddle_b_down():
    y = paddle_b.ycor()
    y -= 20

# Keyboard Binding
wn.onkeypress(paddle_a_up, "w")  # button 4 and button 5 are mousewheel scroll up and down
wn.onkeypress(paddle_a_down, "s")
wn.onkeypress(paddle_b_up, "Up")  # you can use w, s, anything, but arrows are defined as up, down, left, right
wn.onkeypress(paddle_b_down, "Down")

# Main Game Loop
while True:

 # Move the ball
    ball.setx(ball.xcor() + ball.dx)
    ball.sety(ball.ycor() + ball.dy)

 # Border checking
 if ball.ycor() > 290:
        ball.dy *= -1

 if ball.ycor() < -280:
        ball.dy *= -1
 if ball.xcor() > 380:  # this just resets the ball every time it hits the side, because it's only supposed to bounce off a paddle
        ball.goto(0, 0)
        ball.dx *= -1 # this changes its left/right direction when it goes back to center, which is why it starts differently
        score_a += 1
        pen.goto(0, 225)
        pen.write("CAMPONG", align="center", font=("courier", 66, "bold"))
        pen.goto(0, -260)
        pen.write("Player A: {}                       Player B: {}".format(score_a, score_b), align="center", font=("courier", 24, "normal"))

 if ball.xcor() < -390:
        ball.goto(0, 0)
        ball.dx *= -1
        score_b += 1
        pen.goto(0, 225)
        pen.write("CAMPONG", align="center", font=("courier", 66, "bold"))
        pen.goto(0, -260)
        pen.write("Player A: {}                       Player B: {}".format(score_a, score_b), align="center", font=("courier", 24, "normal"))

 # Paddle and ball collisions
 if (ball.xcor() > 330 and ball.xcor() < 340) and (ball.ycor() < paddle_b.ycor() + 50 and ball.ycor() > paddle_b.ycor() -50):
        ball.dx *= -1
        os.system("afplay /Users/cameronski/VSCpython/Pong/bounce.wav&")

 if (ball.xcor() < -330 and ball.xcor() > -340) and (ball.ycor() < paddle_a.ycor() + 50 and ball.ycor() > paddle_a.ycor() -50):
        ball.dx *= -1
        os.system("afplay /Users/cameronski/VSCpython/Pong/bounce.wav&")

55 views0 comments


bottom of page