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.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 次内关闭它...
现在,当我单击窗口中的关闭按钮时,它会一次又一次地弹出,直到我重试了多少次。如果我重试 3 次,那么我必须关闭窗口 3 次,为什么?
我只是希望它只在第一次关闭......我希望你能理解我的话!
请帮助我,当我关闭窗口 1 时,一切都关闭了
谢谢你!!!
解决方案
您正在main
递归调用。事实上,你不是在重新开始游戏,而是在游戏中开始一个全新的游戏。当你想退出时,你必须关闭你已经开始的所有游戏。编写一个函数或方法来重置所有与游戏相关的变量。调用此函数而不是 main。
推荐阅读
- python - python cffi被windows defender隔离
- php - $_POST 表单高级安全性
- exchangewebservices - 使用 ews 禁用 Outlook 电子邮件转发
- watchkit - 如何检测在表格行控制器中添加的 WKInterfaceGroup 上的点击?
- c# - How to sort User and Role in core Identity
- javascript - 无论总数如何,Javascript 都获得 100%
- javascript - 无法使用道具值编辑输入
- css - Vue模板colspan无法正常工作
- reactjs - 单击时我想在反应 js 方法中生成警报
- html - 反转html表格中每个单元格的背景颜色