Seite 1 von 2

Hangman mit Python

Verfasst: Sonntag 14. Dezember 2008, 16:03
von Rapfel
Hallo,
ich bin neu ier und habe auch gleich mal ne Frage bzw ein Problwm.

Für die Schue programmiere ich gerade mit Python ein hangman-Spiel.
Benutze Listen usw, damits auch gut ankommt. Jetzt habe ich allerdings ein Problem, und zwar gibt der mir immer eine Fehlermeldung aus, wenn es darum geht, dass ein Buchstabe doppelt voprkommt und die Positionen in dem Wort ermittelt werden.

Code: Alles auswählen

# -*- coding: cp1252 -*-

#Importieren
from turtle import*
import random
from hangman_turtle import*

#Hinweise
print 'Beachte, dass alle Woerter, egal ob Nomen oder nicht, klein geschrieben werden.'

#Grundlegende Variablen
Versuche = 9

#Liste der Wörter
Woerter = ['beispiel', 'wort', 'hangman', 'eltern', 'geschwister', 'bruder',
             'name', 'spiel', 'klassenraum', 'informatik', 'sohn', 'tochter',
             'tier', 'programm']

#Anfang der eigentlichen Spieles
while Versuche > 0:

    #Veränderbare Variablen
    Punkte = 0
    Buchstaben = 0
    Anzahl_W = 0
    Position_B = 0
    Position_B_1 = 0
    Position_B_2 = 0
    Position_B_3 = 0
    Position_B_4 = ''
    Loesung = 0
    laenge = 0
    Falsch_B = ''
    Falsch_B_1 = 0
    Anzahl_E = 0
    Stelle = 0
    Stelle_2 = 0
    Stelle_3 = 0

    #Ermitteln und Ausgabe der Anzahl der Wörter, die noch ausstehen
    for words in Woerter:
        Anzahl_W = Anzahl_W + 1

    if Anzahl_W > 1:
        print 'Es befinden sich noch', Anzahl_W, 'zu loesende Woerter in der Liste.'

    else:
        print 'Es befindet sich noch ein zu loesendes Wort in der Liste.'
    
    print ' '
    print ' '

    #Zufallsermittlung des Wortes
    Auswahl = random.randint(0,Anzahl_W-1)
    Wort = Woerter[0]

    #Ausgabe der _ pro Buchstabe, Ermittlung der Anzahl an richtigen Buchstaben
    #für die Lösung und Ermittlung und Ausgabe der Anzahl der Buchstaben
    #in dem Wort
    for letter in Wort:
        print '_',
        Loesung = Loesung + 1
        Buchstaben = Buchstaben + 1

    print ' '
    print ' '

    print 'Das Wort hat', Buchstaben, 'Buchstaben.'
    print 'Sie haben noch', Versuche, 'Versuche.'

    print ' '

    #Erstellung der Variable zur Ausgabe der richtig erratenen Buchstaben
    Wort_V = Buchstaben * ['_',]

    #Beginn der Abfrage für das ausgewählte Wort
    while Versuche > 0:

        #Eingabe
        print ' ',
        Eingabe = raw_input('Geben Sie einen Buchstaben ein:')

        #Ermittlung wie oft der eingegebene Buchstabe vorkommt
        Anzahl_E = Wort.count(Eingabe)

        #Abgleich, ob der Buchstabe vorkommt
        if Eingabe in Wort:
            for letter in Wort:
                if Eingabe == Wort[Position_B]:
                    Position_B_1 = Position_B
                    if Anzahl_E > 1:
                        for i in range(Anzahl_E - 2):
                            Position_B_4 = Position_B_4, '_'
                        Position_B = Position_B + 1
                        for i in range(Anzahl_E):
                            while Position_B_4[Stelle_2] != Position_B:
                                if Eingabe == Wort[Position_B]:
                                    Position_B_4[Stelle] = Position_B
                                    Position_B = Position_B + 1
                                    Stelle = Stelle + 1
                                else:
                                    Position_B = Position_B + 1
                                Stelle_2 = Stelle_2 + 1
                    Position_B = 0
                    continue
                else:
                    Position_B = Position_B + 1

            Position_B = 0
            
            #Ausgabe der richtigen Buchstaben
            Wort_V[Position_B_1] = Eingabe
            if Anzahl_E > 1:
                for i in range(Anzahl_E):
                    Wort_V[Position_B_4[Stelle_3]] = Eingabe
                    Stelle_3 = Stelle_3 + 1
                    Loesung = Loesung - Anzahl_E + 1
            for letter in Wort:
                print Wort_V[Position_B_3],
                Position_B_3 = Position_B_3 + 1

            Position_B_3 = 0
            #Herabsetzen der zur Lösung benötigten richtigen Buchstaben
            Loesung = Loesung - 1

        #Falls der Buchstabe nicht vorkommt
        else:
            
            #Überprüfen, ob der Buchstabe bereits falsch geraten wurde
            if Eingabe in Falsch_B:
                print ' '
                print 'Sie hatten diesen Buchstaben bereits.'
                print ' '
                continue

            #Fall nicht, Anzahl der versuche herab setzen
            else:
                print ' '
                print 'Falsch'
                Versuche = Versuche - 1
                print 'Sie haben noch', Versuche, 'Versuche.'
                print ' '
                Falsch_B = Falsch_B, Eingabe,

        #Falls alle Buchstaben richtig geraten wurden
        if Loesung == 0:
            print ' '
            print ' '
            print 'Das Wort wurde geloest.'
            Punkte = Punkte + 1
            print 'Sie haben', Punkte, 'Punkte.'
            del Woerter[Auswahl]
            print ' '
            break

