Seite 1 von 1

Hangman-Programm

Verfasst: Sonntag 11. Juli 2010, 15:52
von Dreiunddreißig
Ich bins wieder;
ich möchte ein Hangman-Programm schreiben. Um die Buchstaben des Wortes, dass ich vorher über random.randint zufällig bestimme und mit actual_word = word[chosen_word] abhole, in einem Array zu speichern, verwende ich folgenden Code:

Code: Alles auswählen

while buchstaben_word >= 0:
    einzelne_buchstaben[buchstaben_word:buchstaben_word] = [actual_word[buchstaben_word]]
Das liefert aber einen Fehler in der shell:

Code: Alles auswählen

Traceback (most recent call last):
  File ".../hangman.py", line 13, in <module>
    einzelne_buchstaben[buchstaben_word:buchstaben_word] = [actual_word[buchstaben_word]]
IndexError: string index out of range
Wie löse ich das anders?

Re: Hangman-Programm

Verfasst: Sonntag 11. Juli 2010, 15:55
von b.esser-wisser
Meinst du "list(word)"?

Re: Hangman-Programm

Verfasst: Sonntag 11. Juli 2010, 17:26
von BlackJack
@Dreiunddreißig: Du willst das Wort wahrscheinlich in einer Liste speichern. Der Begriff Array ist ein wenig irreführend, weil es in Python zwar auch Array-Objekte gibt, man aber für gewöhnlich mit Listen arbeitet.

`buchstaben_word` ist ganz sehr unschöner Name, einmal wegen der Mischung von Deutsch und Englisch und dann weil da anscheinend eine Zahl dran gebunden wird!? Das hätte ich jetzt nicht erwartet.

Mal angenommen das würde keine Ausnahme auslösen, dann wäre es wohl eine Endlosschleife denn die Variable in der Abbruchbedingung wird innerhalb der Schleife ja nicht verändert.

Du solltest Dir ausserdem mal die Funktionen im `random`-Modul anschauen. Auswahl eines zufälligen Elements aus einer Sequenz geht einfacher als selbst einen Index mit `randint()` beziehungsweise `randrange()` zu wählen.

Re: Hangman-Programm

Verfasst: Sonntag 11. Juli 2010, 19:24
von Dreiunddreißig
Ich setze die Variable immer eins runter, ist aber für das Problem imho irrelevant.

Ich habe es jetzt mit append gelöst. Sieht also so aus:

Code: Alles auswählen

while buchstaben_word > 0:
    einzelne_buchstaben.append(actual_word[aktueller_buchstabe])
    print einzelne_buchstaben
    aktueller_buchstabe = aktueller_buchstabe + 1
    buchstaben_word = buchstaben_word - 1

Re: Hangman-Programm

Verfasst: Sonntag 11. Juli 2010, 19:38
von BlackJack
Das ist total umständlich. Eine viel einfachere Lösung hat b.esser-wisser ja schon gezeigt. Kombiniert mit der passenden Funktion aus dem `random`-Modul ist das Auswählen, Zerlegen, und Zuweisen eine einzige Zeile in der nur `einzelne_buchstaben` und `word` (was wohl eher `words` heissen sollte) vorkommen und keine weiteren Hilfsnamen nötig sind.

Und das englische Wort "actual" bedeutet nicht "aktuell" sondern "tatsächlich", "wirklich", …. Ein klassischer Falscher Freund.

Re: Hangman-Programm

Verfasst: Sonntag 11. Juli 2010, 20:24
von Dreiunddreißig
Die Variablennamen sind mir recent very wayne ;) Wenn ich's zum Laufen bringe, werde ich die Variablen umbenennen.

Re: Hangman-Programm

Verfasst: Sonntag 11. Juli 2010, 21:00
von b.esser-wisser
Dreiunddreißig hat geschrieben:Die Variablennamen sind mir recent very wayne
Das solltest du ändern, falls du wieder Hilfe brauchst/willst/erwartest...

Re: Hangman-Programm

Verfasst: Montag 12. Juli 2010, 12:27
von Dreiunddreißig
Hab ich jetzt alles gemacht. Variablen sehen jetzt so aus:
typ_stamm[_bezeichnung]

beispielsweise:
str_input
fkt_input_false
int_quantity_letters_word

Re: Hangman-Programm

Verfasst: Montag 12. Juli 2010, 12:30
von cofi
Das wird ja immer schlimmer, du solltest mal PEP 8 lesen.

Re: Hangman-Programm

Verfasst: Montag 12. Juli 2010, 22:35
von Leonidas
Du solltest auf jeden Fall den Typ von fkt genauer definieren, etwa ``ftk_int_int_to_int_add`` für eine Addition, damit die Eingabe und Ausgabetypen klar sind. *SCNR*

Re: Hangman-Programm

Verfasst: Montag 12. Juli 2010, 22:51
von BlackJack
@Leonidas: Ich denke da fehlt noch was, damit man nicht vergisst, das Funktionen ja auch Objekte sind: `obj_fkt_int_int_to_int_add`. :twisted:

Re: Hangman-Programm

Verfasst: Montag 12. Juli 2010, 22:52
von cofi
BlackJack hat geschrieben:@Leonidas: Ich denke da fehlt noch was, damit man nicht vergisst, das Funktionen ja auch Objekte sind: `obj_fkt_int_int_to_int_add`. :twisted:
Na aber als Praefix stoert das doch!111 Das muss ein Suffix sein :roll:

Re: Hangman-Programm

Verfasst: Dienstag 13. Juli 2010, 11:42
von mkesper
Falls es durch die Kommentare vorher nicht klargeworden sein sollte: Ungarische Notation ist für Python nicht sinnvoll (auch für viele andere Sprachen nicht, aber das ist ein anderes Thema). Stattdessen ist es sinnvoll, möglichst sprechende Bezeichner zu wählen. Aus dem Namen einer Funktion sollte sich z.B. erschließen, was sie tut, bei einer Klasse, welche Objekte damit modelliert werden usw.

Re: Hangman-Programm

Verfasst: Dienstag 13. Juli 2010, 22:53
von Darii
Lösung hast du ja auch hier erhalten: http://board.gulli.com/thread/1576902-p ... x-im-wort/

Re: Hangman-Programm

Verfasst: Mittwoch 14. Juli 2010, 15:35
von Dav1d
Scrion hat geschrieben:Ich hoffe, du willst mit "int" am Anfang keinen Typ ausdrücken, wie etwa "integer" - dafür hättest du nämlich 2 saftige Ohrfeigen verdient, in jeder Programmiersprache. In Python hingegen bekommst du dafür 5.
+1