这是第一部分的最后一次作业
大概涉及到键盘的信息获取使之控制一些东西,交互式的很愉快(于是自己跟自己打了很久= =)
对全局有一些把握并设计好步骤之后,有些事情也不是那么难嘛> <
遗憾是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()