Mini-project # 4

这是第一部分的最后一次作业

大概涉及到键盘的信息获取使之控制一些东西,交互式的很愉快(于是自己跟自己打了很久= =)

对全局有一些把握并设计好步骤之后,有些事情也不是那么难嘛> <

遗憾是paddle的速度设计的太小了= = 可以再大一点

# 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
LEFT = False
RIGHT = True
ball_pos = [WIDTH / 2, HEIGHT / 2]
ball_vel = [0, 0]
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
# 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(2, 5)
    ball_vel[1] = random.randrange(1, 4)
    if(direction == LEFT):
        ball_vel[0] = -ball_vel[0]
# check if the ball is in the paddle
def isinpaddle(pos): 
    if(ball_pos[1] >= pos - HALF_PAD_HEIGHT) and (ball_pos[1] <= pos + HALF_PAD_HEIGHT):
        return True
    return False
#vel = 1.1 * vel when hit paddle
def speed_up():
    global ball_vel
    ball_vel[0] = 1.1 * ball_vel[0]
    ball_vel[1] = 1.1*ball_vel[1]


# define event handlers
def new_game():
    global paddle1_pos, paddle2_pos, paddle1_vel, paddle2_vel  # these are numbers
    global score1, score2  # these are ints
    score1 = 0
    score2 = 0
    paddle1_pos= HEIGHT/2
    paddle2_pos= HEIGHT/2
    spawn_ball(1)

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]
        
    # draw ball
    canvas.draw_circle(ball_pos, BALL_RADIUS, 2, "Red", "White")
    
    # update paddle's vertical position, keep paddle on the screen
    tmp = paddle1_pos + paddle1_vel
        #avoid out of bound
    if tmp >= HALF_PAD_HEIGHT and tmp <= HEIGHT - HALF_PAD_HEIGHT:
        paddle1_pos += paddle1_vel
    tmp = paddle2_pos + paddle2_vel
    if tmp >= HALF_PAD_HEIGHT and tmp <= HEIGHT - HALF_PAD_HEIGHT:
        paddle2_pos += paddle2_vel
        
    # draw paddles
        #1
    canvas.draw_line([HALF_PAD_WIDTH ,paddle1_pos - HALF_PAD_HEIGHT],
                     [HALF_PAD_WIDTH,paddle1_pos + HALF_PAD_HEIGHT], PAD_WIDTH, "White")
        #2
    canvas.draw_line([WIDTH-HALF_PAD_WIDTH,paddle2_pos - HALF_PAD_HEIGHT],
                     [WIDTH-HALF_PAD_WIDTH,paddle2_pos + HALF_PAD_HEIGHT], PAD_WIDTH, "White")
    
    # determine whether paddle and ball collide    
    if(ball_pos[0] + BALL_RADIUS >= WIDTH - PAD_WIDTH):
        #print ball_pos[0] + BALL_RADIUS, WIDTH - PAD_WIDTH, paddle2_pos, ball_pos[1]
        if (isinpaddle(paddle2_pos) == True):
            speed_up()
            ball_vel[0] = -ball_vel[0]
        else:
            score1 += 1
            spawn_ball(LEFT)
        
    if(ball_pos[1] >= HEIGHT - BALL_RADIUS):
        ball_vel[1] = -ball_vel[1]
    
    if(ball_pos[0] - BALL_RADIUS <= PAD_WIDTH):
        if (isinpaddle(paddle1_pos) == True):
            speed_up()
            ball_vel[0] = -ball_vel[0]
        else:
            score2 += 1
            spawn_ball(RIGHT)
    if(ball_pos[1] <= BALL_RADIUS):
        ball_vel[1] = -ball_vel[1]
    # draw scores
    canvas.draw_text(str(score1),[WIDTH / 2 - 64, 44],20,"White")
    canvas.draw_text(str(score2),[WIDTH / 2 + 44, 44],20,"White")
def keydown(key):
    global paddle1_vel, paddle2_vel
    if key == simplegui.KEY_MAP["down"]:
        paddle2_vel = 2
    elif key == simplegui.KEY_MAP["up"]:
        paddle2_vel = -2
    if key == simplegui.KEY_MAP["w"]:
        paddle1_vel = -2
    elif key == simplegui.KEY_MAP["s"]:
        paddle1_vel = 2
def keyup(key):
    global paddle1_vel, paddle2_vel
    if key == simplegui.KEY_MAP["down"]:
        paddle2_vel = 0
    elif key == simplegui.KEY_MAP["up"]:
        paddle2_vel = 0
    if key == simplegui.KEY_MAP["w"]:
        paddle1_vel = 0
    elif key == simplegui.KEY_MAP["s"]:
        paddle1_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("Reset", new_game)

# start frame
new_game()
frame.start()
View Code
原文地址:https://www.cnblogs.com/bbbbbq/p/4749390.html