Python Pygame Pong游戏问题

时间:2013-02-05 21:52:18

标签: python pygame pong

所以基本上我在这里尝试编写的是使用Python编程语言和Pygame模块的Pong游戏。
我的问题如下:

  1. 游戏有时会卡在一个循环中,其中AI桨位于那里而一遍又一次失去
  2. 球有时会上下跳动?我不知道为什么......
  3. 球只是来回走动?我无法弄清楚为什么它不跟随我想要的随机线......
  4. 而我最大的问题,似乎当球击中顶部或底部时,它就会消失,游戏就会继续,好像它还在蹦蹦跳跳。
  5. 我的代码

    # Pong
    import random, pygame, sys
    from pygame.locals import *
    
    FPS = 300
    WINWID = 640
    WINHEI = 480
    
    BROWN = (102, 51, 0)
    LIGHTBLUE = (0, 204, 204)
    GREEN = (0, 153, 0)
    PADDLECOLOR = (255, 255, 255)
    BALLCOLOR = PADDLECOLOR
    BACKGROUNDCOLOR = (0, 0, 0)
    
    def main():
        global FPSCLOCK, DISPLAYSURF
        SPEED = 1
        DIFF = 1.0 # AI paddle speed handicap
        ball_speed = 1
        AISIGHT = WINWID/6
        FONT = "Times New Roman"
        pygame.init()
        DEFAULTFONT = pygame.font.SysFont(FONT, 16)
        BIGGERFONT = pygame.font.SysFont(FONT, 32)
        FPSCLOCK = pygame.time.Clock()
        DISPLAYSURF = pygame.display.set_mode((WINWID, WINHEI))
        DISPLAYSURF.fill(BACKGROUNDCOLOR)
        BACKGROUND = pygame.Rect(0, 0, WINWID, WINHEI)
        pygame.display.set_caption('Pong')
        paddleUP, paddleDOWN = False, False    
        ballpos = (WINWID/2, WINHEI/2)
        AIpoint, PLAYERpoint = 0, 0
        score = "Player:%2f || Computer:%2f" % (AIpoint, PLAYERpoint)
        paddle = WINHEI/2
        AIpaddle = paddle
        pygame.draw.rect(DISPLAYSURF, BACKGROUNDCOLOR, BACKGROUND)
        pygame.draw.line(DISPLAYSURF, PADDLECOLOR, (9, paddle-20), (9, paddle+20), 3)
        pygame.draw.line(DISPLAYSURF, PADDLECOLOR, (629, AIpaddle-20), (629, AIpaddle+20), 3)
        pygame.draw.circle(DISPLAYSURF, BALLCOLOR, ballpos, 5)
        slope, y_int = ballpath(None, ballpos[0], ballpos[1])
        while True:
            for event in pygame.event.get():
                direction = None
                if event.type == QUIT:
                    terminate()
                elif event.type == KEYDOWN:
                    if (event.key == K_UP or event.key == K_w):
                        paddleUP = True
                    elif (event.key == K_DOWN or event.key == K_s):
                        paddleDOWN = True
                elif event.type == KEYUP:
                    if (event.key == K_UP or event.key == K_w):
                        paddleUP = False
                    elif (event.key == K_DOWN or event.key == K_s):
                        paddleDOWN = False
            # move player paddle
            if paddleUP and paddle >= 20:
                paddle-=SPEED
            elif paddleDOWN and paddle <= 460:
                paddle+=SPEED
            # move AI paddle
            if ballpos[0] > (AISIGHT):
                if AIpaddle-20 < ballpos[1] and AIpaddle <= 460:
                    AIpaddle+=SPEED/DIFF
                elif AIpaddle+20 > ballpos[1] and AIpaddle >= 20:
                    AIpaddle-=SPEED/DIFF
            # move ball
            x = ballpos[0] + ball_speed
            y = (slope*x) + y_int
            ballpos = (x, y)
            # if it hits a paddle
            if 9 < ballpos[0] < 11:
                if paddle-20 < ballpos[1] < paddle+20:
                    slope, y_int = ballpath(None, ballpos[0], ballpos[1])
                    ball_speed*=-1
            elif 629 < ballpos[0] < 631:
                if AIpaddle-20 < ballpos[1] < AIpaddle+20:
                    slope, y_int = ballpath(None, ballpos[0], ballpos[1])
                    ball_speed*=-1
            # if it hits the top or bottom
            if WINHEI-5 > ballpos[1] or ballpos[1] < 5:
                slope, y_int = ballpath(slope, ballpos[0], ballpos[1])
            # if paddle misses ball
            if ballpos[0] < 5:
                AIpoint+=1
                score = "Player:%2f || Computer:%2f" % (PLAYERpoint, AIpoint)
                ballpos = (WINWID/2, WINHEI/2)
                pygame.draw.rect(DISPLAYSURF, (0, 0, 0, 100), pygame.Rect(0, 0, 640, 480))
                DISPLAYSURF.blit(BIGGERFONT.render("Point: Computer", 1, PADDLECOLOR), (WINWID/3, WINHEI/3))
                paddle, AIpaddle = WINWID/2, WINWID/2
                for i in range(5):
                    FPSCLOCK.tick(FPS)
            elif ballpos[0] > 635 and AIpaddle-20 < ballpos[1] < AIpaddle+20:
                PLAYERpoint+=1
                score = "Player:%2f || Computer:%2f" % (PLAYERpoint, AIpoint)
                ballpos = (WINWID/2, WINHEI/2)
                pygame.draw.rect(DISPLAYSURF, (0, 0, 0, 100), pygame.Rect(0, 0, 640, 480))
                DISPLAYSURF.blit(BIGGERFONT.render("Point: Player", 1, PADDLECOLOR), (WINWID/3, WINHEI/3))
                for i in range(5):
                    FPSCLOCK.tick(FPS)
    
    
            pygame.draw.rect(DISPLAYSURF, BACKGROUNDCOLOR, BACKGROUND)
            pygame.draw.line(DISPLAYSURF, PADDLECOLOR, (9, paddle-20), (9, paddle+20), 3)
            pygame.draw.line(DISPLAYSURF, PADDLECOLOR, (629, AIpaddle-20), (629, AIpaddle+20), 3)
            pygame.draw.circle(DISPLAYSURF, BALLCOLOR, ballpos, 5)
            DISPLAYSURF.blit(DEFAULTFONT.render(score, 1, PADDLECOLOR), (WINWID/3, 20))
            pygame.display.update()
            FPSCLOCK.tick(FPS)
    
    
    def ballpath(old_slope, ball_x, ball_y):
        if old_slope == None:
            slope = int(random.random() * 2)
        else:
            slope = old_slope * -1
        y_int = ball_y - (slope * ball_x)
        return slope, y_int
    
    def terminate():
        pygame.quit()
        sys.exit()
    
    if __name__ == '__main__':
        main()
    

1 个答案:

答案 0 :(得分:0)

我清理了你的代码。它应该对如何使用类有所帮助。 http://pastebin.com/rZF3Gr0D

注意事项:

  • 在得分事件发生时打印
  • 使用keystate vs“on events”进行划桨移动。它使这种输入更容易。
  • Sprite group's让您“分批”或“检查”碰撞。
  • 删除了全局关键字。游戏拥有大部分东西。
  • 在所有地方使用Rect个功能和属性。例如ball.rect.center = screen.get_rect().center
  • 球的随机角度通过trig生成。
  • 封装帧率。接下来,您将进入基于时间的运动。为了简单起见,我把它留了下来。
  • Color()可让您做很多事情,包括Color("red")Color("gray40")等......