Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用pygame编码乒乓球中的反弹运动_Python_Pygame_Pong - Fatal编程技术网

Python 如何使用pygame编码乒乓球中的反弹运动

Python 如何使用pygame编码乒乓球中的反弹运动,python,pygame,pong,Python,Pygame,Pong,我是python中的一个noob,我正在尝试重新创建乒乓球游戏,我正在尽可能地独自完成它 以下是我目前代码中存在的问题: 我基本上对球在边缘反弹时的每一个可能的运动进行了编码。我花了好几个小时在上面,我让它开始工作,我只是想知道是否有更有效的方法用我的代码生成类似的输出(因为我知道这应该是一个初学者项目) 每次球反弹过边缘时,分数会在瞬间增加,并且每次球重生时,分数都会回到0 如何使球在随机方向上繁殖?在每一轮的开始(和重新开始)时 下面是我的类代码和程序的主要功能: import pygame

我是python中的一个noob,我正在尝试重新创建乒乓球游戏,我正在尽可能地独自完成它

以下是我目前代码中存在的问题:

  • 我基本上对球在边缘反弹时的每一个可能的运动进行了编码。我花了好几个小时在上面,我让它开始工作,我只是想知道是否有更有效的方法用我的代码生成类似的输出(因为我知道这应该是一个初学者项目)
  • 每次球反弹过边缘时,分数会在瞬间增加,并且每次球重生时,分数都会回到0
  • 如何使球在随机方向上繁殖?在每一轮的开始(和重新开始)时
  • 下面是我的类代码和程序的主要功能:

    import pygame
    import random
    from rect_button import Button
    
    pygame.init()
    
    WIDTH = 800
    HEIGHT = 500
    window = pygame.display.set_mode((WIDTH, HEIGHT))
    
    TITLE = "Pong"
    pygame.display.set_caption(TITLE)
    
    # COLORS
    black = (0, 0, 0)
    white = (255, 255, 255)
    red = (255, 0, 0)
    green = (0, 255, 0)
    
    # FONTS
    small_font = pygame.font.SysFont("courier", 20)
    large_font = pygame.font.SysFont("courier", 60, True)
    
    
    class Paddle:
        def __init__(self, x, y, width, height, vel, color):
            self.x = x
            self.y = y
            self.width = width
            self.height = height
            self.vel = vel
            self.color = color
    
        def draw(self, window):
            pygame.draw.rect(window, self.color, (self.x, self.y, self.width, self.height), 0)
    
    
    class Ball:
        def __init__(self, x, y, side, vel, color):
            self.x = x
            self.y = y
            self.side = side
            self.vel = vel
            self.color = color
            self.lower_right = False
            self.lower_left = True
            self.upper_right = False
            self.upper_left = False
            self.ball_bag = []
            self.last_movement = 'ball.lower_right'
    
        def draw(self, window):
            pygame.draw.rect(window, self.color, (self.x, self.y, self.side, self.side), 0)
    
        def move_lower_right(self):
            self.x += self.vel
            self.y += self.vel
    
        def move_upper_right(self):
            self.x += self.vel
            self.y -= self.vel
    
        def move_upper_left(self):
            self.x -= self.vel
            self.y -= self.vel
    
        def move_lower_left(self):
            self.x -= self.vel
            self.y += self.vel
    
        def start(self):
            self.lower_right = True
            self.lower_left = False
            self.upper_right = False
            self.upper_left = False
    
            self.last_movement = 'ball.lower_left'
    
            # return random.choice([self.lower_right, self.lower_left, self.upper_left, self.upper_right]) is True
    
    def main():
        run = True
        fps = 60
        clock = pygame.time.Clock()
    
        # Initializing Paddles
    
        left_paddle = Paddle(20, 100, 10, 50, 5, white)
        right_paddle = Paddle(770, 350, 10, 50, 5, white)
    
        balls = []
    
        def redraw_window():
            window.fill(black)
    
            left_paddle.draw(window)
            right_paddle.draw(window)
            for ball in balls:
                ball.draw(window)
    
            player_A_text = small_font.render("Player A: " + str(score_A), 1, white)
            player_B_text = small_font.render("Player B: " + str(score_B), 1, white)
            window.blit(player_A_text, (320 - int(player_A_text.get_width() / 2), 10))
            window.blit(player_B_text, (480 - int(player_B_text.get_width() / 2), 10))
    
            pygame.draw.rect(window, white, (20, 450, 760, 1), 0)
            pygame.draw.rect(window, white, (20, 49, 760, 1), 0)
            pygame.draw.rect(window, white, (19, 50, 1, 400), 0)
            pygame.draw.rect(window, white, (780, 50, 1, 400), 0)
    
            pygame.display.update()
    
        while run:
            score_A = 0
            score_B = 0
            clock.tick(fps)
    
            if len(balls) == 0:
                ball = Ball(random.randrange(320, 465), random.randrange(200, 285), 15, 3, white)
                balls.append(ball)
            if ball.lower_left:
                ball.move_lower_left()
    
                if ball.last_movement == 'ball.lower_right':
                    if ball.y + ball.side > HEIGHT - 50:
                        ball.lower_left = False
                        ball.last_movement = 'ball.lower_left'
                        ball.upper_left = True
    
                if ball.last_movement == 'ball.upper_left':
                    if ball.x < 30:
                        if left_paddle.x < ball.x < left_paddle.x + left_paddle.width:
                            if left_paddle.y < ball.y + ball.side < left_paddle.y + left_paddle.height:
                                ball.lower_left = False
                                ball.last_movement = 'ball.lower_left'
                                ball.lower_right = True
                        else:
                            score_B += 1
                            balls.remove(ball)
                            #ball.start()
    
                    if ball.y + ball.side > HEIGHT - 50:
                        ball.lower_left = False
                        ball.last_movement = 'ball.lower_left'
                        ball.upper_left = True
    
            if ball.upper_left:
                ball.move_upper_left()
    
                if ball.last_movement == 'ball.lower_left':
                    if ball.x < 30:
                        if left_paddle.x < ball.x < left_paddle.x + left_paddle.width:
                            if left_paddle.y < ball.y + ball.side < left_paddle.y + left_paddle.height:
                                ball.upper_left = False
                                ball.last_movement = 'ball.upper_left'
                                ball.upper_right = True
                        else:
                            score_B += 1
                            balls.remove(ball)
                            #ball.start()
    
                    if ball.y < 50:
                        ball.upper_left = False
                        ball.last_movement = 'ball.upper_left'
                        ball.lower_left = True
    
                if ball.last_movement == 'ball.upper_right':
                    if ball.y < 50:
                        ball.upper_left = False
                        ball.last_movement = 'ball.upper_left'
                        ball.lower_left = True
    
            if ball.upper_right:
                ball.move_upper_right()
    
                if ball.last_movement == 'ball.upper_left':
                    if ball.y < 50:
                        ball.upper_right = False
                        ball.last_movement = 'ball.upper_right'
                        ball.lower_right = True
    
                if ball.last_movement == 'ball.lower_right':
                    if ball.x + ball.side > WIDTH - 30:
                        if right_paddle.x + right_paddle.width > ball.x + ball.side > right_paddle.x:
                            if right_paddle.y < ball.y + ball.side < right_paddle.y + right_paddle.height:
                                ball.upper_right = False
                                ball.last_movement = 'ball.upper_right'
                                ball.upper_left = True
                        else:
                            score_A += 1
                            balls.remove(ball)
                            #ball.start()
    
                    if ball.y < 50:
                        ball.upper_right = False
                        ball.last_movement = 'ball.upper_right'
                        ball.lower_right = True
    
            if ball.lower_right:
                ball.move_lower_right()
    
                if ball.last_movement == 'ball.upper_right':
                    if ball.y + ball.side > HEIGHT - 50:
                        ball.lower_right = False
                        ball.last_movement = 'ball.lower_right'
                        ball.upper_right = True
    
                    if ball.x + ball.side > WIDTH - 30:
                        if right_paddle.x + right_paddle.width > ball.x + ball.side > right_paddle.x:
                            if right_paddle.y < ball.y + ball.side < right_paddle.y + right_paddle.height:
                                ball.lower_right = False
                                ball.last_movement = 'ball.lower_right'
                                ball.lower_left = True
                        else:
                            score_A += 1
                            balls.remove(ball)
                            #ball.start()
    
                if ball.last_movement == 'ball.lower_left':
                    if ball.y + ball.side > HEIGHT - 50:
                        ball.lower_right = False
                        ball.last_movement = 'ball.lower_right'
                        ball.upper_right = True
    
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    run = False
                    quit()
    
            keys = pygame.key.get_pressed()
    
            if keys[pygame.K_UP] and right_paddle.y > 50:
                right_paddle.y -= right_paddle.vel
            if keys[pygame.K_w] and left_paddle.y > 50:
                left_paddle.y -= left_paddle.vel
            if keys[pygame.K_DOWN] and right_paddle.y + right_paddle.height < HEIGHT - 50:
                right_paddle.y += right_paddle.vel
            if keys[pygame.K_s] and left_paddle.y + left_paddle.height < HEIGHT - 50:
                left_paddle.y += left_paddle.vel
            if keys[pygame.K_SPACE]:
                pass
    
            redraw_window()
    
        quit()
    
    
    def main_menu():
        run = True
    
        play_button = Button(green, 100, 350, 150, 75, "Play Pong")
        quit_button = Button(red, 550, 350, 150, 75, "Quit")
    
        pong_text = large_font.render("Let's Play Pong!!!", 1, black)
    
        while run:
            window.fill(white)
    
            play_button.draw(window, black)
            quit_button.draw(window, black)
    
            window.blit(pong_text, (int(WIDTH / 2 - pong_text.get_width() / 2), 100))
    
            pygame.display.update()
    
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    run = False
                    quit()
    
                if event.type == pygame.MOUSEMOTION:
                    if play_button.hover(pygame.mouse.get_pos()):
                        play_button.color = (0, 200, 0)
                    else:
                        play_button.color = green
                    if quit_button.hover(pygame.mouse.get_pos()):
                        quit_button.color = (200, 0, 0)
                    else:
                        quit_button.color = red
    
                if event.type == pygame.MOUSEBUTTONDOWN:
                    if play_button.hover(pygame.mouse.get_pos()):
                        main()
                    if quit_button.hover(pygame.mouse.get_pos()):
                        run = False
                        quit()
    
    
    main_menu()
    
    
    导入pygame
    随机输入
    从矩形按钮导入按钮
    pygame.init()
    宽度=800
    高度=500
    window=pygame.display.set_模式((宽度、高度))
    TITLE=“Pong”
    pygame.display.set_标题(标题)
    #颜色
    黑色=(0,0,0)
    白色=(255,255,255)
    红色=(255,0,0)
    绿色=(0,255,0)
    #字体
    small\u font=pygame.font.SysFont(“courier”,20)
    大字体=pygame.font.SysFont(“courier”,60,True)
    班级桨:
    定义初始值(自身、x、y、宽度、高度、级别、颜色):
    self.x=x
    self.y=y
    self.width=宽度
    自我高度=高度
    self.vel=vel
    self.color=颜色
    def绘图(自,窗口):
    pygame.draw.rect(窗口,self.color,(self.x,self.y,self.width,self.height),0)
    班级舞会:
    定义初始值(自身、x、y、侧面、水平、颜色):
    self.x=x
    self.y=y
    self.side=side
    self.vel=vel
    self.color=颜色
    self.lower\u right=错误
    self.lower_left=真
    self.upper\u right=错误
    self.upper_left=错误
    self.ball_bag=[]
    self.last\u movement='ball.lower\u right'
    def绘图(自,窗口):
    pygame.draw.rect(窗口,self.color,(self.x,self.y,self.side,self.side),0)
    def右下移动(自):
    self.x+=self.vel
    self.y+=self.vel
    def移动到右上角(自身):
    self.x+=self.vel
    self.y-=self.vel
    def移动到左上角(自身):
    self.x-=self.vel
    self.y-=self.vel
    def移动到左下方(自身):
    self.x-=self.vel
    self.y+=self.vel
    def启动(自):
    self.lower_right=真
    self.lower_left=错误
    self.upper\u right=错误
    self.upper_left=错误
    self.last_movement='ball.lower_left'
    #返回random.choice([self.lower\u right,self.lower\u left,self.upper\u left,self.upper\u right])为真
    def main():
    运行=真
    fps=60
    clock=pygame.time.clock()
    #初始化桨
    左桨=桨(20、100、10、50、5、白色)
    右桨=桨(770、350、10、50、5、白色)
    球=[]
    def redraw_窗口():
    窗口填充(黑色)
    左划桨(窗口)
    右划桨。划(窗)
    对于球中球:
    球。抽签(窗口)
    player_A_text=小字体。渲染(“player A:+str(score_A),1,白色)
    player_B_text=小字体。渲染(“player B:+str(score_B),1,白色)
    blit(player\u A\u text,(320-int(player\u A\u text.get\u width()/2),10))
    blit(player_B_text,(480-int(player_B_text.get_width()/2),10))
    pygame.draw.rect(窗口,白色,(204507601),0)
    pygame.draw.rect(窗口,白色,(20,49,760,1),0)
    pygame.draw.rect(窗口,白色,(19,50,1400),0)
    pygame.draw.rect(窗口,白色,(780,50,1400),0)
    pygame.display.update()
    运行时:
    得分A=0
    得分B=0
    时钟滴答声(fps)
    如果len(balls)==0:
    球=球(random.randrange(320465)、random.randrange(200285)、15、3、白色)
    balls.append(ball)
    如果ball.lower_向左:
    球。移到左下()
    如果ball.last_movement=='ball.lower_right':
    如果ball.y+ball.side>高度-50:
    ball.lower_left=错误
    ball.last_movement='ball.lower_left'
    ball.upper_left=真
    如果ball.last_movement=='ball.upper_left':
    如果球体x<30:
    如果左桨.x<球.x<左桨.x+左桨.width:
    如果左桨.y<球.y+球侧<左桨.y+左桨.H:
    ball.lower_left=错误
    ball.last_movement='ball.lower_left'
    ball.lower_right=真
    其他:
    得分B+=1
    球。移除(球)
    #开始
    如果ball.y+ball.side>高度-50:
    ball.lower_left=错误
    ball.last_movement='ball.lower_left'
    ball.upper_left=真
    如果ball.upper_向左:
    球。向上向左移动()
    如果ball.last_movement=='ball.lower_left':
    如果球体x<30:
    如果左桨.x<球.x<左桨.x+左桨.width:
    如果左桨.y<球.y+球侧<左桨.y+左桨.H:
    ball.upper_left=错误
    ball.last_movement='ball.upper_left'
    ball.upper_right=真
    其他:
    得分B+=1
    球。移除(球)
    #开始
    如果球y<50:
    ball.upper_left=错误
    ball.last_movement='ball.upper_left'
    ball.lower_left=真
    如果ball.last_movement=='ball.upper_right':
    如果球y<50:
    
    class Ball:
    def __init__(self, x, y, color, size):
        self.x = x
        self.y = y
        self.color = color
        self.size = size
        self.direction = [random.randint(0, 1), random.randint(0, 1)]
        self.speed = [0.5, random.uniform(0.1, 1)]
        
    def draw(self, display):
        pygame.draw.rect(display, self.color, (self.x, self.y, self.size, self.size))
    
    def move(self):
        if self.direction[0]:
            self.x += self.speed[0]
        else:
            self.x -= self.speed[0]
        if self.direction[1]:
            self.y += self.speed[0]
        else:
            self.y -= self.speed[0]
    
    def switchDirection(self):
        self.direction = not self.direction
        self.speed[1] = random.uniform(0.1, 1)
    
    def move(self, vel, up=pygame.K_UP, down=pygame.K_DOWN):
        keys = pygame.key.get_perssed()
        if keys[up]:
            self.y -= vel
        if keys[down]:
            self.y += vel
    
    import random
    import pygame
    
    WIN = pygame.display
    D = WIN.set_mode((800, 500))
    
    class Paddle:
        def __init__(self, x, y, width, height, vel, color):
            self.x = x
            self.y = y
            self.width = width
            self.height = height
            self.vel = vel
            self.color = color
    
        def move(self, vel, up=pygame.K_UP, down=pygame.K_DOWN):
            keys = pygame.key.get_pressed()
            if keys[up]:
                self.y -= vel
            if keys[down]:
                self.y += vel
            
        def draw(self, window):
            pygame.draw.rect(window, self.color, (self.x, self.y, self.width, self.height), 0)
    
        def getRect(self):
            return pygame.Rect(self.x, self.y, self.width, self.height)
    
    left_paddle = Paddle(20, 100, 10, 50, 5, (0, 0, 0))
    right_paddle = Paddle(770, 350, 10, 50, 5, (0, 0, 0))
    
    class Ball:
        def __init__(self, x, y, color, size):
            self.x = x
            self.y = y
            self.color = color
            self.size = size
            self.direction = [random.randint(0, 1), random.randint(0, 1)]
            self.speed = [0.3, random.uniform(0.2, 0.2)]
            
        def draw(self, window):
            pygame.draw.rect(window, self.color, (self.x, self.y, self.size, self.size))
    
        def switchDirection(self):
            self.direction[0] = not self.direction[0]
            self.direction[1] = not self.direction[1]
            self.speed = [0.2, random.uniform(0.1, 0.5)]
    
        def bounce(self):
            self.direction[1] = not self.direction[1]
            self.speed = [0.2, random.uniform(0.01, 0.2)]
            
        def move(self):
            if self.direction[0]:
                self.x += self.speed[0]
            else:
                self.x -= self.speed[0]
            if self.direction[1]:
                self.y += self.speed[1]
            else:
                self.y -= self.speed[1]
    
        def getRect(self):
            return pygame.Rect(self.x, self.y, self.size, self.size)
    
        def boundaries(self):
            if ball.x <= 10:
                self.switchDirection()
            if ball.x + self.size >= 800:
                self.switchDirection()
            if ball.y + self.size >= 490:
                self.bounce()
            if ball.y <= 0:
                self.bounce()
    
    
    ball = Ball(400, 250, (255, 0, 0), 20)
    while True:
        pygame.event.get()
        D.fill((255, 255, 255))
    
        ball.draw(D)
        ball.boundaries()
        ball.move()
        #print(ball.x, ball.y)
        
        left_paddle.draw(D)
        right_paddle.draw(D)
    
        right_paddle.move(0.4)
        left_paddle.move(0.4, down=pygame.K_s, up=pygame.K_w)
    
        if left_paddle.getRect().colliderect(ball.getRect()):
            ball.switchDirection()
        if right_paddle.getRect().colliderect(ball.getRect()):
            ball.switchDirection()
        
        WIN.flip()
    
    import pygame
    
    
    class Ball:
    
        def __init__(self, bounds, color):
            from random import randint, choice
            self.bounds = bounds
            self.position = pygame.math.Vector2(
                randint(self.bounds.left, self.bounds.left+self.bounds.width),
                randint(self.bounds.top, self.bounds.top+self.bounds.height)
            )
            self.velocity = pygame.math.Vector2(choice((-1, 1)), choice((-1, 1)))
            self.color = color
            self.size = 8
    
        def draw(self, window):
            pygame.draw.rect(
                window,
                self.color,
                (
                    self.position.x-self.size,
                    self.position.y-self.size,
                    self.size*2,
                    self.size*2
                ),
                0
            )
    
        def update(self):
            self.position.x += self.velocity.x
            self.position.y += self.velocity.y
            if not self.bounds.left+self.size < self.position.x < self.bounds.left+self.bounds.width-self.size:
                self.velocity.x *= -1
            if not self.bounds.top+self.size < self.position.y < self.bounds.top+self.bounds.height-self.size:
                self.velocity.y *= -1
    
    
    def main():
    
        from random import randint
    
        window_width, window_height = 800, 500
    
        window = pygame.display.set_mode((window_width, window_height))
        pygame.display.set_caption("Pong")
    
        clock = pygame.time.Clock()
    
        black = (0, 0, 0)
        white = (255, 255, 255)
    
        padding = 20
    
        bounds = pygame.Rect(padding, padding, window_width-(padding*2), window_height-(padding*2))
    
        ball = Ball(bounds, white)
    
        def redraw_window():
            window.fill(black)
            pygame.draw.rect(
                window,
                white,
                (
                    padding,
                    padding,
                    window_width-(padding*2),
                    window_height-(padding*2)
                ),
                1
            )
    
            ball.draw(window)
    
            pygame.display.update()
    
        while True:
            clock.tick(60)
            ball.update()
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    break
            else:
                redraw_window()
                continue
            break
        pygame.quit()
        return 0
            
    
    if __name__ == "__main__":
        import sys
        sys.exit(main())