#Falls keine Versuche mehr übrig sind
print ' '
print ' '
print 'Sie haben verloren, da sie zu viele falsche Buchstaben geraten haben.'
hangman_turtle(laenge)
MfG Rapfel

Verfasst: Sonntag 14. Dezember 2008, 16:23
von derdon
Wenn du die Suche benutzt hättest, wärst du auf den Link gestoßen: uggc://jjj.clguba-sbehz.qr/cbfg-105721.ugzy#105721

Weil das aber für die Schule ist, habe ich ihn ein wenig unkenntlich gemacht :twisted:

Edit: Das del Statement braucht man nur sehr selten bis gar nicht. Warum benutzt du es?

Re: Hangman mit Python

Verfasst: Sonntag 14. Dezember 2008, 16:42
von numerix
Rapfel hat geschrieben:Für die Schue programmiere ich gerade mit Python ein hangman-Spiel. Benutze Listen usw, damits auch gut ankommt. Jetzt habe ich allerdings ein Problem, und zwar gibt der mir immer eine Fehlermeldung aus, wenn es darum geht, dass ein Buchstabe doppelt voprkommt und die Positionen in dem Wort ermittelt werden.
Wenn du die Original-Fehlermeldung hier postest, kann man sich gezielter an die Fehlersuche begeben ...

Re: Hangman mit Python

Verfasst: Sonntag 14. Dezember 2008, 16:53
von Hyperion
Rapfel hat geschrieben: Jetzt habe ich allerdings ein Problem, und zwar gibt der mir immer eine Fehlermeldung aus, wenn es darum geht, dass ein Buchstabe doppelt voprkommt und die Positionen in dem Wort ermittelt werden.
Und welche ist das? Es ist aus diversen Gründen hilfreich, diese hier zu posten - zusätzlich zum Quelltext! (Zumal der Code erst einmal nicht läuft, solange das mystische "hangman_turtle" Modul importiert wird, dank Auskommentieren läuft es dann und die Meldung wäre):

Code: Alles auswählen

Traceback (most recent call last):
  File "hangman.py", line 97, in <module>
    while Position_B_4[Stelle_2] != Position_B:
IndexError: string index out of range
Das passiert, wenn man einfach ein "e" eingibt, da zuerst immer das Wort Beispiel gewählt wird.

Code: Alles auswählen

for i in range(Anzahl_E):
    print Stelle_2, repr(Position_B_4)
    while Position_B_4[Stelle_2] != Position_B:
