2017-01-19 6 views
1

Ich lerne gerade Python und versuche, eine Reihe von Minispielen zu erstellen, um mein Grundwissen zu festigen, aber es gibt ein paar Dinge, die ich mit meinem tun möchte Spiel, dass andere hier nicht haben (zumindest was ich gesehen habe), und das ist Whitespace zwischen Wörtern aus der Antwort und der "maskierten" Antwort zu entfernen. Ich nehme an, es würde als eine "wenn, sonst" Art von Aussage gemacht werden? Bitte korrigieren Sie mich, falls ich falsch liege.Python Henker, Entfernen von Leerzeichen aus dem Antwort-Pool und verfeinern, was eingegeben werden kann

for x in range(i): ## where i is the word 
    if x == " ": 
    continue ## wouldn't it be pointless to append something that you don't want to change? 
    else: 
    word.append('_') 

Eine andere Frage, die ich hatte, war in Bezug auf eine Schleife Aussage, die ich am Anfang meines Spiels haben, innerhalb dieser Schleife habe ich eine if else/die besagt, dass, wenn es mehr als 1 Buchstabe in der Vermutung sind, wird es gib eine Aussage zurück, die dem Benutzer sagt, dass sie nicht gültig ist. Aber das Spiel hört sofort auf, Nachwort zu arbeiten.

while guesses < 6: 
    guess = raw_input("Please guess a letter: ") 
    if len(guess) > 1: 
    return "One letter at a time!" 
    else: continue 

Ich bin mir nicht ganz sicher, was zu meinem Code hinzufügen, um es für die Eingabe danach fragt, macht weiter.

Hier ist mein voller Code, es funktioniert momentan nicht für mich, nachdem ich nach Eingabe gefragt habe ... Ich nahm den Code von einem anderen Benutzer hier und reparierte es nach meinem Geschmack, da ihr Spiel nicht mehr als ein Wort verwendete und ich habe nicht überprüft, ob mehr als ein Buchstabe eingegeben wurde, wenn ich dazu aufgefordert wurde, und ich dachte mir, es wäre eine gute Übung, vorhandenen Code zu modifizieren, damit er etwas mehr tut, als er ursprünglich tut.

def hangman(): 
    guesses = 0 
    word = [] 
    guessed = [] 
    words = ["bichon frise", "maltese", "dachshund", "pomeranian", "golden retriever", "shih tzu", "rottweiler", "pit bull", "beagle", "poodle", "akita", "basset hound", "border collie", "boston terrier", "boxer", "bulldog", "chow chow", "chihuahua", "chinese crested", "french bulldog", "great dane", "great pyrenees", "greyhound", "icelandic sheepdog", "irish wolfhound", "komondor", "mastiff", "shnauzer", "pekingese", "welsh corgi", "redhound coonhound", "samoyed", "shiba inu", "weimaraner", "whippet", "italian greyhound", "yorkshire terrier"] 


    print "Welcome to Hangman. The words chosen are the names of various breeds of dogs, try and guess the word before the man is hung!" 

    answer = random.choice(words) 
    i = len(answer) 
    print "The length of the word is", i, "characters long" 
    for x in range(i): 
    if x == " ": 
     continue 
    else: 
     word.append('_') 

    while guesses < 6: 
    guess = raw_input("Please guess a letter: ") 
    if len(guess) > 1: 
     return "One letter at a time!" 
    else: 
     continue 


    if (guess in i): 
     print "The letter is in the word." 
     for index, letter in enumerate(i): 
     if letter == guess: 
      word[index] = guess 
     guessed.append(guess) 
    else: 
     print "The letter is not in the word" 
     guesses = guesses + 1 
     guessed.append(guess) 

    print "You have guessed these letters so far: %s)" % (''.join(guessed)) 
    print "Letters matched so far %s): %" (''.join(word)) 

    if ''.join(word) == answer: 
     break 

    if guesses == 6: 
    print "You didn't guess the right answer in time! The answer was %s" % answer 
    else: 
    print "You guessed the word!" 

