首页 > 解决方案 > 为什么我必须一次又一次地关闭 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.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

现在,每当我输了,我按空格键重新开始。例如。我做了 4 次尝试,现在我累了。所以我想退出游戏。当我尝试了 4 次时,我将不得不点击 X 4 次!

我只想在 1 次内关闭它...

这是第一次尝试...

试试 - 2

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

我只是希望它只在第一次关闭......我希望你能理解我的话!

请帮助我,当我关闭窗口 1 时,一切都关闭了

谢谢你!!!

标签: pythonpygame

解决方案


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


推荐阅读