Füge mal diese print Ausgabe in Zeile 97 ein, dann wirst Du sehen woran es scheitert! Hier mal ein kleines Beispiel aus der Python-Shell:

Code: Alles auswählen

>>> a = ""
>>> a[0]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: string index out of range
>>> a = "test"
>>> a[0]
't'
Desweiteren empfiehlt es sich, so langen Quelltext in ein Pastebin auszulagern, hier wird gerne http://paste.pocoo.org/ genommen.

Dass Deine Zufallsermittlung nichts bewirkt (Zeile 54 f.) ist dir hoffentlich klar (nebenbei bemerkt gibt es random.choice() oder ggf. auch random.shuffle() - schau einfach mal in die Doku zum random Modul).

Code auf Modulebene ist grausam:
[wiki]Import[/wiki]
und dort der Abschnitt "Ausführung als Script"

Du hast viele Magic-Numbers:

Code: Alles auswählen

    #Veränderbare Variablen
    Punkte = 0
    Buchstaben = 0
    Anzahl_W = 0
    Position_B = 0
    Position_B_1 = 0
    Position_B_2 = 0
    Position_B_3 = 0
    Position_B_4 = ''
    Loesung = 0
    laenge = 0
    Falsch_B = ''
    Falsch_B_1 = 0
    Anzahl_E = 0
    Stelle = 0
    Stelle_2 = 0
    Stelle_3 = 0
Da steigt niemand durch! Was ist für was zuständig, wozu wird da ein Index hochgezählt (Stelle_0, Stelle_1, ...)? Da ist man fast immer mit einer Liste oder ähnlichem besser beraten.

PEP8 beachten! Speziell die Variablenbennung.

Außerdem wirkt das ganze komplett unstrukturiert! Hattet ihr schon das Thema Funktionen? Man kann den Code sicherlich viel besser aufteilen in kleine Teile und dabei sicherlich auch noch code sparen.

Statt range nimm lieber xrange. Listen kann man aber auch direkt iterieren, ohne über den Index zu gehen. (Wobei das auf den ersten Blick bei Dir nicht vorkommt ...)

Generell: Durch den Code steigt niemand (außer vielleicht Dir ;-) ) mehr durch! Versuche das Problem besser zu strukturieren, speziell den teil, in dem nach Buchstaben gesucht wird und wo man den bisherigen Stand mit "_" ausgibt. Mach Dir das erst einmal sauber klar und schreib eine kleine Funktionen, die einen Buchstaben, das bisher erratene Wort und das Ursprungswort erhält und dann abgleicht, ob der Buchstabe darin enthalten ist oder nicht (oder auch ob der schon einmal geraten wurde! Das machst Du nämlich bisher noch nicht). Wenn die Funktion klappt, mache Dir Gedanken, welche Werte an das Programm zurückgegeben werden müssen, damit der Punktestand aktualisiert werden und irgend wo eine Schleife mit dem Raten weitermachen kann oder aber auch das Spiel zu Ende ist usw.

Ohne Struktur ist es witzlos an diesem Berg Code weiterzuarbeiten!

Verfasst: Sonntag 14. Dezember 2008, 18:01
von Leonidas
derdon hat geschrieben:Edit: Das del Statement braucht man nur sehr selten bis gar nicht. Warum benutzt du es?
Weil man mit ``del`` Einträge aus Dicts löschen kann vermutlich. Ich habe mir den Code jetzt aber auch nicht genau angesehen ob sowas überhaupt nötig ist. Persönlich bevorzuge ich ja ``dict.pop(key)`` auch wenn es weniger effizient ist, aber das liegt vermutlich hauptsächlich an meiner Abneigung zu Statements ;)

Verfasst: Sonntag 14. Dezember 2008, 18:14
von Hyperion
Naja er will damit einen Eintrag aus einer Liste löschen. Das braucht er vermutlich, da sein zufälliges Wort-Raussuchen eben auf einem Index basiert und er wohl nicht möchte, dass Wörter doppelt geraten werden können. Nun ja, ich habe ja auch schon shuffle vorgeschlagen, das macht's dann überflüssig.

