Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # Implementation of classic arcade game Pong
- import simplegui
- import random
- # initialize globals - pos and vel encode vertical info for paddles
- WIDTH = 600
- HEIGHT = 400
- BALL_RADIUS = 20
- PAD_WIDTH = 8
- PAD_HEIGHT = 80
- HALF_PAD_WIDTH = PAD_WIDTH / 2
- HALF_PAD_HEIGHT = PAD_HEIGHT / 2
- PADDLE_VEL = 5
- LEFT = False
- RIGHT = True
- paddle1_pos = HEIGHT/2
- paddle2_pos = HEIGHT/2
- paddle1_vel = 0
- paddle2_vel = 0
- score1 = 0
- score2 = 0
- # initialize ball_pos and ball_vel for new bal in middle of table
- ball_pos = [WIDTH/2, HEIGHT/2]
- ball_vel = [1, -1]
- # 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(12,24) / 100
- if direction == True:
- ball_vel[0] = - ball_vel[0]
- ball_vel[1] = -random.randrange(60, 180) / 100
- # define event handlers
- def new_game():
- global paddle1_pos_top, paddle2_pos_bot, paddle1_vel, paddle2_vel
- global ball_pos, ball_vel # these are numbers
- global score1, score2 # these are ints
- ball_pos = [WIDTH/2, HEIGHT/2]
- paddle1_pos = [0, HEIGHT/2]
- paddle2_pos = [WIDTH, HEIGHT/2]
- score1 = 0
- score2 = 0
- spawn_ball(random.choice([LEFT, RIGHT]))
- def draw(canvas):
- global score1, score2, paddle1_pos, paddle2_pos, ball_pos, ball_vel, direction
- # draw mid line and gutters
- canvas.draw_line([WIDTH / 2, 0],[WIDTH / 2, HEIGHT], 4, "Red")
- canvas.draw_line([PAD_WIDTH, 0],[PAD_WIDTH, HEIGHT], 4, "Red")
- canvas.draw_line([WIDTH - PAD_WIDTH, 0],[WIDTH - PAD_WIDTH, HEIGHT], 4, "Red")
- # draw ball
- canvas.draw_circle(ball_pos, 15, 12, "Blue", "Blue")
- # update paddle's vertical position, keep paddle on the screen
- #left player paddle
- if ((paddle1_pos <= HEIGHT - PAD_HEIGHT) and (paddle1_vel > 0)) or ((paddle1_pos >= 0) and (paddle1_vel < 0)):
- paddle1_pos += paddle1_vel
- #right player paddle
- 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_line([0, paddle1_pos], [0, paddle1_pos + PAD_HEIGHT], PAD_WIDTH, "White")
- canvas.draw_line([WIDTH, paddle2_pos], [WIDTH, paddle2_pos + PAD_HEIGHT], PAD_WIDTH, "White")
- # determine whether paddle and ball collide
- # update ball
- ball_pos[0] += ball_vel[0]
- ball_pos[1] += ball_vel[1]
- #upper and lower wall collisions
- if ball_pos[1] <= 20:
- ball_vel[1] = - ball_vel[1]
- elif ball_pos[1] >= HEIGHT - 20:
- ball_vel[1] = - ball_vel[1]
- #Checking for collision of ball with paddles
- #checking left side for collision
- if ball_pos[0] <= HALF_PAD_WIDTH + BALL_RADIUS:
- if((ball_pos[1] > paddle1_pos + PAD_HEIGHT) and (ball_pos[1] < HEIGHT)):
- score2 += 1
- spawn_ball(RIGHT)
- elif ((ball_pos[1] < paddle1_pos) and (ball_pos[1] > 0)):
- score2 += 1
- spawn_ball(RIGHT)
- elif ((ball_pos[1] >= paddle1_pos) and (ball_pos[1] <= paddle1_pos + PAD_HEIGHT + 2)):
- ball_vel[0] = - ball_vel[0]
- ball_vel[0] += 0.1 * ball_vel[0]
- #checking right side for collision
- if ball_pos[0] >= WIDTH - HALF_PAD_WIDTH - BALL_RADIUS:
- if((ball_pos[1] > paddle2_pos + PAD_HEIGHT) and (ball_pos[1] < HEIGHT)):
- score1 += 1
- spawn_ball(LEFT)
- elif ((ball_pos[1] < paddle2_pos - PAD_HEIGHT) and (ball_pos[1] > 0)):
- score1 += 1
- spawn_ball(LEFT)
- elif ((ball_pos[1] >= paddle2_pos) and (ball_pos[1] <= paddle2_pos + PAD_HEIGHT + 2)):
- ball_vel[0] = - ball_vel[0]
- ball_vel[0] += 0.1 * ball_vel[0]
- # draw scores
- canvas.draw_text(str(score1), (440, 40), 40, "White")
- canvas.draw_text(str(score2), (140, 40), 40, "White")
- def keydown(key):
- global paddle1_vel, paddle2_vel
- #left player paddle
- if key == simplegui.KEY_MAP["w"]:
- paddle1_vel = -PADDLE_VEL
- elif key == simplegui.KEY_MAP["s"]:
- paddle1_vel = PADDLE_VEL
- #right player paddle
- if key == simplegui.KEY_MAP["up"]:
- paddle2_vel = -PADDLE_VEL
- elif key == simplegui.KEY_MAP["down"]:
- paddle2_vel = PADDLE_VEL
- def keyup(key):
- global paddle1_vel, paddle2_vel, paddle_vel
- #player1
- if key == simplegui.KEY_MAP["w"]:
- paddle1_vel = 0
- elif key == simplegui.KEY_MAP["s"]:
- paddle1_vel = 0
- #player2
- if key == simplegui.KEY_MAP["down"]:
- paddle2_vel = 0
- elif key == simplegui.KEY_MAP["up"]:
- paddle2_vel = 0
- # create frame
- frame = simplegui.create_frame("Pong", WIDTH, HEIGHT)
- frame.add_button("Restart", new_game, 100)
- frame.set_draw_handler(draw)
- frame.set_keydown_handler(keydown)
- frame.set_keyup_handler(keyup)
- # start frame
- new_game()
- frame.start()
Add Comment
Please, Sign In to add comment