Hangman mit Datendatei

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
mcdaniels
User
Beiträge: 168
Registriert: Mittwoch 18. August 2010, 19:53

Mahlzeit!
Ich wollte heute mal versuchen mir eine Hangman Variante zu basteln. Diese Hangman Variante soll die Suchwörter aus einer Textdatei beziehen. Danach soll der User 10x die Möglichkeit haben Buchstaben zu raten. Die geratenen Buchstaben werden in einer Variable gespeichert über die dann wiederum verglichen wird, ob die eingegebenen Buchstaben im Suchwort vorkommen.

Code: Alles auswählen

datei=open("g:\\python\\test.txt","r")

for zeichen in datei:
    print ('Das Wort hat ' + str(len((zeichen)))+ ' Zeichen')

geraten = ''
zuege = 10

while zuege>0:
    print('Noch '+str(zuege)+' Zuege')
    zuege=zuege-1
    buchstabe = raw_input ('Raten:')
    geraten = geraten+buchstabe

    if geraten in zeichen:
        print ('JA')
    else:
        print ('NEIN')
    print ('Folgende Buchstaben bereits geraten:' + geraten)
datei.close()

Probleme:
1. Aufgrund dessen, dass hier immer mit der gesamten Variable "geraten" verglichen wird, wird bei Angabe eines nicht im Wort vorkommenden Buchstaben diese Variable um einen "falschen" Buchstaben erweitert, was den Vergleich "geraten in zeichen" immer auf das Else-Statement zwingt. Ich sehe eventuell eher eine Möglichkeit für die einzelnen Buchstaben eine Liste zu verwenden. Bin ich damit auf dem Holzweg?
2. Würde ich gerne entsprechend der Anzahl der Buchstaben des Suchwortes "_" anzeigen, die sich bei Angabe des korrekten Buchstaben dann in den entsprechenden Buchstaben "verwandeln". Hier hab ich im Moment leider gar keien Idee dazu.

Vielleicht habt ihr ein paar Tips?

LG
Zuletzt geändert von mcdaniels am Dienstag 24. August 2010, 12:39, insgesamt 1-mal geändert.
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Hallo,

ein Paar Anmerkungen:

Verwende lieber Python als Code-Tags.

Datein solltest du mit dem Idiom`with open(fn) as fo` öffnen.

Die ausgelesenen Wörter sollten in einer Liste landen mit der du dann weiter arbeitest.

print nimmt mehrere Argumente. Außerdem gibt es string-formatting: `print "Noch %s Zuege" %zuege

Glaubst du es macht Sinn einen geratenen Buchstaben ungeprüft der Menge der erratenen hinzuzufügen?

Da wir schon bei Mengen sind: schau dir mal `set`\s an.

Ist es nicht konsequenter die Anzahl falscher Züge zu begrenzen?

Zu dem Anzeigen der erratenen Buchstaben gebe ich dir mal das vor:

Code: Alles auswählen

''.join(c if c in guessed_letters else '_' for c in word)
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
mcdaniels
User
Beiträge: 168
Registriert: Mittwoch 18. August 2010, 19:53

Hey!
Idiom`with open(fn) as fo
...damit fange ich im Moment nicht viel an -> trotz Google Recherche
Die ausgelesenen Wörter sollten in einer Liste landen mit der du dann weiter arbeitest.

Code: Alles auswählen

woerter=[]
for zeichen in datei:
    woerter.append(zeichen)
Somit landen die Wörter zwar in einer Liste, jedoch würden -wenn in der Datei 2 Wörter stehen - diese genau einem Eintrag in der Liste entsprechen.

Führt in meinem Fall dann dazu dass bei woerter[0] beide Wörter anzeigt werden:
woerter[0]
'python,pascal'

Als einzelne "Einträge" würden die Wörter nach meinem Verständnis nach nur dann landen, wenn ich die Liste einzeln mit Daten füttere, aber nicht in einem Durchgang die Daten die in der Datei einlese und an die Liste übergebe. In dem Fall hab ich in meiner Liste einen String 'python,pascal' auf Index[0]

Ein steiniger Weg, der immerwieder von Zweifeln behaftet ist. Grade vorhin ist mir der Gedanke durch den Kopf gegangen: "Das darf doch nicht wahr sein, ich steh schon wieder an und weiss nicht weiter...." Ich habe vor allem Probleme die entsprechenden Infos zu finden. Teilweise findet man Programmierbeispiele, die mir einleuchten, die dann aber wieder offenbar veraltet sind. Abgesehen davon ist es mit meiner Wenigkeit auch nicht einfach... Wie mein Mathelehrer immer sagte "ich denke viel zu kompliziert und stelle mir damit selbst ein Bein."

