1
votes

La fenêtre Pygame ne répond pas après quelques secondes

Le code ci-dessous fait que la fenêtre ne répond pas au démarrage .. Je voulais faire un jeu du pendu et j'ai fait la logique et j'essayais juste de faire apparaître la fenêtre et de ne pas répondre. Aussi, lorsque j'exécute le programme, lorsque je tape la lettre et en tape une autre, il efface la lettre précédente a écrit la nouvelle lettre avec les traits de soulignement. Comment puis-je faire en sorte qu'il conserve la lettre précédente et l'imprime avec la nouvelle lettre?

import pygame
pygame.init()

running  = True

window_width = 600
window_height = 600
window = pygame.display.set_mode((window_width, window_height))

clock = pygame.time.Clock()

word = "something"
while running:
    dt = clock.tick(60)

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


    answer = ""
    guessed = []

    guessed.append(input("write your letter here -> "))

    for i in word:
        
        if i in guessed:
            answer += i + " "
        else:
            answer += "_ "

    print(answer)
    answer = ""
pygame.quit()


0 commentaires

3 Réponses :


1
votes

Votre problème est ici:

import pygame
pygame.init()

running  = True

window_width = 600
window_height = 600
window = pygame.display.set_mode((window_width, window_height))

clock = pygame.time.Clock()

word = "something"
guessed = []
while running:
    pygame.display.update() # <---- Needs to be called every loop passing to update the window
    dt = clock.tick(60)

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        
    answer = ""

    guessed.append(input("write your letter here -> "))

    for i in word:
        
        if i in guessed:
            answer += i + " "
        else:
            answer += "_ "

    print(answer)
    answer = ""
pygame.quit()

Chaque fois que la boucle while recommence, vous affectez la liste devinée à une liste vide. Ce que vous devez faire est de placer le guessed = [] avant le moment comme ceci:

while running:
    dt = clock.tick(60)

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


    answer = ""
    guessed = [] # <-----ISSUE

Vous devez également mettre à jour votre fenêtre à chaque fois que la boucle while passe. Je l'ai ajouté dans le code que j'ai fourni ci-dessus.


0 commentaires

0
votes

vous devez créer une autre variable de chaîne qui a le même nombre de lettres que le mot mais au lieu de lettres, elle comporte des tirets. vous pouvez le faire en utilisant ceci:

    i = -1
    for letter in word:
        i += 1
        if letter == guessedLetter:
            guessedWord[i] = guessedLetter
    print(guessedLetter)

puis, lorsque l'utilisateur devine quelque chose, vous pouvez remplacer la variable GuessedWord au lieu du mot. Donc, fondamentalement, vous comparez la lettre devinée à la lettre correspondante dans le mot, puis si elles étaient identiques, vous remplacez le _ par la lettre devinée. btw vous n'avez pas à mettre les lettres devinées dans une liste à moins que vous ne vouliez les utiliser plus tard.

    guessedWord = []
    for letter in word:
        guessedWord.append("-")


0 commentaires

1
votes

Votre jeu ne répond pas, car vous demandez une input dans la boucle d'application. input arrête la boucle d'application et attend la confirmation de l'entrée. Si vous arrêtez la boucle d'application, la fenêtre cesse de répondre. Utilisez l'événement KEYDOWN pour obtenir une entrée dans PyGame (voir pygame.event ):

import pygame
pygame.init()

running  = True

window_width = 600
window_height = 600
window = pygame.display.set_mode((window_width, window_height))

clock = pygame.time.Clock()

word = "something"
guessed = []

answer = ""
for c in word:
    answer += c + " " if c in guessed else "_ "
print(answer)

while running:
    dt = clock.tick(60)

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        if event.type == pygame.KEYDOWN:
            guessed.append(event.unicode)
            answer = ""
            for c in word:
                answer += c + " " if c in guessed else "_ "
            print(answer)
   
pygame.quit()

guessed doit être initialisé avant la boucle d'application. Ne le réinitialisez pas dans la boucle:

for event in pygame.event.get():
    # [...]

    if event.type == pygame.KEYDOWN:
        guessed.append(event.unicode)


2 commentaires

cela signifie-t-il que le programme ne peut pas accepter les entrées lorsqu'il y a une fenêtre d'application?


@BryanKim C'est possible, mais la fenêtre ne répond pas. Vous pouvez obtenir l'entrée de la console dans un thread différent. Quoi qu'il en soit, personne ne prend les entrées de la console dans un jeu graphique. Pour le moment, vous n'avez pas du tout besoin de la fenêtre. Cependant, voir Comment créer une zone de saisie de texte avec pygame?