Hangman Hilfe benötigt

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
seiby
User
Beiträge: 13
Registriert: Samstag 30. April 2011, 05:50

Moinsen,
Ich hab gestern Nacht so aus Langeweile versucht Hangman zu programmieren.
Wie man merkt, hänge ich noch immer dran.
Erstmal der Code:
http://paste.pocoo.org/show/447384/
Und jetzt die Probleme:
- Nach der ersten Eingabe werden die _ und Buchstaben untereinander angezeigt (Ursache ist die for Schleife, Lösung fällt mir nicht ein)
- Der turns Zähler ist an der verkehrten Stelle, und zählt so zu oft.
- es fehlt ein Vergleich von geratenen Wort und tatsächlichen Wort
- Umlaute werden (wegen Windoof) nicht gescheit angezeigt, auch nicht mit "u" vor dem String.

Da bei mir die Konzentration allmählich nachlässt, frage ich hier mal kurz, vlt hat einer von euch ja grade nichts zu tun :D

MfG
seiby
Zuletzt geändert von seiby am Mittwoch 27. Juli 2011, 12:32, insgesamt 2-mal geändert.
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

Glaubst du errnsthaft jemand schaut sich deinen Code an der zu 90% aus Wörtern für das Spiel besteht?
Wohl eher nicht.

Wenn du dein Programm soweit kürzt, dass es überschaubar und trotzdem funktionstüchtig ist (zum Beispiel mit 2 statt 4.223.343 Wörtern in der Auwahl) würde das die Chance erheblich verbessern.
Zuletzt geändert von sparrow am Mittwoch 27. Juli 2011, 12:24, insgesamt 1-mal geändert.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Du solltest Deinen Code mal besser formatieren! Was sollen alle diese Leerzeilen?

Zudem musst Du in Code, welchen Du hier postest, nicht 100derte Daten drin stehen haben - ein / zwei Wörter hätten ja wohl gereicht ;-)

Sollte ein Code tatsächlich mal länger ausfallen (so größer ca. 25 Zeilen), dann lagere ihn in ein Paste-Bin aus (etwa das im Forum integrierte oder paste.pocoo.org).

@1) Erstelle erst den kompletten String (oder eine Liste aus Zeichen) und gib diesen erst dann aus. Bei einer Liste kannst Du das per

Code: Alles auswählen

print "".join(liste)
lösen

@Umlaute: s. meine Signatur ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
seiby
User
Beiträge: 13
Registriert: Samstag 30. April 2011, 05:50

So,
sry wegen der langen Wörterliste, war wohl noch etwas zu müde um zu denken :)
paste-bin probiere ich sofort nach diesem post aus.
umlaute lese ich gleich auch.
print "".join(liste) müsste dann gegen was getauscht werden?

EDIT:
Die Leerzeichen sind ne Angewohnheit von mir, ist so imho etwas übersichtlicher.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Leerzeichen != Leerzeilen - und letztere dienen nur dann der Übersicht, wenn sie sinnvoll gesetzt sind (z.B. nach Funktionen 2 Stück usw.).

@Code:

Du solltest Dir dringend noch mal Funktionen angucken und insbesondere Rückgabewerte. Credo Nummer eins: `global` sollte man nie nutzen (außer, man weiß, wieso!) Du brauchst es jedenfalls besser nicht.

Die Wörter würde ich nicht als (mehrzeiligen) String angeben, sondern direkt als Liste. Später lagert man das ja eh in eine separate Datendatei aus, bei der man dann entsprechend ein Parsing benötigt; das muss man ja aber nicht "vorziehen".

Schau Dir doch mal die `join`-Methode von Strings an; entweder in der Doku oder Du probierst die einfach mal in einer Konsole aus ;-)

Es fehlt in der Logik noch der Abgleich, ob alle Buchstaben schon geraten wurden!

Als letztes: Wenn Du einfach mal spicken willst, dann gibt es hier im Board schon zig Threads, in denen sich div. Ansätze finden lassen :-) Aber ok, zu Beginn erst einmal selber ein funktionierendes Spiel basteln ist schon sinnvoll!
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
seiby
User
Beiträge: 13
Registriert: Samstag 30. April 2011, 05:50

Jo, ich habe absichtlich einen weiten Bogen um die bestehenden Hangman Threads gemacht, da würde ich zuviel abschreiben^^
Du meinst also anstatt Werte Global zu setzen, einfach so:

Code: Alles auswählen

def choose_word():
    wahl = random.choice(liste)

    print "_ " * len(wahl)

    game(wahl)

    

def game(wahl):
    ...
join schau ich mir jetzt an,bei der Logik fehlt im Prinzip ne Variable in der die passenden Buchstaben drinnenstehen, die mit dem Wort abgeglichen wird.
Soweit richtig?
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Nein, eher nicht so.

1. Beeinhaltet die Funktion "choose_word" auch eine Ausgabe, die der Name der Funktion nicht impliziert. Sie macht also etwas, was man so nicht erwartet.
2. Hat die Funktion keinen Rückgabewert und ruft ihrerseits eine im Ablauf weiter untenstehende Funktion auf.

Vielleicht besser so etwas ("selbstgemachter Pseudocode mit viel dran auszusetzen")?

Code: Alles auswählen

def foo([args]):
     <logic in here>
     return value

def bar(value, [further args]):
     <logic in here>
     [return another value]

if __name__ == "__main__":
     <whatever>
     value = foo(...)
     bar(value, ...)
Also, das als Kurzfassung ohne viel Erklärung zum Thema Funktionen, die Dir das Tutorial besser geben kann.

HTH
Christian
Antworten