Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.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 Pong-当任一玩家达到得分阈值时崩溃,而不是重置游戏_Python_Pygame_Pong - Fatal编程技术网

Python Pong-当任一玩家达到得分阈值时崩溃,而不是重置游戏

Python Pong-当任一玩家达到得分阈值时崩溃,而不是重置游戏,python,pygame,pong,Python,Pygame,Pong,问题是,每次显示赢家文本后(如果任何一个玩家的分数达到10或更高),游戏都会崩溃,并且当我声明应该调用main()函数时,无法重新调用该函数,正如下面的代码所示。因此,当它显示赢家文本时,它应该暂停游戏5秒,然后中断while循环并调用main(),但它在显示赢家文本后立即崩溃(请参见下面的屏幕截图)。winner文本的逻辑在my main()函数的顶部附近 不确定根本原因是什么,因为我在程序顶部调用了pygame.init()。任何帮助都将不胜感激!完整的代码如下。。。如果有人能运行它,让我

问题是,每次显示赢家文本后(如果任何一个玩家的分数达到10或更高),游戏都会崩溃,并且当我声明应该调用main()函数时,无法重新调用该函数,正如下面的代码所示。因此,当它显示赢家文本时,它应该暂停游戏5秒,然后中断while循环并调用main(),但它在显示赢家文本后立即崩溃(请参见下面的屏幕截图)。winner文本的逻辑在my main()函数的顶部附近

不确定根本原因是什么,因为我在程序顶部调用了pygame.init()。任何帮助都将不胜感激!完整的代码如下。。。如果有人能运行它,让我知道它崩溃的根本原因是什么,那就太好了。提前谢谢

import pygame

pygame.init()

WIDTH, HEIGHT = 750, 500
WINDOW = pygame.display.set_mode((WIDTH, HEIGHT))   

pygame.display.set_caption("PONG")  

WINNER_FONT = pygame.font.SysFont('comicsans', 100)

BLUE = (0, 0, 255)          
RED = (255, 0, 0)           
YELLOW = (255, 255, 0)     
WHITE = (255, 255, 255)     
BLACK = (0, 0, 0)           

class Paddle(pygame.sprite.Sprite):     
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)    
        self.image = pygame.Surface([10, 75])
        self.image.fill(WHITE)
        self.rect = self.image.get_rect()   
        self.paddle_speed = 4          
        self.points = 0