Verfasst: Sonntag 14. Dezember 2008, 19:24
von Rapfel
Erst einmal danke für die schnellen antworten ;)
Ja es ist mir bewusst, dass die Zufallsfunktion bisher nichts bringt, ich habe die 0 d anur reingeschriebn weil ich für versuchszwecke n wort mit zwei gleichen buchstaben brauchte und genau da knüpft mein nächstes problem an^^
Ich habe den Code etwas abgeändert und zwar wie folgt:

Code: Alles auswählen

# -*- coding: cp1252 -*-

#Importieren
from turtle import*
import random
from hangman_turtle import*

#Hinweise
print 'Beachte, dass alle Woerter, egal ob Nomen oder nicht, klein geschrieben werden.'

#Grundlegende Variablen
Versuche = 9
Punkte = 0

#Liste der Wörter
Woerter = ['beispiel', 'wort', 'hangman', 'eltern', 'geschwister', 'bruder',
             'name', 'spiel', 'klassenraums', 'informatik', 'sohn', 'tochter',
             'tier', 'programm']

#Anfang der eigentlichen Spieles
while Versuche > 0:

    #Veränderbare Variablen
    Buchstaben = 0
    Anzahl_W = 0
    Position_B = 0
    Position_B_1 = ''
    Position_B_2 = 0
    Loesung = 0
    laenge = 0
    Falsch_B = ''
    Richtig_B = ''
    Anzahl_E = 0
    Anzahl_E_1 = 0
    Stelle = 1

    #Ermitteln und Ausgabe der Anzahl der Wörter, die noch ausstehen
    for words in Woerter:
        Anzahl_W = Anzahl_W + 1

    #Falls keine Wörter mehr vorhanden sind
    if Anzahl_W == 0:
        break
    
    if Anzahl_W > 1:
        print 'Es befinden sich noch', Anzahl_W, 'zu loesende Woerter in der Liste.'

    else:
        print 'Es befindet sich noch ein zu loesendes Wort in der Liste.'
    
    print ' '
    print ' '

    #Zufallsermittlung des Wortes
    Auswahl = random.randint(0,Anzahl_W-1)
    Wort = Woerter[0]

    #Ausgabe der _ pro Buchstabe, Ermittlung der Anzahl an richtigen Buchstaben
    #für die Lösung und Ermittlung und Ausgabe der Anzahl der Buchstaben
    #in dem Wort
    for letter in Wort:
        print '_',
        Loesung = Loesung + 1
        Buchstaben = Buchstaben + 1

    print ' '
    print ' '

    print 'Das Wort hat', Buchstaben, 'Buchstaben.'
    print 'Sie haben noch', Versuche, 'Versuche.'

    print ' '

    #Erstellung der Variable zur Ausgabe der richtig erratenen Buchstaben
    Wort_V = Buchstaben * ['_',]

    #Beginn der Abfrage für das ausgewählte Wort
    while Versuche > 0:

        #Eingabe
        print ' ',
        Eingabe = raw_input('Geben Sie einen Buchstaben ein:')

        #Ermittlung wie oft der eingegebene Buchstabe vorkommt
        Anzahl_E = Wort.count(Eingabe)

        #Abgleich, ob der Buchstabe vorkommt
        if Eingabe in Wort:
            if Eingabe in Richtig_B:
                print ' '
                print 'Sie hatten diesen Buchstaben bereits.'
                print ' '
                continue
            else:
                while Anzahl_E_1 < Anzahl_E:              
                    if Eingabe == Wort[Position_B]:
                        Position_B_1 = Position_B_1, Position_B,
                        Position_B = Position_B + 1
                        Anzahl_E_1 = Anzahl_E_1 + 1
                    else:
                        Position_B = Position_B + 1

            Position_B = 0
            Anzahl_E_1 = 0
            
            #Ausgabe der richtigen Buchstaben und Herabsetzen der zur Lösung
            #benötigten richtigen Buchstaben
            for i in range(Anzahl_E):
                Wort_V[Position_B_1[Stelle]] = Eingabe
                Stelle = Stelle + 1
                Loesung = Loesung - 1
                Anzahl_E_1 = Anzahl_E_1 + 1
            for letter in Wort:
                print Wort_V[Position_B_2],
                Position_B_2 = Position_B_2 + 1

            Position_B_1 = ''
            Position_B_2 = 0
            Anzahl_E_1 = 0
            Stelle = 1
            Richtig_B = Richtig_B, Eingabe,

        #Falls der Buchstabe nicht vorkommt
        else:
            
            #Überprüfen, ob der Buchstabe bereits falsch geraten wurde
            if Eingabe in Falsch_B:
                print ' '
                print 'Sie hatten diesen Buchstaben bereits.'
                print ' '
                continue

            #Fall nicht, Anzahl der versuche herab setzen
            else:
                print ' '
                print 'Falsch'
                Versuche = Versuche - 1
                print 'Sie haben noch', Versuche, 'Versuche.'
                print ' '
                Falsch_B = Falsch_B, Eingabe,

        #Falls alle Buchstaben richtig geraten wurden
        if Loesung == 0:
            print ' '
            print ' '
            print 'Das Wort wurde geloest.'
            Punkte = Punkte + 1
            print 'Sie haben', Punkte, 'Punkte.'
            del Woerter[Auswahl]
            print ' '
            break

