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这不是您必须更改的唯一状态。在我的回答中,我告诉过你该怎么做,但你必须自己实施。你可能会发现有人可以给你一个完整的编码解决方案的答案。不幸的是,我现在很忙。