Python游戏与Pygame的屏幕游戏问题

Python游戏与Pygame的屏幕游戏问题,python,function,while-loop,pygame,Python,Function,While Loop,Pygame,我使用python中的pygame模块为一个基本的snake游戏编写了代码,已经基本完成了,但是,我希望在最后的屏幕上有一个游戏,显示一些文本,提供再次玩的选项并显示分数。如果他们重新开始,分数将重置为0,他们将再次比赛。不幸的是,我似乎无法成功运行此屏幕。我已经尝试了几件事,但我似乎总是得到显示表面退出的错误。如果有任何提示,我将在下面分享我的代码 import sys, time, random, pygame from random import randrange pygame.init

我使用python中的pygame模块为一个基本的snake游戏编写了代码,已经基本完成了,但是,我希望在最后的屏幕上有一个游戏,显示一些文本,提供再次玩的选项并显示分数。如果他们重新开始,分数将重置为0,他们将再次比赛。不幸的是,我似乎无法成功运行此屏幕。我已经尝试了几件事,但我似乎总是得到显示表面退出的错误。如果有任何提示,我将在下面分享我的代码

import sys, time, random, pygame
from random import randrange
pygame.init()
fps_controller = pygame.time.Clock()
#Screen Dimensions
screen_width = 600
screen_height = 600

#Screen Set Up
screen = pygame.display.set_mode((screen_width, screen_height))
pygame.display.set_caption("Snake by Bela Zumbansen")
pygame.mouse.set_visible(0)

#Colours
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLACK  = (0, 0, 0)
GREY = (200, 200, 200)
BLUE = (0, 0, 255)
WHITE = (255, 255, 255)
LIGHTBLUE = (0, 155, 155)

#Directions
RIGHT = 1
LEFT = 2
UP = 3
DOWN = 4

#Game Set Up
snake_pos = [100, 100]
snake_body = [[100, 100], [90, 100], [80, 100]]
snake_speed = 10

apple_pos = [random.randrange(1,60)*10, random.randrange(1,60)*10]
apple_spawn = True

direction = RIGHT
update = direction

scoreval = 0

def game_over():
    global run, scoreval
    screen.fill(LIGHTBLUE)
    draw_text("GAME OVER", 48, WHITE, screen_width/2, screen_height/4)
    draw_text("Score: " + str(score), 22, WHITE,  screen_width / 2, screen_height / 3)
    draw_text("Press SPACE to play again or ESC to exit", 22, WHITE, screen_width/2, screen_height / 4)
    waiting = True
    while waiting:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_SPACE:
                    scoreval = 0
                    return scoreval
                    run = True
                if event.key == pygame.K_ESCAPE:
                    pygame.quit()
            return run
def draw_text(text, size, color, x, y):
    font = pygame.font.Font('freesansbold.ttf', size)
    TextSurf, TextRect = text_objects(text, font, color)
    TextRect.center = (x, y)
    screen.blit(TextSurf, TextRect)

def text_objects(text, font, color):
    textSurface = font.render(text, True, color)
    return textSurface, textSurface.get_rect()

def eating_apple():
    global scoreval, apple_spawn
    scoreval += 1
    apple_spawn = False

def spawnApple():
    global apple_pos, apple_spawn
    apple_pos = [random.randrange(1,60)*10, random.randrange(1,60)*10]
    apple_spawn = True

def score(score):
    font = pygame.font.SysFont(None, 25)
    text = font.render("Score: "+str(score), True, WHITE)
    screen.blit(text,(10,10))

def main():
    global update, direction, run, snake_pos, snake_speed, apple_spawn, apple_pos
    pygame.time.delay(60)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT]:
        update = LEFT
    elif keys[pygame.K_RIGHT]:
        update = RIGHT
    elif keys[pygame.K_UP]:
        update = UP
    elif keys[pygame.K_DOWN]:
        update = DOWN

    if update == RIGHT and direction != LEFT:
        direction = RIGHT
    if update == LEFT and direction != RIGHT:
        direction = LEFT
    if update == UP and direction != DOWN:
        direction = UP
    if update == DOWN and direction != UP:
        direction = DOWN

    if direction == RIGHT:
        snake_pos[0] += snake_speed
    if direction == LEFT:
        snake_pos[0] -= snake_speed
    if direction == UP:
        snake_pos[1] -= snake_speed
    if direction == DOWN:
        snake_pos[1] += snake_speed

    snake_body.insert(0, list(snake_pos))
    if pygame.Rect(*snake_pos, 20, 20).colliderect(*apple_pos, 20, 20):
        eating_apple()
    else:
        snake_body.pop()
    if not apple_spawn:
        spawnApple()

    screen.fill(BLACK)
    for pos in snake_body:
        pygame.draw.rect(screen, GREEN, pygame.Rect(pos[0], pos[1], 20, 20))

    pygame.draw.rect(screen, RED, pygame.Rect(apple_pos[0], apple_pos[1], 20, 20))

    if snake_pos[0] < 0 or snake_pos[0] > screen_width-20:
        run = False
    if snake_pos[1] < 0 or snake_pos[1] > screen_height-20:
        run = False

    for block in snake_body[1:]:
        if snake_pos[0] == block[0] and snake_pos[1] == block[1]:
            run = False

    score(scoreval)
    pygame.display.update()
    fps_controller.tick(25)

#main loop
run = True
while run:
    main()


