Python 为什么我必须一次又一次地关闭pygame窗口?

Python 为什么我必须一次又一次地关闭pygame窗口?,python,pygame,Python,Pygame,我做了一个汽车游戏,下面是我的代码:- import pygame import random from pathlib import Path import os os.chdir(Path(__file__).parent) win_w = 300 win_h = 480 pygame.init() win = pygame.display.set_mode((win_w, win_h)) #icon = pygame.image.load('icon.png') #pygame.disp

我做了一个汽车游戏,下面是我的代码:-

import pygame
import random
from pathlib import Path
import os
os.chdir(Path(__file__).parent)

win_w = 300
win_h = 480
pygame.init()
win = pygame.display.set_mode((win_w, win_h))
#icon = pygame.image.load('icon.png')
#pygame.display.set_icon(icon)
pygame.display.set_caption('Game')

def main():
    blue = (51, 51, 255)
    grey = (128, 128, 128)
    light_grey = (200, 200, 200)
    orange = (255, 175, 26)
    white = (255, 255, 255)
    black = (0, 0, 0)
    green = (0, 255, 0)
    red = (255, 71, 26)
    car_speed = 15
    score = 0
    time = 85
    
    class mainCar(pygame.sprite.Sprite):
        def __init__(self):
            pygame.sprite.Sprite.__init__(self)
            self.image = pygame.image.load('car.xcf')
            self.rect = self.image.get_rect()
        def draw(self):
            win.blit(self.image, (self.rect.x, self.rect.y))
        def update(self):
            if driving:
                key = pygame.key.get_pressed()

                if key[pygame.K_LEFT]:
                    car.rect.x += -car_speed

                if key[pygame.K_RIGHT]:
                    car.rect.x += car_speed
                
                if key[pygame.K_a]:
                    car.rect.x += -car_speed

                if key[pygame.K_d]:
                    car.rect.x += car_speed

                if car.rect.x >= win_w - 38:
                    car.rect.x = win_w - 38
                
                if car.rect.x <= 0:
                    car.rect.x = -2
            

    class enemyCar1(pygame.sprite.Sprite):
        def __init__(self):
            pygame.sprite.Sprite.__init__(self)
            self.image = pygame.image.load('enemy1.xcf')
            self.rect = self.image.get_rect()
        def draw(self):
            win.blit(self.image, (self.rect.x, self.rect.y))

    class enemyCar2(pygame.sprite.Sprite):
        def __init__(self):
            pygame.sprite.Sprite.__init__(self)
            self.image = pygame.image.load('enemy2.xcf')
            self.rect = self.image.get_rect()
        def draw(self):
            win.blit(self.image, (self.rect.x, self.rect.y))

    class enemyCar3(pygame.sprite.Sprite):
        def __init__(self):
            pygame.sprite.Sprite.__init__(self)
            self.image = pygame.image.load('enemy3.xcf')
            self.rect = self.image.get_rect()
        def draw(self):
            win.blit(self.image, (self.rect.x, self.rect.y))

    road_y1 = 10
    road_y2 = 280
    road_y3 = 430
    road_y4 = 140

    def road_draw():
        #line 1
        pygame.draw.rect(win, white, (76, road_y1, 13, 90)) #x, y, width, height
        pygame.draw.rect(win, white, (76, road_y2, 13, 90))  
        pygame.draw.rect(win, white, (76, road_y3, 13, 90)) 
        pygame.draw.rect(win, white, (76, road_y4, 13, 90)) 
        #line 2
        pygame.draw.rect(win, white, (205, road_y1, 13, 90))
        pygame.draw.rect(win, white, (205, road_y2, 13, 90)) 
        pygame.draw.rect(win, white, (205, road_y3, 13, 90))  
        pygame.draw.rect(win, white, (205, road_y4, 13, 90))  

    a = 600
    b = 710
    c = 8
    d = 390

    car = mainCar()
    car.rect.x = 165
    car.rect.y = 385

    car2 = enemyCar1()
    car2.rect.x = random.randint(0, 52)
    car2.rect.y = random.randint(a, b)

    car3 = enemyCar2()
    car3.rect.x = random.randint(54, 180)
    car3.rect.y = random.randint(a, b)

    car4 = enemyCar3()
    car4.rect.x = random.randint(182, 265)
    car4.rect.y = random.randint(a, b)

    def game_over():
        class gameOver(pygame.sprite.Sprite):
            def __init__(self):
                pygame.sprite.Sprite.__init__(self)
                self.image = pygame.image.load('gameover_text.png')
                self.rect = self.image.get_rect()
            def draw(self):
                win.blit(self.image, (50, win_h // 2))
        
        gameOver = gameOver()
        if driving == False:
            gameOver.draw()
            key = pygame.key.get_pressed()
            if key[pygame.K_SPACE]:
                main()

    def updateEnemies():
        if driving:
            car2.rect.y += 13
            car3.rect.y += 16
            car4.rect.y += 10
            
            if car2.rect.y >= win_h:
                car2.rect.y = random.randint(0, 10)
                car2.rect.x = random.randint(0, 56)
                
            if car3.rect.y >= win_h:
                car3.rect.y = random.randint(0, 10)
                car3.rect.x = random.randint(69, 178)
                
            if car4.rect.y >= win_h:
                car4.rect.y = random.randint(0, 10)
                car4.rect.x = random.randint(194, 273)

    def redraw():
        win.fill(grey)
        road_draw()
        car2.draw()
        car3.draw()
        car4.draw()
        car.draw()
        car.update()
        updateEnemies()
        game_over()
        win.blit(score_text, (10, 0))
        win.blit(score_number, (76, 0))

    dead = False
    playing = True
    driving = True

    while playing:
        pygame.time.delay(time)

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                playing = False
    
        if driving:
            road_y1 += 10
            road_y2 += 10
            road_y3 += 10
            road_y4 += 10

        if road_y1 >= win_h:
            road_y1 = -60

        if road_y2 >= win_h:
            road_y2 = -60

        if road_y3 >= win_h:
            road_y3 = -60

        if road_y4 >= win_h:
            road_y4 = -60
        
        score_font = pygame.font.Font("freesansbold.ttf", 18)
        score_text = score_font.render(format("Score: "), False, orange)
        win.blit(score_text, (10, 0))
        score_number = score_font.render(format(score), False, orange)
        win.blit(score_number, (76, 0))

        if driving:
            score += 1

        if score >= 150:
            time = 70
        if score >= 250:
            time = 58
        if score >= 400:
            time = 40

        if car.rect.colliderect(car2.rect):
            driving = False
        if car.rect.colliderect(car3.rect):
            driving = False
        if car.rect.colliderect(car4.rect):
            driving = False

        redraw()

        pygame.display.update()

main()
pygame.quit
导入pygame
随机输入
从pathlib导入路径
导入操作系统
chdir(路径(\u文件\u).parent)
温w=300
win_h=480
pygame.init()
win=pygame.display.set_模式((win_w,win_h))
#icon=pygame.image.load('icon.png'))
#pygame.display.set_图标(图标)
pygame.display.set_标题('Game')
def main():
蓝色=(51、51、255)
灰色=(128128128)
浅灰色=(200200200200)
橙色=(255、175、26)
白色=(255,255,255)
黑色=(0,0,0)
绿色=(0,255,0)
红色=(255,71,26)
车速=15
分数=0
时间=85
类主车(pygame.sprite.sprite):
定义初始化(自):
pygame.sprite.sprite.\uuuuu init\uuuuuuu(自我)
self.image=pygame.image.load('car.xcf')
self.rect=self.image.get_rect()
def牵引(自):
blit(self.image,(self.rect.x,self.rect.y))
def更新(自我):
如果驾驶:
key=pygame.key.get_pressed()
如果键[pygame.K_左]:
car.rect.x+=-车速
如果键[pygame.K_RIGHT]:
car.rect.x+=车辆速度
如果键[pygame.K_a]:
car.rect.x+=-车速
如果键[pygame.K_d]:
car.rect.x+=车辆速度
如果car.rect.x>=win_w-38:
car.rect.x=win_w-38
如果car.rect.x=win_h:
car2.rect.y=random.randint(0,10)
car2.rect.x=random.randint(0,56)
如果car3.rect.y>=win\u h:
car3.rect.y=random.randint(0,10)
car3.rect.x=random.randint(69178)
如果car4.rect.y>=win\u h:
car4.rect.y=random.randint(0,10)
car4.rect.x=random.randint(194273)
def redraw():
win.fill(灰色)
道路图()
car2.draw()
car3.draw()
car4.draw()
car.draw()
car.update()
updateneemies()
游戏结束
win.blit(分数(10,0))
赢。布利特(分数(76,0))
死=假
玩=真
驾驶=正确
玩的时候:
pygame.time.delay(时间)
对于pygame.event.get()中的事件:
如果event.type==pygame.QUIT:
播放=错误
如果驾驶:
道路_y1+=10
道路_y2+=10
道路_y3+=10
道路_y4+=10
如果road_y1>=win_h:
道路_y1=-60
如果road_y2>=win_h:
道路_y2=-60
如果road_y3>=win_h:
道路_y3=-60
如果road_y4>=win_h:
路_y4=-60
score\u font=pygame.font.font(“freesansbold.ttf”,18)
score\u text=score\u font.render(格式(“score:”),False,橙色)
win.blit(分数(10,0))
score\u number=score\u font.render(格式(score)、False、橙色)
赢。布利特(分数(76,0))
如果驾驶:
分数+=1
如果得分>=150:
时间=70
如果得分>=250:
时间=58
如果得分>=400:
时间=40
如果car.rect.collide rect(car2.rect):
驾驶=错误
如果car.rect.collide rect(car3.rect):
驾驶=错误
如果car.rect.collide rect(car4.rect):
驾驶=错误
重画
pygame.display.update()
main()
pygame.退出
现在每当我输了,我就按空格键重新开始。我试了4次,现在累了。 所以我想退出游戏。由于我尝试了4次,我将不得不单击X 4次

我只想在一次内全部关闭

现在,当我点击窗口中的关闭按钮时,它会一次又一次地弹出,直到我重试了多少次。 如果我重试3次,那么我必须关闭窗口3次,为什么

我只想在第一次关闭它。。。 我希望你能理解我的话

请帮助我,当我关闭窗口时,一切都关闭了 如果你不理解我的东西,你可以尝试代码,然后重试2-3次,然后看到


谢谢

您正在递归调用
main
。事实上,您并不是在重新启动游戏,而是在游戏中开始一个全新的游戏。当你想退出时,你必须关闭所有已经开始的游戏。
编写重置所有游戏相关变量的函数或方法。调用此函数而不是main。

因为您正在递归调用
main
。事实上,您并不是在重新启动游戏,而是在游戏中开始一个全新的游戏。当你想退出时,你必须关闭你已经开始的所有游戏。那么你能帮我一下吗?因为当我把main函数放在while循环上面时,它说应该在main()之前定义局部变量,问题是调用
main
函数。顺便问一下,为什么要在
main
函数中定义所有这些类和函数?它们应该是顶级的。而且是
pygame.quit()
而不是
pygame.quit
(你缺少括号)因此,例如,我重新启动了一个函数():那么我如何在图像上删除游戏?当
驾驶
真时,
游戏结束”不是画图<代码>驾驶
是必须重置的变量之一。当我重置驾驶时,没有任何更改!我这样做了:def main():driving=TrueSo当我单击空格driving时为true,但没有任何更改…@AryaTholiya这不是您必须更改的唯一状态。在我的回答中,我告诉过你该怎么做,但你必须自己实施。你可能会发现有人可以给你一个完整的编码解决方案的答案。不幸的是,我现在很忙。