2017-05-13 4 views
1

Ich bin neu im Programmieren, aber ich habe mir selbst Python für ein paar Monate gelehrt. Ich habe ein Wortratespielprogramm geschrieben. Das Programm macht folgende Dinge:Python - Wortratespiel scheitert an Wörtern mit Wiederholungszeichen

  • Es wählt ein Wort aus einer vordefinierten Satz von Wörtern, die ich dictionary genannt habe.
  • Es erklärt die Regeln des Spiels.
  • Es teilt dem Benutzer mit, wie viele Buchstaben das Wort enthält, und stellt jeden Buchstaben mit einem Unterstrich dar.
  • Es fordert den Benutzer, einen Brief zu erraten.
  • Es teilt dem Benutzer mit, dass die Schätzung korrekt ist, und druckt dann die Unterstriche erneut, ersetzt jedoch den entsprechenden Unterstrich durch die korrekte Schätzung. Was ich meine ist, wenn das Wort "PYTHON" ist und der Benutzer "H" schätzt, wird es ["_", "_", "_", "H", "_", "_"] drucken.
  • Wenn andererseits die Schätzung nicht im Wort ist, wird es dem Benutzer sagen und dann die Unterstriche erneut drucken. Was ich meine ist, wenn die nächste Schätzung des Benutzers 'Z' ist, wird es sagen "Dieser Buchstabe ist nicht im Wort" und dann erneut ["_", "_", "_", "H", "_", "_"] erneut drucken, so dass der Benutzer verfolgen kann, wo er/sie ist.
  • Schließlich, sobald alle Buchstaben erraten worden sind, gratuliert es dem Benutzer und beendet das Spiel.

Hier ist der Code:

import random 

dictionary = ("CROWS", "GOAT", "MONKEY", "COW", "HORSE", "SNAKE") 
answer = random.choice(dictionary) 
answer_length = len(answer) 
victory = True 
print(""" 
    I have chosen a word. Your job is to guess it. I will help you 
    keep track. 
    """) 

print("The word I have chosen is {} letters long.\n".format(answer_length)) 

underscores = [] 
for character in answer: 
    underscores.append("_") 
print(underscores) 

while victory: 
    guess = input("\nPlease guess a letter: ").strip().capitalize() 
    def pos(guess): 
     position = 0 
     for letter in answer: 
      if letter != guess: 
       position += 1 
      else: 
       print("Correct!") 
       break 
     return position 

    def update_board(x): 
     global underscores 
     if guess in answer: 
      underscores[x] = guess 
     else: 
      print("This letter is not in the word") 
     return underscores 

    def winner(): 
     global underscores 
     global victory 
     if "_" not in underscores: 
      print("YOU HAVE WON!") 
      victory = False 

    x = pos(guess) 
    print(update_board(x)) 
    winner() 

Nun, das Problem, das ich habe, ist dies: Das Programm funktioniert gut, vorgesehen, dass das Wort der Computer aus dem Wörterbuch jeder hat nicht wählt wiederholte Buchstaben darin. Sie werden feststellen, dass die Wörter im Wörterbuch alle aus einzigartigen Zeichen bestehen. Wenn das Wörterbuch jedoch das Wort "CHICKEN" enthält, könnte das Programm auf Probleme stoßen.

Stellen Sie sich vor der Computer wählte "CHICKEN", und dann erraten Sie den Buchstaben "C". Das Programm zurückkehren würde:

Correct! 
["C", "_", "_", "_", "_", "_", "_"] 

Außerdem, wenn Sie C wieder erraten, es ist einfach wieder

Correct! 
["C", "_", "_", "_", "_", "_", "_"] 

drucken. Im Idealfall möchte ich, dass das erste Mal, dass der Benutzer "C" erraten hat, ["C", "_", "_", "C", "_", "_", "_"] zurückgegeben wird. Im Moment funktioniert das Spiel nur, wenn alle Wörter im Wörterbuch keine wiederkehrenden Zeichen haben.

Jede Hilfe, die Sie zur Verfügung stellen könnten, wäre sehr willkommen. Vielen Dank!

+1

Ihre pos() gibt nur die erste passende Position des Briefes (die for-Schleife bricht sofort auf Spiel). Es könnte stattdessen ein Array von übereinstimmenden Positionen zurückgeben. Dann könnte update_board über dieses Array iterieren und Unterstriche in diesen Indizes ersetzen. – Vasan

Antwort

2

Sie stoppen, um nach weiteren Vorkommnissen zu suchen, sobald Sie eine in pos(guess) finden. So erhalten Sie nur das erste Vorkommen. Offensichtlich hörst du dann nicht auf, wenn du etwas findest. Stattdessen gehe jedes Mal das Wort voll durch.

z. Geben Sie in pos(guess) eine Liste der Indizes zurück, in denen der Buchstabe im Wort gefunden wird, und geben Sie in update_board(x) eine Schleife durch die Indizes, die Sie erhalten, anstatt nur den einen Unterstrich durch die Schätzung zu ersetzen.

+0

Das ist sehr hilfreich. Ich werde es versuchen. Danke vielmals :-) – Nellington

1

Sie Array verwenden können, um es zu lösen:

import random 

dictionary = ("CROWS","CHICKEN") 
answer = random.choice(dictionary) 
answer_length = len(answer) 
victory = True 
print(""" 
    I have chosen a word. Your job is to guess it. I will help you 
    keep track. 
    """) 

print("The word I have chosen is {} letters long.\n".format(answer_length)) 

underscores = [] 
for character in answer: 
    underscores.append("_") 
print(underscores) 
ar=[] 
while victory: 
    guess = input("\nPlease guess a letter: ").strip().capitalize() 
    def pos(guess): 
     position = 0 
     for letter in answer: 
      if letter != guess: 
       position += 1 
      else: 
       print("Correct!") 
       ar.append(position) 
       position += 1 

     return ar 

    def update_board(x): 
     global underscores 
     if guess in answer: 
      underscores[x] = guess 
     else: 
      print("This letter is not in the word") 
     return underscores 

    def winner(): 
     global underscores 
     global victory 
     if "_" not in underscores: 
      print("YOU HAVE WON!") 
      victory = False 

    pos(guess) 
    for x in ar: 
     print(update_board(x)) 
    del ar [:] 
    winner() 
Verwandte Themen