zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    Huffman树与编码
    Python引用复制,参数传递,弱引用与垃圾回收
    Git使用说明
    numpy使用指南
    Python Socket
    温故知新之 数据库的事务、隔离级别、锁
    Oracle数据库的语句级读一致性
    VirtualBox NAT方式与主机互相通信
    Linux的定时任务
    Redis学习
  • 原文地址:https://www.cnblogs.com/bbbbbq/p/4749390.html
Copyright © 2011-2022 走看看