class Ball(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.Surface([10, 10])
        self.image.fill(YELLOW)
        self.rect = self.image.get_rect()
        self.speed = 2
        self.dx = 1    
        self.dy = 1

paddle1 = Paddle()
paddle1.image.fill(BLUE)
paddle1.rect.x = 25      
paddle1.rect.y = 225     

paddle2 = Paddle()
paddle2.image.fill(RED)
paddle2.rect.x = 715
paddle2.rect.y = 225

ball = Ball()
ball.rect.x = 375
ball.rect.y = 250

all_sprites = pygame.sprite.Group() 
all_sprites.add(paddle1, paddle2, ball)


def redraw():
    WINDOW.fill(BLACK)
    font = pygame.font.SysFont("Consolas", 35)
    text = font.render("---[PONG]---", 1, YELLOW)
    textRect = text.get_rect()      
    textRect.center = (WIDTH//2, 25)  
    WINDOW.blit(text, textRect)     

    #Player 1 score
    p1_score = font.render(str([paddle1.points]), 1, WHITE)
    p1Rect = p1_score.get_rect()    
    p1Rect.center = (50, 50)        
    WINDOW.blit(p1_score, p1Rect)   
    
    #Player 2 score
    p2_score = font.render(str([paddle2.points]), 1, WHITE)
    p2Rect = p2_score.get_rect()
    p2Rect.center = (700, 50)      
    WINDOW.blit(p2_score, p2Rect)
    
    all_sprites.draw(WINDOW)    
    pygame.display.update()     


def draw_winner(text): 
    draw_text = WINNER_FONT.render(text, 1, WHITE)
    WINDOW.blit(draw_text, (WIDTH//2 - draw_text.get_width()/2, HEIGHT//2 - draw_text.get_height()/2))
    pygame.display.update()
    pygame.time.delay(5000)


def main():
    run = True

    while run:
        pygame.time.delay(10)   
       
        for event in pygame.event.get():    
            if event.type == pygame.QUIT:  
                run = False
                pygame.quit()

        winner_text = ""
        if paddle1.points >= 10:
            winner_text = "Blue Wins!"

        if paddle2.points >= 10:
            winner_text = "Red Wins!"

        if winner_text != "":
            draw_winner(winner_text)
            break
            
        # Paddle movement        
        key = pygame.key.get_pressed()  
        if key[pygame.K_w]:
            paddle1.rect.y -= paddle1.paddle_speed  
        if key[pygame.K_s]:
            paddle1.rect.y += paddle1.paddle_speed  
        if key[pygame.K_UP]:
            paddle2.rect.y -= paddle2.paddle_speed
        if key[pygame.K_DOWN]:
            paddle2.rect.y += paddle2.paddle_speed

        # Ensures paddles never move off the screen
        if paddle1.rect.y < 0:
            paddle1.rect.y = 0
        
        if paddle1.rect.y > 425:
            paddle1.rect.y = 425

        if paddle2.rect.y < 0:
            paddle2.rect.y = 0
        
        if paddle2.rect.y > 425:
            paddle2.rect.y = 425

        # Ball movement
        ball.rect.x += ball.speed * ball.dx     
        ball.rect.y += ball.speed * ball.dy     

        # Setting up collision detection with the walls by changing ball's direction
        if ball.rect.y > 490:   
            ball.dy = -1        

        if ball.rect.x > 740:   
            ball.rect.x, ball.rect.y = 375, 250     
            paddle1.points += 1

        if ball.rect.y < 10:    
            ball.dy = 1         

        if ball.rect.x < 10:    
            ball.rect.x, ball.rect.y = 375, 250
            paddle2.points += 1

        # Setting up collision detection with the paddles
        if paddle1.rect.colliderect(ball.rect):
            ball.dx = 1     

        if paddle2.rect.colliderect(ball.rect):
            ball.dx = -1

        redraw()    
        
    main()

if __name__ == "__main__":
    main()
导入pygame
pygame.init()
宽度,高度=750500
WINDOW=pygame.display.set_模式((宽度、高度))
pygame.display.set_标题(“PONG”)
WINNER\u FONT=pygame.FONT.SysFont('comicsans',100)
蓝色=(0,0255)
红色=(255,0,0)
黄色=(255,255,0)
白色=(255,255,255)
黑色=(0,0,0)
班级桨(pygame.sprite.sprite):
定义初始化(自):
pygame.sprite.sprite.\uuuuu init\uuuuuuu(自我)
self.image=pygame.Surface([10,75])
self.image.fill(白色)
self.rect=self.image.get_rect()
自桨速度=4
self.points=0
班级舞会(pygame.sprite.sprite):
定义初始化(自):
pygame.sprite.sprite.\uuuuu init\uuuuuuu(自我)
self.image=pygame.Surface([10,10])
self.image.fill(黄色)
self.rect=self.image.get_rect()
自身速度=2
self.dx=1
self.dy=1
桨1=桨()
挡板1.图像.填充(蓝色)
桨1.rect.x=25
桨叶1.矩形y=225
桨2=桨()
挡板2.图像填充(红色)
桨叶2.矩形x=715
桨叶2.矩形y=225
ball=ball()
球形矩形x=375
球形矩形y=250
all_sprites=pygame.sprite.Group()
所有精灵。添加(桨1,桨2,球)
def redraw():
窗口填充(黑色)
font=pygame.font.SysFont(“控制台”,35)
text=font.render(“--[PONG]--”,1,黄色)
textRect=text.get_rect()
textRect.center=(宽度//2,25)
blit(text,textRect)
#球员1分
p1_分数=字体渲染(str([1.points]),1,白色)
p1Rect=p1_分数。get_rect()
p1Rect.center=(50,50)
窗口。blit(p1_分数,p1Rect)
#球员2得分
p2_score=font.render(str([2.points]),1,白色)
p2Rect=p2_分数。get_rect()
p2Rect.center=(700,50)
窗口。blit(p2_分数,p2Rect)
所有精灵。绘制(窗口)
pygame.display.update()
def draw_winner(文本):
draw\u text=WINNER\u FONT.render(文本,1,白色)
blit(draw\u text,(WIDTH//2-draw\u text.get\u WIDTH()/2,HEIGHT//2-draw\u text.get\u HEIGHT()/2))
pygame.display.update()
pygame.时间延迟(5000)
def main():
运行=真
运行时:
pygame。时间。延迟(10)
对于pygame.event.get()中的事件:
如果event.type==pygame.QUIT:
运行=错误
pygame.quit()
winner_text=“”
如果1.1点>=10:
winner\u text=“蓝色获胜!”
如果2.2点>=10:
winner\u text=“红色获胜!”
如果赢了(文本)="":
抽签赢家(赢家文本)
打破
#桨叶运动
key=pygame.key.get_pressed()
如果键[pygame.K_w]:
桨1.垂直y-=桨1.桨速度
如果键[pygame.K_s]:
桨1.垂直y+=桨1.桨速度
如果键[pygame.K_UP]:
桨叶2.垂直y-=桨叶2.桨叶速度
如果键[pygame.K_DOWN]:
桨叶2.垂直y+=桨叶2.桨叶速度
#确保挡板不会离开屏幕
如果1.rect.y<0:
桨1.rect.y=0
如果1.矩形y>425:
桨叶1.矩形y=425
如果叶片2.rect.y<0:
桨叶2.矩形y=0
如果桨叶2.矩形y>425:
桨叶2.矩形y=425
#球的运动
ball.rect.x+=ball.speed*ball.dx
ball.rect.y+=ball.speed*ball.dy
#通过改变球的方向设置和墙的碰撞检测
如果ball.rect.y>490:
ball.dy=-1
如果ball.rect.x>740:
ball.rect.x,ball.rect.y=375250
1.1分+=1分
如果球径y<10:
ball.dy=1
如果ball.rect.x<10:
ball.rect.x,ball.rect.y=375250
2.2分+=1分
#使用挡板设置碰撞检测
如果桨1.rect.collide rect(ball.rect):
ball.dx=1
如果桨2.rect.collide rect(ball.rect):
ball.dx=-1
重画
main()
如果名称=“\uuuuu main\uuuuuuuu”:
main()

不要递归调用应用程序循环,也不要在应用程序循环中“等待”。见和

创建一个初始化所有游戏状态的
init
函数:

def init():
全球桨叶1、桨叶2、球、所有精灵
桨1=桨()
挡板1.图像.填充(蓝色)
桨1.rect.x=25
桨叶1.矩形y=225
桨2=桨()
挡板2.图像填充(红色)
桨叶2.矩形x=715
桨叶2.矩形y=225
ball=ball()
球形矩形x=375
球形矩形y=250
all_sprites=pygame.sprite.Group()
所有精灵。添加(桨1,桨2,球)
当游戏需要重新启动时,调用
init
函数:

def main():
运行=真
运行时:
# [...]
如果赢了(文本)="":
抽签赢家(赢家文本)
init()
# [..