Aber jammern hilft nicht, ich bin fest dazu entschlossen mir das beizubringen!

LG
Zuletzt geändert von mcdaniels am Dienstag 24. August 2010, 12:39, insgesamt 1-mal geändert.
.robert
User
Beiträge: 274
Registriert: Mittwoch 25. April 2007, 17:59

Um die Wörter in eine Liste zu packen, solltest du dir mal ansehen, wie die in der Datei getrennt sind, und sie dann entsprechend splitten. Das for .. in nimmt per default ein \n (Zeilenumbruch) als Trenner.

Und über das with-Statement findest du in der Doku einiges...
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Mein Tipp: Fange ohne Persistenz an! Du kannst Dir doch eine Liste mit Wörtern im Script kurz anlegen...

Später nimmst Du dann json, pickle oder sonst ein Modul, um die Liste aus einer Datei zu laden.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
mcdaniels
User
Beiträge: 168
Registriert: Mittwoch 18. August 2010, 19:53

Hey!
Nun sieht mein Code folgendermaßen aus:

Code: Alles auswählen

import random

ratewoerter=['hund','affe','schlange']
ratewort=random.choice(ratewoerter)
weiter="j"
geraten= ''
leben=5

while weiter == "j":
    for buchstaben in ratewort:
        if buchstaben in geraten:
            print (buchstaben),
        else:
            print('_'),
            
    ratebuchstabe = raw_input ('Raten:')
    geraten=geraten+ratebuchstabe
    

    if ratebuchstabe not in ratewort:
      print('Noch: %s Versuche'%leben)
      leben=leben-1
      if leben==0:
          print ('Leider verloren')
          break
Mir fehlt noch die Abfrage die "Sie haben Gewonnen" auslöst.

Allerdings hab ich mir das ganze dann aus Fragmenten, die es im Netz schon gibt zusammengedacht / geschustert, was mich wenig stolz macht, da ich es aus eigener Kraft schaffen wollte.

LG
Zuletzt geändert von mcdaniels am Dienstag 24. August 2010, 12:37, insgesamt 1-mal geändert.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Wie jbs schon sagte benutzte mal die Python-Code-Tags!

Was soll man sagen: Arbeite doch mal das Tutorial durch! Dann lernst Du auch Dinge wie Funktionen kennen und verbannst die häßlichen globalen Variablen.

Wozu gibt es den Namen "weiter"? Ein

Code: Alles auswählen

while True:
    # usw.
hätte es hier doch auch getan. Oder sogar über "leben" testen - denn damit willst Du es ja eh beenden.

"buchstaben" ist vom Namen irreführend; es ist immer nur einer an diesen Namen gebunden.

Ich würde geraten als Liste oder Set implementieren, nicht als String.

Der Code ist außerdem eine schlechte Mixtur aus Python 3.x und Python2.x Code. Was nutzt Du? Bei 3 gibts doch afaik raw_input nicht mehr, was bei Dir auf 2.x schließen lässt. Dort ist print aber keine Funktion -> also schreibe es auch nicht so.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
mcdaniels
User
Beiträge: 168
Registriert: Mittwoch 18. August 2010, 19:53

Hallo!
Der Code ist außerdem eine schlechte Mixtur aus Python 3.x und Python2.x Code. Was nutzt Du? Bei 3 gibts doch afaik raw_input
nicht mehr, was bei Dir auf 2.x schließen lässt. Dort ist print aber keine Funktion -> also schreibe es auch nicht so.
Ein paar Posts vorher wurde dazu geraten Print als Funktion zu verwenden. Das Tutorial auf http://tutorial.pocoo.org/ bezieht sich auf Python 3.1, ich habe Python 2.7. Also ist ja das Tutorial auch wieder kontraproduktiv. :K
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

mcdaniels hat geschrieben:Hallo!
Der Code ist außerdem eine schlechte Mixtur aus Python 3.x und Python2.x Code. Was nutzt Du? Bei 3 gibts doch afaik raw_input
nicht mehr, was bei Dir auf 2.x schließen lässt. Dort ist print aber keine Funktion -> also schreibe es auch nicht so.
Ein paar Posts vorher wurde dazu geraten Print als Funktion zu verwenden.
In diesem Thread sicher nicht! Oder bin ich blind?
mcdaniels hat geschrieben: Das Tutorial auf http://tutorial.pocoo.org/ bezieht sich auf Python 3.1, ich habe Python 2.7. Also ist ja das Tutorial auch wieder kontraproduktiv. :K
Da Du offensichtlich blutiger Anfänger bist, erspare ich mir das OMG ;-) Denk doch noch mal über den ersten Satz nach! Dann sollte Dir doch klar sein, wo der Hund begraben liegt und dass Dein letzter Satz schlicht falsch ist!