Antwort

0

entfernen Leerzeichen zwischen den Wörtern aus der Antwort.

i Given (i als String?) Ist die Zeichenfolge, werden Sie wahrscheinlich nicht range(..) darauf verwenden sollten, da range eine int erwartet. Warum baut man statt einer neuen Zeichenfolge eine Liste? Sie können jedoch leicht einen Generator verwenden:

word = ''.join(c for c in i if c != ' ') 

word ist hier eine Zeichenfolge, die alle Zeichen von i enthält, die nicht ' '. Wenn Sie jedoch eine Folge von Unterstrichen erzeugen möchten, können Sie verwenden:

word = ''.join('_' for c in i if c != ' ') 

Wenn Sie eine Liste erstellen möchten (was der Rest des Codes erwartet), können Sie Liste Verständnis verwenden:

Es gibt eine Aussage zurück, die dem Benutzer sagt, dass das ungültig ist. Aber das Spiel hört sofort auf, Nachwort zu bearbeiten (sic.).

Das ist, weil Sie eine return Anweisung: return bedeutet, dass Sie aus der Funktion springen und (optional) einen Wert zurückgeben. Sie wollen wahrscheinlich zu print(..):

guesses = 0 
while guesses < 6: 
    guess = raw_input("Please guess a letter: ") 
    if len(guess) > 1: 
     print("One letter at a time!") 
    else: 
     #process char 
     continue 

ich Sie continue auch bemerkt verwenden. continue bedeutet, dass Sie den Rest der Iteration abbrechen und die nächste Iteration übernehmen. Dies bedeutet, dass Sie die Abfrage nicht verarbeiten. So müssen Sie die continue Teil entfernen:

while guesses < 6: 
    guess = raw_input("Please guess a letter: ") 
    if len(guess) > 1: 
     print("One letter at a time!") 
+0

Es ist ziemlich klar aus dem Code, dass "i" ist ein int ... – schwobaseggl

+0

@schwobaseggl: Nun in dem ersten Code-Fragment der ersten Zeile heißt: '## wo i ist das Wort 'weiterhin macht es keinen Sinn zu vergleiche 'x' mit' ''auf jeden Fall. –

+0

Ah, vergaß die Rückkehr, hoppla! Und die Wortliste, die Sie vorgeschlagen haben, ist viel kürzer und besser als die Range-Anweisung, die ich aufgestellt hatte! Vielen Dank. Ich bin mir sicher, dass ich das herausfinden werde. – kat

0

return beendet die Funktion genau dort, verwenden print statt:

print "One letter at a time!" 

Was die Leerzeichen, warum Sie nicht den Raum zu dem maskierten Wort anhängen? Auf diese Weise wird der Spieler muss es nicht erraten kann sehen, dass es Räume gibt, und Ihre join -check funktioniert:

for x in range(i): 
    if x == " ": 
    word.append(' ') 
    else: 
    word.append('_') 
+0

Mehr muss geändert werden, um den Loop-Teil zu korrigieren. Und dann ist da auch noch Whitespace. – Tagc

+0

Danke für die Hilfe! Ich habe Ihren Code verwendet, aber kurz nachdem ich eine bessere Alternative gefunden habe, die das Schreiben des Codes viel einfacher machte, ohne die Bereichsfunktion zu verwenden. Was war bei der "Buchstaben Übereinstimmungen so weit" -Linie, anstatt einfach nur beizutreten und zurück auf die Liste zu rufen, legte ich: ".join (l für l in rightguesses sonst" _ "für l in Antwort) der einzige Nachteil ist, dass ich nicht weiß, wie man ein zusätzliches Elif hinzufügt, um Whitespaces als Antwort zu erhalten. – kat

+0

@kat Verwende 'else '_" [l ==' '] 'anstelle von' else " _ "';) – schwobaseggl

Verwandte Themen