2017-07-25 3 views
2

Versuchen, ein Spiel namens hangman in Python zu erstellen. Ich bin weit gekommen, aber die "Kern" -Funktionalität ist fehlgeschlagen.Hangman in Python - Ersetzen Sie mehrere Zeichen in einer einzigen Zeichenfolge basierend auf Index Python

Ich habe alle Teile weggelassen, die für diese Frage irrelevant sind.

Hier kommt es:

picked = ['yaaayyy'] 
    length = len(picked) 
    dashed = "-" * length 

    guessed = picked.replace(picked, dashed) 

    while tries != -1: 
     input = raw_input("Try a letter: ") 
     if input in picked: 
      print "Correct letter!" 
      found = [i for i, x in enumerate(picked) if x == input] 
      for item in found: 
       guessed = guessed[:item] + input + guessed[i+1:] 
      print guessed 

Auf dieses Skript aufrufen, Python erstellt eine Variable mit dem Namen guessed mit 7 Striche ------- Es fordert den Benutzer auf einen Brief und wenn der Brief korrekt ist, wird es die - ersetzen mit dem richtigen Buchstaben. Aber nicht die vorherigen Buchstaben behalten.

Das Wort erraten werden soll yaaayyy

Ausgabe von Code:

Word is 7 characters: 
------- 
Try a letter: a 
Correct letter! 
-aaa 
Try a letter: y 
Correct letter! 
yyyy 

Ziel:

Word is 7 characters: 
------- 
Try a letter: a 
Correct letter! 
-aaa--- 
Try a letter: y 
Correct letter! 
yaaayyy 
+1

Ich denke 'erraten [i + 1:]' 'sollte [item + 1:] erraten werden'. – smarx

+0

es funktioniert ... nur Gott verdammt. Vielen Dank! – user721121

+0

_ "Nach dem Aufruf dieses Skripts fragt python [...] den Benutzer nach einem Buchstaben" _. Seltsam, das macht das auf meiner Maschine nicht. Ich bekomme nur 'AttributError: 'Liste' Objekt hat kein Attribut 'ersetzen' in Zeile 5. – Kevin

Antwort

1

Dieser Code etwas falsch zu sein scheint:

found = [i for i, x in enumerate(picked) if x == input] 
for item in found: 
    guessed = guessed[:item] + input + guessed[i+1:] 

Das letzte Zeile sollte wohl sein:

guessed = guessed[:item] + input + guessed[item+1:] 

EDIT

Dies scheint einfacher zu mir:

for i, x in enumerate(picked): 
    if x == input: 
     guessed = guessed[:i] + input + guessed[i+1:] 

EDIT 2

Ich bin mir nicht sicher, ob dies ist klarer oder nicht, aber es ist wahrscheinlich ein wenig effizienter:

guessed = ''.join(x if picked[i] == input else c for i, c in enumerate(guessed)) 
+0

Die Join-Linie ist sehr nett. Abgesehen davon hätte ich [item] = input 'erraten, anstatt die Liste jedes Mal neu zu erstellen. – MrMas

+1

"Erraten" ist ein 'str', und Python' str's sind unveränderlich. Ich stimme zu, dass es besser wäre, eine "Liste" zu erstellen, aber das schien eine etwas zu große Änderung zu sein, die man vorschlagen könnte. – smarx

+0

Ah - neu habe ich etwas verpasst. Vielen Dank. – MrMas

0

Angenommen, Sie verwenden python3 Sie es einfach tun lösen können:

user_input = input() 
guessed = ''.join(letter if user_input == letter else guessed[i] for i, letter in enumerate(picked)) 
+0

Das behält den zuvor eingegebenen Brief jedoch nicht bei. – Purag

+0

Bereits korrigiert –

Verwandte Themen