Почему программа не останавливается после остановки основного l oop? - PullRequest
0 голосов
/ 06 августа 2020

Я пытаюсь создать свою собственную версию Snake. Я пытаюсь настроить его так, чтобы при ударе о стену основной while l oop останавливался, установив run = False. Это работает, когда я закрываю программу кнопкой выхода, но по какой-то причине не работает при обнаружении столкновения. Любая помощь?

Примечание: я попытался вынести функцию gameOver () из функции updateScreen () и поместить ее отдельно в конец l oop, но это тоже не сработало.

import pygame
import time
import os

pygame.init()

width, height = (500, 500)
win = pygame.display.set_mode((width, height))
pygame.display.set_caption("Snake")
win.fill((0, 0, 0))

# Snake Class
class Snake:
    def __init__(self, x, y, width, height, color):
        self.x = x
        self.y = y
        self.width = width
        self.height = height
        self.color = color
        self.len = []
        self.xvel = 0
        self.yvel = 0

    def draw(self, window):
        win.fill((0, 0, 0))
        pygame.draw.rect(window, self.color, (self.x, self.y, self.width, self.height))

    def move(self):
        self.x += self.xvel
        self.y += self.yvel

    def checkCol(self):
        # Check if edge is hit
        if self.x <= 0 or self.x + self.width >= width:
            return True
        elif self.y <= 0 or self.y + self.height >= height:
            return True
        else:
            return False

sn = Snake(100, 100, 15, 15, (0, 255, 0))

# MAIN LOOP
def main():
    run = True
    FPS = 15
    clock = pygame.time.Clock()

    fontStyle = pygame.font.SysFont(None, 50)

    def updateScreen():
        sn.move()
        sn.draw(win)

        gameOver()

        pygame.display.update()

    def gameOver():
        if sn.checkCol():
            run = False
            print("check")

    def message(msg, color):
        m = fontStyle.render(msg, True, color)
        win.blit(m, [width / 2, height / 2])

    while run:
        clock.tick(FPS)

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                run = False

        keys = pygame.key.get_pressed()

        if keys[pygame.K_w]:
            sn.yvel = -10
            sn.xvel = 0
        if keys[pygame.K_s]:
            sn.yvel = 10
            sn.xvel = 0
        if keys[pygame.K_a]:
            sn.xvel = -10
            sn.yvel = 0
        if keys[pygame.K_d]:
            sn.xvel = 10
            sn.yvel = 0

        updateScreen()

    message("Game Over!", (255, 0, 0))

main()

1 Ответ

2 голосов
/ 06 августа 2020

используйте break, если ваше условие выполнено

  if keys[pygame.K_d]:
        sn.xvel = 10
        sn.yvel = 0
break
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...