Als kleiner Tipp mal das hier:
http://docs.python.org/py3k/whatsnew/3. ... a-function
http://docs.python.org/tutorial/index.html

;-)

Edit: Weil mir Java heute auf den Senkel ging, mal mein Vorschlag für Python 2.x
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
mcdaniels
User
Beiträge: 168
Registriert: Mittwoch 18. August 2010, 19:53

Hello!
Hyperion hat geschrieben: In diesem Thread sicher nicht! Oder bin ich blind?
Nein, du bist nicht blind. Ich meinte natürlich in nem andren Thread von mir. - Sorry -
Hyperion hat geschrieben: Denk doch noch mal über den ersten Satz nach! Dann sollte Dir doch klar sein, wo der Hund begraben liegt und dass Dein letzter Satz schlicht falsch ist!
Bitte zitieren, worauf beziehst du dich hier genau?

vielen Dank für deine Links, werde ich mir natürlich anschauen :-)

Ebenso danke für deinen Vorschlag für Python 2.7! So hätte ich das nie im Leben realisieren können. Fällt mir dazu wiedermal nur ein: "Ich hab selbst die Latte zu hoch gesetzt, oder aber ich sollte es einfach lassen, da ich mir dieses Tutorial auch schon zu Gemüte geführt habe (und das nicht nur 1x)..."
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

mcdaniels hat geschrieben: Bitte zitieren, worauf beziehst du dich hier genau?
Mir ging es darum, dass es eigentlich offensichtlich sein sollte, dass wenn Du das Tutorial zu Python 3.1 liest, aber mit 2.7 arbeitest, Dir ungewollt die Unterschiede beider Sprachversionen zu schaffen machen ;-) Das hat nichts damit zu tun, dass das Tutorial aus der Doku nicht empfehlenswert oder gar kontraproduktiv ist! Du musst eben das zu Deinem Interpreter passende Tutorial durcharbeiten.

Zwischen Python 2.x und 3.x hat sich eben das ein oder andere verändert. "print" ist da eben eine Sache, die hier sofort auffällt. Daher gibts ja auch immer Abschnitte in der Doku, die auf die Unterschiede zur Vorgängerversion hinweisen :-)

Nebenbei: Nicht verzweifeln, sondern Üben üben üben und lernen (wollen), lernen, lernen! :-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
mcdaniels
User
Beiträge: 168
Registriert: Mittwoch 18. August 2010, 19:53

hyperion hat geschrieben: Nebenbei: Nicht verzweifeln, sondern Üben üben üben und lernen (wollen), lernen, lernen! :-)
Will ich ja, nur ist es halt ein wenig demotivierend, dass ich eine derart Lange Leitung hab :( Muss mir oft einfachen Code, den ich lese, 10x durchlesen/denken, bis ich kapier worum es geht. Ein andrer macht nen Blick drauf und sagt "klar!"

BTW Stimmt es, dass von Python 3.x zur Zeit eher abzuraten ist, da es noch nicht "Standard" ist bzw. etliche für 2.7 vorhandene Module noch nicht für Python 3.x zur Verfügung stehen?

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

mcdaniels hat geschrieben:Will ich ja, nur ist es halt ein wenig demotivierend, dass ich eine derart Lange Leitung hab :( Muss mir oft einfachen Code, den ich lese, 10x durchlesen/denken, bis ich kapier worum es geht. Ein andrer macht nen Blick drauf und sagt "klar!"
Das ging den meisten von uns so ;-)
BTW Stimmt es, dass von Python 3.x zur Zeit eher abzuraten ist, da es noch nicht "Standard" ist bzw. etliche für 2.7 vorhandene Module noch nicht für Python 3.x zur Verfügung stehen?
Jein. Für Dich als Anfänger würde ich Python 3 durchaus für angebracht halten, da Du ja erst einmal eh mit der Standard-Lib arbeiten wirst. Letztlich sind schon viele popoläre Module auch auf Python 3 portiert. Speziell im bereich Webentwicklung gibt es derzeit noch massive Probleme (Stichwort WSGI). Aber bis Du so weit bist, würdest Du dann auch für solche Dinge auf Python 2.x zurückgreifen können. Denn so massiv sind die Unterschiede dann auch wieder nicht.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten