Hangman - Anfänger fragt an

Code-Stücke können hier veröffentlicht werden.
BlackJack

Beitragvon BlackJack » Sonntag 12. Oktober 2008, 22:06

@roschi: Es gibt `random.choice()`. Oder `random.shuffle()` und dann eine Schleife über die Worte, damit bei einem Programmlauf nichts doppelt vorkommt.

Das Leerzeichen am Ende von `guess_state` könnte man auch einfach entfernen, dann braucht man es nicht im Folgenden überall besonders behandeln. Oder man schreibt das Programm gleich so, dass das gar nicht erst angehängt wird. Zum Beispiel so:

Code: Alles auswählen

    guess_state = ' '.join('-' * len(w) for w in word.split())


Wobei `word` für etwas, das auch ein ganzer Satz sein kann, ein nicht so passender Name ist.

Als Verbesserungsvorschlag: `guess_state` aus dem gesuchten Wort bzw. Satz bilden, in dem alle Buchstaben durch Unterstriche ersetzt werden und alles andere aus dem Wort oder Satz übernommen wird. So kann man auch Satzzeichen und Bindestriche zum Raten verwenden. Zum Beispiel 'Tim Berners-Lee' in der Rubrik Internetpersönlichkeiten oder "O'Reilly" bei Verlagen.

Die magische 6 sollte aus der Anzahl der Bilder bestimmt werden.

Und Funktionen sind eine praktische Sache um Quelltext in handliche Einzelteile zu zerlegen.
Benutzeravatar
roschi
User
Beiträge: 225
Registriert: Samstag 29. März 2008, 18:58
Wohnort: Thueringen, Deutschland
Kontaktdaten:

Beitragvon roschi » Mittwoch 15. Oktober 2008, 18:37

hallo!

danke fuer die vorschlaege, BlackJack!
ich habe den code verbessert, und hoffe, dass ich nichts vergessen habe :)

hangmann.py: http://paste.pocoo.org/show/88183/
data.py: http://paste.pocoo.org/show/88184/

:D

mfg
roschi

PS:
pylint gibt mir 9,19/10 Punkte. es meckert etwas, weil ich keine doc-strings habe, aber sonst scheint alles okay zu sein.

[edit]noch ein paar typos ausgebessert[/edit]
Fuer Alle, die in Python einsteigen wollen, kann ich das Buch A Byte of Python nur waermstens empfehlen!
Birne94
User
Beiträge: 90
Registriert: Freitag 28. November 2008, 15:18
Kontaktdaten:

Beitragvon Birne94 » Freitag 28. November 2008, 15:33

Hangman mit GUI...
Nicht sauberste Programmierung, dafür wars eines meiner ersten Programme ;-)

Code: Alles auswählen

from turtle import *
from Tkinter import *
from random import *
from tkMessageBox import *

class Hangman:
    def __init__(self, w):
        self.woerter = w

        self.such_wort = self.wort()

        self.l = []
        num = 0
        self.fake = 0
        self.r = 0

        self.win = Tk()
        self.win.title("Hangman")

        self.word_frame = Frame(self.win)
        self.cv_frame = Frame(self.win)

        self.word_frame.pack()
        self.cv_frame.pack()

        for i in self.such_wort:
            if i == "-":
                self.l.append(Label(self.word_frame, text="-"))
            elif i == " ":
                self.l.append(Label(self.word_frame, text=" "))
            else:
                self.l.append(Label(self.word_frame, text="_"))
            self.l[num].c = i
            self.l[num].pack(side =LEFT)
            num += 1

        self.cv = Canvas(self.cv_frame, width=250, height=300, bg="gray")
        self.cv.pack()

        self.pen = RawPen(self.cv)                                  # Galgen
        self.pen.width(2)
        self.pen.tracer(0)

        self.win.bind("<Any-KeyPress>", self.key)

        self.win.mainloop()

    def wort(self):
        return choice(self.woerter)

    def key(self, event):
        c = event.char

        x = 0

        if c.upper() in self.such_wort:
            for i in self.l:
                if i.c == c.upper():# or i.c == c or i.c == c:
                    i.config(text=i.c)
                    self.r += 1
        else:
            x = 1

        if c.lower() in self.such_wort:
            for i in self.l:
                if i.c == c.lower():# or i.c == c or i.c == c:
                    i.config(text=i.c)
                    self.r += 1
        else:
            x += 1

        if x == 2:
            self.fake += 1
            self.draw()

        if self.r == len(self.such_wort):
            showinfo("Hang-Man", "Gewonnen!")

    def draw(self):
        if self.fake == 1:
            self.staender_1()
        elif self.fake == 2:
            self.staender_2()
        elif self.fake == 3:
            self.senk_stab_3()
        elif self.fake == 4:
            self.wag_stab_4()
        elif self.fake == 5:
            self.dia_stab_5()
        elif self.fake == 6:
            self.senk_stab_6()
        elif self.fake == 7:
            self.kopf_7()
        elif self.fake == 8:
            self.koerper_8()
        elif self.fake == 9:
            self.arm_l_9()
        elif self.fake == 10:
            self.arm_r_10()
        elif self.fake == 11:
            self.bein_l_11()
        elif self.fake == 12:
            self.bein_r_12()
            for i in self.l:
                i.config(text=i.c)
            showinfo("Hang-Man", "Aufgehangen!")

    def staender_1(self):
        self.pen.up()
        self.pen.goto(-100, -130)
        self.pen.down()
        self.pen.goto(-60, -80)

    def staender_2(self):
        self.pen.goto(-20, -130)

    def senk_stab_3(self):
        self.pen.goto(-60, -80)
        self.pen.goto(-60, 50)

    def wag_stab_4(self):
        self.pen.goto(20, 50)

    def dia_stab_5(self):
        self.pen.up()
        self.pen.goto(-30, 50)
        self.pen.down()
        self.pen.goto(-60, 10)

    def senk_stab_6(self):
        self.pen.up()
        self.pen.goto(20, 50)
        self.pen.down()
        self.pen.goto(20, 30)

    def kopf_7(self):
        self.pen.circle(-15)

    def koerper_8(self):
        self.pen.up()
        self.pen.goto(20, 0)
        self.pen.down()
        self.pen.goto(20, -70)

    def arm_l_9(self):
        self.pen.up()
        self.pen.goto(20, -20)
        self.pen.down()
        self.pen.goto(-10, -40)

    def arm_r_10(self):
        self.pen.up()
        self.pen.goto(20, -20)
        self.pen.down()
        self.pen.goto(50, -40)

    def bein_l_11(self):
        self.pen.up()
        self.pen.goto(20, -70)
        self.pen.down()
        self.pen.goto(0, -100)

    def bein_r_12(self):
        self.pen.up()
        self.pen.goto(20, -70)
        self.pen.down()
        self.pen.goto(40, -100)
           