if Anzahl_W == 0:
    print ' '
    print 'Es befinden sich keine Wörter mehr in der Liste.'
    print 'Damit ist das Spiel beendet. Sie erhalten 5 Extra-Punkte.'
    Punkte = Punkte + 5
    print 'Somit haben Sie einen Endpunktestand von', Punkte,'.'
    print 'Herzlichen Glückwunsch.'

else:
    #Falls keine Versuche mehr übrig sind
    print ' '
    print ' '
    print 'Sie haben verloren, da sie zu viele falsche Buchstaben geraten haben.'
    hangman_turtle(laenge)
Wenn jetzt aber ein Buchstabe mehr als einmal vorkommt, dann gibt der mir wieder einen Fehler aus.

Code: Alles auswählen

Traceback (most recent call last):
  File "C:\Dokumente und Einstellungen\Raphael\Eigene Dateien\Python\Hangman\hangman.pyw", line 109, in <module>
    Wort_V[Position_B_1[Stelle]] = Eingabe
IndexError: tuple index out of range

Verfasst: Sonntag 14. Dezember 2008, 19:34
von derdon
Was heißt tuple index out of range denn auf deutsch?

Verfasst: Sonntag 14. Dezember 2008, 19:40
von Hyperion
Sorry, Du bist aber auch ein wenig Beratungs-resistent! Ich habe Dir zig Hinweise darauf gegeben, was es mit dem Fehler auf sich hat! Was da nun genau in Deinem Code zur Ausführung drin steht, musst Du eben per print-Debugging selber rausfinden. Aber wie gesagt, ich würde das alles wegschmeißen und mir Gedanken über den Ablauf einer Partie machen und die entsprechenden Datenstrukturen erstellen, die dafür benötigt werden. Dann anschließend die Kernfunktionalitäten als Funktion implementieren und am Schluss den ganzen Kram wie Wortliste, Zufallsgeneratoren und Eingaben dazu packen.

Verfasst: Sonntag 14. Dezember 2008, 19:45
von Rapfel
das bedeutet, dass tuple(?) nicht mehr im gültigen bereich liegt, ich verstehe allerdings nicht wieso.
sry ich bin noch etwas unerfahren mit der Sprache^^

Aber ich wollte das ganze auch nicht nochmal neu schreibn weil ich mein gemüt nur beruhigen wollte, indem es so wie es momentan ist endlich richtig funktioniert.

Verfasst: Sonntag 14. Dezember 2008, 19:52
von derdon

