Почему моя программа перестает отвечать и дает сбой? - PullRequest
0 голосов
/ 16 февраля 2019

Я просто пытался изучить PyGame, который понадобится для моего предстоящего проекта, поэтому я хотел бы знать, почему этот фрагмент кода дает сбой и как я могу это исправить.

Я пыталсяя смотрел в Интернете и не нашел работающего решения.

import pygame

# Initialise pygame
pygame.init()
clock = pygame.time.Clock()
# pygame.font.init()
myFont = pygame.font.SysFont('Comic Sans MS', 30)

# Colours
BLACK = (0,   0,   0)
WHITE = (255, 255, 255)
BLUE  = (0,   0, 255)
GREEN = (0, 255,   0)
RED   = (255,   0,   0)

# Screen Size
size = [400, 300]
screen = pygame.display.set_mode(size)

# Initialise Variables
done = False

class Unit:
    def __init__(self, name, hp, attack):
        self.name = name
        self.hp = hp
        self.attack = attack

class Infantry(Unit):
    def __init__(self, name, hp, attack):
        super().__init__(name, hp, attack)

    def attack_turn(self):
        self.hp -= self.attack
        text_surface = myFont.render(self.name + " has " + str(self.hp) + " health points left!", True, (255, 0, 0))
        screen.blit(text_surface, (0, 0))
        # print(self.name + " has " + str(self.hp) + " health points left!")
        x = input("Press ENTER to continue!")

player = Infantry("Panzer", 110, 13)  # The attack set here is for the enemy.
enemy = Infantry("T-14", 100, 30)  # The attack set here is for the player.

while not done:

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            done = True
    while player.hp > 0 and enemy.hp > 0:
        player.attack_turn()
        enemy.attack_turn()

    done = True

if player.hp > enemy.hp:
    # print(player.name + " wins!")
    text_surface = myFont.render(player.name + " wins!", False, (255, 0, 0))
    screen.blit(text_surface, (100, 100))
else:
    # print(enemy.name + " wins!")
    text_surface = myFont.render(enemy.name + " wins!", False, (255, 0, 0))
    screen.blit(text_surface, (100, 100))

Я надеялся, что код хотя бы запустится, чтобы я мог работать там, но он даже этого не делает.

1 Ответ

0 голосов
/ 16 февраля 2019

Не делайте еще один цикл внутри основного цикла.Внутренний цикл предотвращает обработку события, избавьтесь от него.Достаточно проверить, закончилась ли игра в конце основного цикла:

done = False
while not done:

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            done = True

    player.attack_turn()
    enemy.attack_turn()

    if player.hp <= 0 or enemy.hp <= 0:
        done = True

    pygame.display.flip()

input не делает то, что вы хотите, это не вход в окно игры.Удалите его и добавьте метод attack к методу on, который вычисляет новое здоровье, и метод ne draw, который "блит" текст:

class Infantry(Unit):
    def __init__(self, name, hp, attack):
        super().__init__(name, hp, attack)

    def attack_turn(self):
        self.hp -= self.attack

        ### x = input("Press ENTER to continue!") <----- delete

    def draw(self):
        text_surface = myFont.render(self.name + " has " + str(self.hp) + " health points left!", True, (255, 0, 0))
        screen.blit(text_surface, (0, 0))

Используйте pygame.KEYUP событие, чтобы проверить, была ли нажата клавиша pygame.K_RETURN.
Далее выполните весь чертеж в конце основного цикла.Используйте pygame.Surface.fill, чтобы заполнить screen одним цветом (очистить экран).Затем нарисуйте текст.Наконец, используйте pygame.display.flip(), чтобы обновить полный дисплей:

например

done = False
count = 0
while not done:

    attack = False
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            done = True
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_RETURN:
                attack = True

    if attack:
        if count % 2 == 0:
            player.attack_turn()
        else:
            enemy.attack_turn()
        count += 1

    if player.hp <= 0 or enemy.hp <= 0:
        done = True

    screen.fill(BLACK)
    if count % 2 == 0:
        player.draw()
    else:
        enemy.draw()
    pygame.display.flip()
...