Skip to content

Instantly share code, notes, and snippets.

@shreyansh26
Created September 30, 2017 09:29
Show Gist options
  • Save shreyansh26/c20b06b392584144a6e1bf9f99284c05 to your computer and use it in GitHub Desktop.
Save shreyansh26/c20b06b392584144a6e1bf9f99284c05 to your computer and use it in GitHub Desktop.
# Implementation of classic arcade game Pong
try:
import simplegui
except ImportError:
import SimpleGUICS2Pygame.simpleguics2pygame as simplegui
import random
# initialize globals - pos and vel encode vertical info for paddles
WIDTH = 600
HEIGHT = 400
BALL_RADIUS = 10
PAD_WIDTH = 8
PAD_HEIGHT = 80
HALF_PAD_WIDTH = PAD_WIDTH / 2
HALF_PAD_HEIGHT = PAD_HEIGHT / 2
LEFT = False
RIGHT = True
paddle1_pos=HEIGHT/2.5
paddle2_pos=HEIGHT/2.5
paddle1_vel=0
paddle2_vel=0
paddle_vel=5
ball_pos=[WIDTH/2, HEIGHT/2]
ball_vel=[0,1]
score1=0
score2=0
# initialize ball_pos and ball_vel for new bal in middle of table
# if direction is RIGHT, the ball's velocity is upper right, else upper left
def spawn_ball(direction):
global ball_pos, ball_vel # these are vectors stored as lists
ball_pos=[WIDTH/2, HEIGHT/2]
ball_vel[0]=-(random.randrange(180,320) / 100)
if direction:
ball_vel[0]*=-1
ball_vel[1]= -random.randrange(80, 200) / 100
# define event handlers
def new_game():
global paddle1_pos, paddle2_pos, paddle1_vel, paddle2_vel # these are numbers
global score1, score2 # these are ints
spawn_ball(0)
def draw(canvas):
global score1, score2, paddle1_pos, paddle2_pos, ball_pos, ball_vel
# draw mid line and gutters
canvas.draw_line([WIDTH / 2, 0],[WIDTH / 2, HEIGHT], 1, "White")
canvas.draw_line([PAD_WIDTH, 0],[PAD_WIDTH, HEIGHT], 1, "White")
canvas.draw_line([WIDTH - PAD_WIDTH, 0],[WIDTH - PAD_WIDTH, HEIGHT], 1, "White")
# update ball
ball_pos[0] += ball_vel[0]
ball_pos[1] += ball_vel[1]
if (ball_pos[0]<= PAD_WIDTH + BALL_RADIUS or ball_pos[0]>= WIDTH-PAD_WIDTH-BALL_RADIUS):
ball_vel[0]*=-1
if ball_pos[0]>WIDTH/2:
if (ball_pos[1]<paddle2_pos or ball_pos[1]>paddle2_pos+PAD_HEIGHT):
score1+=1
spawn_ball(LEFT)
else:
ball_vel[0]+= .1 *ball_vel[0]
if ball_pos[0]<WIDTH/2:
if (ball_pos[1]<paddle1_pos or ball_pos[1]>paddle1_pos+PAD_HEIGHT):
score2+=1
spawn_ball(RIGHT)
else:
ball_vel[0]+= .1 *ball_vel[0]
if ball_pos[1] <= BALL_RADIUS or ball_pos[1] >= (HEIGHT - BALL_RADIUS):
ball_vel[1] *= -1
# draw ball
canvas.draw_circle(ball_pos,BALL_RADIUS,2,"White","Green")
# update paddle's vertical position, keep paddle on the screen
global paddle1_vel, paddle2_vel
if (paddle1_pos <= HEIGHT - PAD_HEIGHT and paddle1_vel > 0) or (paddle1_pos >= 0 and paddle1_vel < 0) :
paddle1_pos += paddle1_vel
elif (paddle2_pos <= HEIGHT - PAD_HEIGHT and paddle2_vel > 0) or (paddle2_pos >= 0 and paddle2_vel < 0) :
paddle2_pos += paddle2_vel
# draw paddles
canvas.draw_polygon([[0,paddle1_pos],[PAD_WIDTH,paddle1_pos], [PAD_WIDTH,paddle1_pos+PAD_HEIGHT],[0,paddle1_pos+PAD_HEIGHT]],1,"Green","White")
canvas.draw_polygon([[WIDTH-PAD_WIDTH,paddle2_pos],[WIDTH,paddle2_pos], [WIDTH,paddle2_pos+PAD_HEIGHT],[WIDTH-PAD_WIDTH,paddle2_pos+PAD_HEIGHT]],1,"Green","White")
# determine whether paddle and ball collide
# draw scores
canvas.draw_text(str(score1), [225, 80], 60, "pink")
canvas.draw_text(str(score2), [350, 80], 60, "pink")
def keydown(key):
global paddle1_vel, paddle2_vel
#Player1
if key==simplegui.KEY_MAP["w"]:
paddle1_vel= -paddle_vel
if key==simplegui.KEY_MAP["s"]:
paddle1_vel= +paddle_vel
#Player2
if key==simplegui.KEY_MAP["up"]:
paddle2_vel= -paddle_vel
if key==simplegui.KEY_MAP["down"]:
paddle2_vel= +paddle_vel
def keyup(key):
global paddle1_vel, paddle2_vel
#Player1
if key==simplegui.KEY_MAP["w"]:
paddle1_vel= 0
if key==simplegui.KEY_MAP["s"]:
paddle1_vel= 0
#Player2
if key==simplegui.KEY_MAP["up"]:
paddle2_vel= 0
if key==simplegui.KEY_MAP["down"]:
paddle2_vel= 0
# create frame
frame = simplegui.create_frame("Pong", WIDTH, HEIGHT)
frame.set_draw_handler(draw)
frame.set_keydown_handler(keydown)
frame.set_keyup_handler(keyup)
frame.add_button("Restart",new_game,200)
# start frame
new_game()
frame.start()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment