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()
3 Réponses :
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.
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("-")
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)
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?