w = ["Keks",
              "Schildkroete",
              "Kirchturm",
              "Zirkuswagen",
              "Hausstaub",
              "Giraffenkaefig",
              "Schaukelpferd",
              "Regenwaldvernichtung",
              "Forellen schmecken gut",
              "Pfuetze",
              "Mueller",
              "Mausefalle",
              "Pfefferkuchenhaeuschen",
              "Christbaum",
              "Ostereier verstecken und suchen",
              "Schornsteinfeger"
     ]

h = Hangman(w)

@roschi: ich hab mal deine Wörter benutzt^^
Benutzeravatar
Hyperion
Moderator
Beiträge: 7472
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Beitragvon Hyperion » Freitag 28. November 2008, 15:42

Hua ... das sieht ... grausam aus ;-)

Also mal im Ernst:
- keine Trennung von GUI und Funktionalität (ok, bei nem kleinen Projekt könnte man darüber hinwegsehen)

- sonderbare Klasseneinteilung und vor allem "Missbrauch" des Konstruktors (dann doch eher __cal__(self, ...))

- die draw-Methode ist wenig übersichtlich

- was folgt ist auch ziemlich unübersichtlich. Dort könnte man mit einer wohldefinierten Datenstruktur des "Hangmans" wesentlich besseren Code schreiben (kürzer, übersichtlicher und leichter anpassbar)

Tja, so viel auf die Schnelle.

Ich weiß ja nicht, was vorher im Thread zu als Tipps gegeben worden ist, aber das hier sieht mir nicht nach Fortschritt aus :-D
Birne94
User
Beiträge: 90
Registriert: Freitag 28. November 2008, 15:18
Kontaktdaten:

Beitragvon Birne94 » Freitag 28. November 2008, 15:48

Hyperion hat geschrieben:Hua ... das sieht ... grausam aus ;-)

Also mal im Ernst:
- keine Trennung von GUI und Funktionalität (ok, bei nem kleinen Projekt könnte man darüber hinwegsehen)

- sonderbare Klasseneinteilung und vor allem "Missbrauch" des Konstruktors (dann doch eher __cal__(self, ...))

- die draw-Methode ist wenig übersichtlich

- was folgt ist auch ziemlich unübersichtlich. Dort könnte man mit einer wohldefinierten Datenstruktur des "Hangmans" wesentlich besseren Code schreiben (kürzer, übersichtlicher und leichter anpassbar)

Tja, so viel auf die Schnelle.

Ich weiß ja nicht, was vorher im Thread zu als Tipps gegeben worden ist, aber das hier sieht mir nicht nach Fortschritt aus :-D


Ich habe selber schon bemerkt, dass der Quellcode ein Chaos ist, aber ich habe das Teil auch schon vor ~1 Jahr geschrieben^^

mfg
tordmor
User
Beiträge: 100
Registriert: Donnerstag 20. November 2008, 10:29
Wohnort: Stuttgart

Beitragvon tordmor » Freitag 28. November 2008, 17:38

So sieht's doch gleich besser aus:
http://paste.pocoo.org/show/92910/
Edit: Bugfixes und mehr Spaß :)

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder