Hangman-Programm

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Dreiunddreißig
User
Beiträge: 8
Registriert: Sonntag 11. Juli 2010, 10:28

Sonntag 11. Juli 2010, 15:52

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?
Benutzeravatar
b.esser-wisser
User
Beiträge: 272
Registriert: Freitag 20. Februar 2009, 14:21
Wohnort: Bundeshauptstadt B.

Sonntag 11. Juli 2010, 15:55

Meinst du "list(word)"?
BlackJack

Sonntag 11. Juli 2010, 17:26

@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.
Dreiunddreißig
User
Beiträge: 8
Registriert: Sonntag 11. Juli 2010, 10:28

Sonntag 11. Juli 2010, 19:24

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
BlackJack

Sonntag 11. Juli 2010, 19:38

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.
Dreiunddreißig
User
Beiträge: 8
Registriert: Sonntag 11. Juli 2010, 10:28

Sonntag 11. Juli 2010, 20:24

Die Variablennamen sind mir recent very wayne ;) Wenn ich's zum Laufen bringe, werde ich die Variablen umbenennen.
Benutzeravatar
b.esser-wisser
User
Beiträge: 272
Registriert: Freitag 20. Februar 2009, 14:21
Wohnort: Bundeshauptstadt B.

Sonntag 11. Juli 2010, 21:00

Dreiunddreißig hat geschrieben:Die Variablennamen sind mir recent very wayne
Das solltest du ändern, falls du wieder Hilfe brauchst/willst/erwartest...
Dreiunddreißig
User
Beiträge: 8
Registriert: Sonntag 11. Juli 2010, 10:28

Montag 12. Juli 2010, 12:27

Hab ich jetzt alles gemacht. Variablen sehen jetzt so aus:
typ_stamm[_bezeichnung]

beispielsweise:
str_input
fkt_input_false
int_quantity_letters_word
Benutzeravatar
cofi
Moderator
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Montag 12. Juli 2010, 12:30

Das wird ja immer schlimmer, du solltest mal PEP 8 lesen.
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Montag 12. Juli 2010, 22:35

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*
My god, it's full of CARs! | Leonidasvoice vs Modvoice
BlackJack

Montag 12. Juli 2010, 22:51

@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:
Benutzeravatar
cofi
Moderator
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Montag 12. Juli 2010, 22:52

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:
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

Dienstag 13. Juli 2010, 11:42

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.
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

Dienstag 13. Juli 2010, 22:53

Lösung hast du ja auch hier erhalten: http://board.gulli.com/thread/1576902-p ... x-im-wort/
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Mittwoch 14. Juli 2010, 15:35

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
the more they change the more they stay the same
Antworten