Hangman mit Python

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.
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

Montag 15. Dezember 2008, 07:05

Rapfel hat geschrieben:(('', 1,) 6,)
Was soll denn das sein? So ein Ding existiert in Python nicht. Versuch doch wirklich mal dein Programm in übersichtliche Funktionen einzuteilen. Die Hauptfunktion könnte dann etwa so aussehen:

Code: Alles auswählen

def main():
    print_welcome()
    secret = create_secret_word()
    result = play_game(secret)
    print_endgame_statement(result)

gkuhl
Benutzeravatar
Hyperion
Moderator
Beiträge: 7472
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Montag 15. Dezember 2008, 20:04

ich weiß nicht wieso, aber irgend wie nervt mich deine Unfähigkeit Tipps umzusetzen so an, dass ich mal für Dich debuggt habe:
Das ganze per print. Hier die Zeilen 109-111, wo es spannend wird

Code: Alles auswählen

			for i in range(Anzahl_E):
				print Stelle, Position_B_1, Wort_V
				Wort_V[Position_B_1[Stelle]] = Eingabe
Das ergibt dann beim Durchlauf nach Eingabe von "e":

Code: Alles auswählen

  Geben Sie einen Buchstaben ein:e
1 (('', 1), 6) ['_', '_', '_', '_', '_', '_', '_', '_']
2 (('', 1), 6) ['_', '_', '_', '_', '_', '_', 'e', '_']
Traceback (most recent call last):
  File "hangman.py", line 111, in <module>
    Wort_V[Position_B_1[Stelle]] = Eingabe
IndexError: tuple index out of range
So, bitte tue mir den Gefallen und überlege nun, wieso das so passiert! Kleiner Tipp noch: Magic Numbers sind eben böse!

Generell aber noch einmal: Deine Datenstrukturen zur Modellierung dieses problems sind Schrott. Darauf auvbauend ist der Code drum herum auch mies und zwingt Dich zu Verränkungen. Zusätzlich kommt natürlich noch dazu, dass Du sicherlich nocht nicht so weit bist, die idealen Strukturen zu erkennen und zu nutzen. Aber bei einer besseren Struktur der daten und einer überlegten Planung und Strukturierung wäre da trotzdem ein halbwegs gutes Programm drin. Vor allem könntest Du dann kleinere Optimierungstipps von vielen Leuten hier erhalten. Diesen Code mag man sich wirklich nicht angucken ... ;-)
Benutzeravatar
Hyperion
Moderator
Beiträge: 7472
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Montag 15. Dezember 2008, 20:15

gkuhl hat geschrieben:
Rapfel hat geschrieben:(('', 1,) 6,)
Was soll denn das sein? So ein Ding existiert in Python nicht.
Naja, es ist ein Tupel in einem Tupel. Dazu mit "gemischten" Datentypen im ersten Tupel. So was kann man bauen - das geht ja auch! - die Frage nach der Bedeutung stellt sich aber. Was repräsentiert diese Struktur? Ich vermute mal schlimmes, nämlich das in ('',1) zunächst die Stelle steht, an der der geratene Buchstabe auftaucht und in '' eigentlich der Buchstabe stehen sollte, der angezeigt werden soll. In dem zweiten Teil (..., 6) steht dann die zweite Stelle, an der der Buchstabe vorkommt. Was aber dann bei drei oder mehr Vorkommen passiert, wage ich mal nicht zu überlegen :-D

Kann aber auch sein, dass ich da vollkommen falsch liege!
Versuch doch wirklich mal dein Programm in übersichtliche Funktionen einzuteilen. Die Hauptfunktion könnte dann etwa so aussehen:

Code: Alles auswählen

def main():
    print_welcome()
    secret = create_secret_word()
    result = play_game(secret)
    print_endgame_statement(result)

gkuhl
Wobei ich mir eher zuerst Gedanken um die Datenstruktur machen würde (Wie merke ich mir Wörter, wie verwalte ich geratene Buchstaben, wie verwalte ich das halb erratene Wort (oder lasse ich mir das lieber generieren anhand des Suchwortes und der Buchstaben?!?), wie zähle ich Erfolge / Misserfolge beim raten, ....).
Anschließend dann einfach das Raten simulieren, also eine Funktion erstellen, die das Auswerten eines Rateversuches übernimmt. Der kann man doch zunächst zum Testen ein Wort übergeben und dazu seuqentiell jeweils einen Buchstaben, der das Raten simuliert. Wenn man dieser Funktion die benötigten Datenstrukturen übergibt und dann die Auswertung hinbekommt, ggf. mit Ausgabe o.ä. und die wichtigen werte zurückliefern kann, damit es in der "Rate"-Routine weitergehen kann, hat man schon das schwierigste geschafft. Der Rest ist dann doch nur noch Beiwerk.
Zumal man so eine kleine Funktion dann auch wunderbar interaktiv austesten kann!
BlackJack

Montag 15. Dezember 2008, 20:30

@Hyperion: Ich denke gkuhl meinte das hier:

Code: Alles auswählen

In [303]: (('', 1,) 6,)
------------------------------------------------------------
   File "<ipython console>", line 1
     (('', 1,) 6,)
               ^
<type 'exceptions.SyntaxError'>: invalid syntax
*So* hat Python das also wahrscheinlich nicht ausgegeben. :-)
Benutzeravatar
Hyperion
Moderator
Beiträge: 7472
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Montag 15. Dezember 2008, 20:33

BlackJack hat geschrieben:@Hyperion: Ich denke gkuhl meinte das hier:

Code: Alles auswählen

In [303]: (('', 1,) 6,)
------------------------------------------------------------
   File "<ipython console>", line 1
     (('', 1,) 6,)
               ^
<type 'exceptions.SyntaxError'>: invalid syntax
*So* hat Python das also wahrscheinlich nicht ausgegeben. :-)
*g* Ooops ... hab die Kommata wohl intuitiv an die richtige Stelle umcodiert im Gehirn :-D
Konrad Wenzel
User
Beiträge: 15
Registriert: Freitag 3. Oktober 2008, 17:19

Montag 15. Dezember 2008, 20:46

Hallo,
man kann ein Bild malen oder herunterladen, mit einem hangman-Spiel ist es ebenso,
aber Programmieren lernt man nur durch Schreiben resp. Tippen und selber Denken

Denke nach, dann denke noch mehrmals nach und erst wenn du nochmal nachgedacht hast, beginne ein Programm zu schreiben - das hat mal L. auf englisch gesagt.

Wenn Du dann was geschrieben hast, beschreibe in Kommentaren wie es funktioniert und was die Bezeichner bedeuten - Ändern und Erinnern leicht gemacht

Wenn Dein Spiel endlich laufen wird, wird es wohl nicht lange Freude spenden:
Lerne eine Textdatei einzuladen. Aus dieser hole dir, natürlich per Programm, über zufällige Wahl eine Portion brauchbarer Worte, zB. 7-12 Zeichen lang, ohne Ziffern und Sonderzeichen.
-- wn --
Antworten