game_over()
导入系统、时间、随机、pygame
从随机输入范围
pygame.init()
fps_controller=pygame.time.Clock()
#屏幕尺寸
屏幕宽度=600
屏幕高度=600
#屏幕设置
screen=pygame.display.set_模式((屏幕宽度、屏幕高度))
pygame.display.set_标题(“Bela Zumbansen创作的蛇”)
pygame.mouse.set_可见(0)
#颜色
红色=(255,0,0)
绿色=(0,255,0)
黑色=(0,0,0)
灰色=(200200200200)
蓝色=(0,0255)
白色=(255,255,255)
浅蓝色=(0,155,155)
#方向
右=1
左=2
上升=3
向下=4
#游戏设置
snake_pos=[100100]
蛇身=[[100100],[90100],[80100]]
蛇行速度=10
apple_pos=[random.randrange(1,60)*10,random.randrange(1,60)*10]
apple_spawn=True
方向=右
更新=方向
scoreval=0
def game_over():
全球跑步
屏幕填充(浅蓝色)
绘制文字(“游戏结束”,48,白色,屏幕宽度/2,屏幕高度/4)
绘制文字(“分数:+str(分数),22,白色,屏幕宽度/2,屏幕高度/3)
绘制文字(“按空格键再次播放或按ESC键退出”,22,白色,屏幕宽度/2,屏幕高度/4)
等待=真
等待时:
对于pygame.event.get()中的事件:
如果event.type==pygame.QUIT:
pygame.quit()
elif event.type==pygame.KEYDOWN:
如果event.key==pygame.K_空间:
scoreval=0
返回分数
运行=真
如果event.key==pygame.K_退出:
pygame.quit()
回程
def draw_文本(文本、大小、颜色、x、y):
font=pygame.font.font('freesansbold.ttf',size)
TextSurf,TextRect=文本对象(文本、字体、颜色)
TextRect.center=(x,y)
screen.blit(TextSurf,TextRect)
def text_对象(文本、字体、颜色):
textSurface=font.render(文本、真、彩色)
返回textSurface,textSurface.get_rect()
定义吃苹果():
全球得分,苹果产卵
scoreval+=1
apple_spawn=False
def prownapple():
全球苹果销售点,苹果产卵
apple_pos=[random.randrange(1,60)*10,random.randrange(1,60)*10]
apple_spawn=True
def分数(分数):
font=pygame.font.SysFont(无,25)
text=font.render(“分数:+str(分数),真,白色)
屏幕blit(文本,(10,10))
def main():
全局更新、方向、跑步、蛇位置、蛇速度、苹果产卵、苹果位置
pygame.时间延迟(60)
对于pygame.event.get()中的事件:
如果event.type==pygame.QUIT:
运行=错误
keys=pygame.key.get_pressed()
如果键[pygame.K_左]:
更新=左
elif keys[pygame.K_RIGHT]:
更新=正确
elif keys[pygame.K_UP]:
更新=更新
elif keys[pygame.K_DOWN]:
更新=关闭
如果更新==右侧和方向!=左:
方向=右
如果更新==左侧和方向!=正确的:
方向=左
如果更新==向上和方向!=向下:
方向=向上
如果更新==向下和方向!=向上:
方向=向下
如果方向==右侧:
蛇形位置[0]+=蛇形速度
如果方向=左:
蛇行位置[0]-=蛇行速度
如果方向==向上:
蛇形位置[1]-=蛇形速度
如果方向==向下:
蛇形位置[1]+=蛇形速度
蛇体。插入(0,列表(蛇体位置))
如果pygame.Rect(*snake_pos,20,20).collide Rect(*apple_pos,20,20):
吃苹果
其他:
蛇_body.pop()
如果不是苹果产卵:
苹果
屏幕填充(黑色)
对于蛇形体中的位置:
pygame.draw.rect(屏幕,绿色,pygame.rect(位置[0],位置[1],20,20))
pygame.draw.rect(屏幕,红色,pygame.rect(苹果位置[0],苹果位置[1],20,20))
如果snake_pos[0]<0或snake_pos[0]>屏幕宽度-20:
运行=错误
如果snake_pos[1]<0或snake_pos[1]>屏幕高度-20:
运行=错误
对于蛇形体[1:]中的块:
如果snake_pos[0]==块[0]和snake_pos[1]==块[1]:
运行=错误
分数(scoreval)
pygame.display.update()
fps_控制器。勾选(25)
#主回路
运行=真
运行时:
main()
游戏结束

您需要将主循环放入另一个循环中,以便在完成
游戏结束
功能后再次启动:

# main loop
while True:
    run = True
    while run:
        main()

    game_over()
由于
pygame.quit()
不会退出程序,因此在
pygame.quit()
之后,您需要将两个循环都设置为
,并设置两个
run=True
s,或者使用
sys.exit(0)
raisesystemexit(0)


您还必须从
game\u over()
函数中的
for
循环中删除
返回运行

您需要将主循环放入另一个循环中,以便在
game\u over
函数完成后,它将再次启动:

# main loop
while True:
    run = True
    while run:
        main()

    game_over()
由于
pygame.quit()
不会退出程序,因此在
pygame.quit()
之后,您需要将两个循环都设置为
,并设置两个
run=True
s,或者使用
sys.exit(0)
raisesystemexit(0)


您还必须从
game\u over()
函数中的
for
循环中删除
return run

您有两个函数
main()
game\u over()
,每个函数都有自己的事件循环和自己的绘图。
创建2个状态