Verfasst: Sonntag 14. Dezember 2008, 19:56
von Hyperion
Rapfel hat geschrieben:das bedeutet, dass tuple(?) nicht mehr im gültigen bereich liegt, ich verstehe allerdings nicht wieso.
Weil innerhlab von Wort_V[Position_B_1[Stelle]] ein Index zu groß für die Sequenz ist! Das ist doch dasselbe Problem, was ich Dir oben schon einmal erläutert habe!
Was willst Du denn mit Position_B_1[Stelle] bezwecken? Was steht in Stelle, was in Position_B_1? Das kannst Du Dir auch davor mit print ausgeben lassen (s.o.) Dann wirst Du sehen, dass der Integerwert in Stelle einfach zu groß für Deine Sequenz ist! Und wenn das passen sollte, dann wird der Wert davon eben für Wort_V zu groß sein!

Code: Alles auswählen

>>> a = tuple("Hallo")
>>> for i in xrange(10):
...     print i, a[i]
...
0 H
1 a
2 l
3 l
4 o
5
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
IndexError: tuple index out of range
Versuche das mal zu kapieren, dann findest Du auch die Fehlerquelle!
sry ich bin noch etwas unerfahren mit der Sprache^^
Das merkt man ;-)
Aber ich wollte das ganze auch nicht nochmal neu schreibn weil ich mein gemüt nur beruhigen wollte, indem es so wie es momentan ist endlich richtig funktioniert.
Hm ... manchmal muss man das einfach, um weiter zu kommen.

Verfasst: Sonntag 14. Dezember 2008, 20:05
von Rapfel
in Position_B_1 stehen die Stelle an dennen der buchstabe inerhalb des wortes vorkommen, für e in beispiel wäre es 1 und 6.
und Wort_V[Position_B_1[Stelle(z.b. 1)] = Eingabe soll dafür sorgen dass der buchstabe an der stelle in dem wort eingegebn werden soll der zuvor ermittelt wurde.

Verfasst: Sonntag 14. Dezember 2008, 20:28
von Hyperion
Rapfel hat geschrieben:in Position_B_1 stehen die Stelle an dennen der buchstabe inerhalb des wortes vorkommen, für e in beispiel wäre es 1 und 6.
und Wort_V[Position_B_1[Stelle(z.b. 1)] = Eingabe soll dafür sorgen dass der buchstabe an der stelle in dem wort eingegebn werden soll der zuvor ermittelt wurde.
Kapiere ich jetzt so nicht ... Fakt ist da klappt was nicht! Lass Dir doch einfach die Werte der beteiligten Variablen ausgeben, dann siehst Du, was da drin steht und die Vermutungen haben ein Ende.

Verfasst: Sonntag 14. Dezember 2008, 20:40
von Rapfel
ja, also nurnoch mal zur verdeutlichung

als beispielwort habe ich 'beispiel'
Wort_V erstellt für jeden buchstaben einen '_'
also 8 an der zahl

dann gebe ich einen Buchstaben ein, z.b. e. Dann wird ermittelt an wlechen stellen der buchstabe e in beispiel steht, also an platz 1 und 6 weil python ja bei 0 beginnt zu zählen
dann sieht Position_B_1 so aus:

(('', 1,) 6,)

Dann kommt die Problemzeile

Wort_V[Position_B_1[Stelle]] = Eingabe

Die Variable Stelle steht bei 1.
Also nimmt Position_B_1 den zweiten Wert also 1. Und setzt sie ein bzw sollte es tun. Dann steht da Also Wort_V[1] = Eingabe
also im endeffekt

_ e _ _ _ _ _ _
das wir ddann weils zweimal is wiederholt und stelle wird um eins erhöht also die dritte stelle in Position_B_1, in diesem Fall 6
_ e _ _ _ _ e _

aber stattdessen gibt der einen fehler aus. Aber wenn der buchstabe nur einmal vorkommt funzt es.

Verfasst: Montag 15. Dezember 2008, 07:05
von gkuhl
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

Verfasst: Montag 15. Dezember 2008, 20:04
von Hyperion
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 ... ;-)

Verfasst: Montag 15. Dezember 2008, 20:15
von Hyperion
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!

Verfasst: Montag 15. Dezember 2008, 20:30
von BlackJack
@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. :-)

Verfasst: Montag 15. Dezember 2008, 20:33
von Hyperion
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