zahlenraten mit highscore etc

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
cyp++
User
Beiträge: 69
Registriert: Freitag 22. September 2006, 13:54

Freitag 22. September 2006, 13:59

hi@

ich muss bis heute 18uhr mein zahlenraten programm zu meinem lehrer schicken, doch bekom ich es iwie nicht hin, dass er den namen( den man zuvor eingibt), die gesuchte zahl und die anzahl der versuche die man gebraucht hat in eine .txt datei speichert. es kommen immer irgendwelche fehler mit list etc.! hier mal der gesamte code:

Code: Alles auswählen

# Import der benötigten Bibliotheken

import random
import time
import os

# Deklaration der Variablen

name=' '
janein=1
menu=0
versuche=0
schwierigkeitsgrad=0
eversuche=0
zahl=0
highscore=file('highscore.txt', 'r')

# Beginn des Programms

while janein==1:
    versuche=0

    print 'Zahlenraten'
    print '================'
    print '1. Spiel starten'
    print '2. Highscores'
    menu=input('3. Beenden ')
    if menu==1:
        # Namen erfassen
        name=raw_input('Trage deinen namen ein! ')
        # Schwierigkeitsgrad wählen
        schwierigkeitsgrad = input('Waehle einen Schwierigkeitsgrad! 1=leicht, 2=mittel, 3=schwer ')
        if schwierigkeitsgrad==1:
            zahl=random.randint(1,10)
            eversuche=5
        elif schwierigkeitsgrad==2:
            zahl=random.randint(1,100)
            eversuche=6
        else:
            zahl=random.randint(1,1000)
            eversuche=7
        # Schleife solange ausführen bis Limit erreicht ist
        while versuche != eversuche:
            bzahl=input('Gebe eine Zahl ein! ')
            if bzahl<zahl:
                print 'Leider zu klein!'
                versuche = versuche + 1
            elif bzahl>zahl:
                print 'Leider zu gross'
                versuche = versuche + 1
            else:
                versuche = versuche + 1
                print 'Gratulation! Anzahl der benoetigten Versuche:',versuche
                # schreibe ergebnis in die highscoreliste
                highscore.write(name)
                highscore.write(str(zahl))
                highscore.write(str(versuche))

                time.sleep(3)
                janein=input('Nochmal? 1=JA,0=NEIN ')
                if janein==1:
                    versuche=0
                    zahl=schwierigkeitsgrad
                if janein==0:
                    print 'Bis zum naechsen Mal!'
                    break
            # Wenn Limit erreicht, Game Over!
            if versuche==eversuche:
                print 'Game Over! Die gesuchte Zahl war:',zahl
                time.sleep(3)
                janein=input('Nochmal versuchen? 1=JA,0=NEIN ')
                versuche=0
            if janein==0:
                print 'Bis zum naechsen Mal!'
                break
    if menu==2:
        highscore=file('highscore.txt', 'r')
        print highscore.readlines()

    if menu==3:
        print '..beendet!'
        break
iwie will das nicht hinhaun mit dem highscore. der rest funktioniert wunderbar! btw ich bin totaler anfänger, 11. klasse :oops:
hoffe auf schnelle hilfe! mfg
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Freitag 22. September 2006, 14:16

Hi

Helfen können wir dir auch nur wenn du die Fehlermeldung uns mitteilst (also den genauen Traceback)

Gruss
Nirven
User
Beiträge: 130
Registriert: Mittwoch 10. Mai 2006, 08:18
Wohnort: Bremerhaven

Freitag 22. September 2006, 14:21

Allgemein verläßt du dich zu sehr darauf, dass die benutzer nur das erwartete tun. Aber wie man das unerwartete abfängt lernst du wahrscheinlich noch :)

Das einzige Problem das ich hatte, war das Highscorefile.
Du öffnest es in Zeile 17 lesend. Das ist unnötig. Und führt zu einem Fehler, wenn die Datei nicht existiert. Ein öffnen mit 'a' führt dazu, das die Datei angelegt wird, wenn sie noch nicht da ist, ohne das etwas überschrieben wird.

Bevor du in Zeile 56 etwas in die Datei schreiben kannst musst du sie schreibend öffnen.

Und allgemein solltest du eine Datei wieder schließen, nachdem sie benutzt wurde.

Ich habe nur die Stellen verändert, an denen etwas mit der datei gemacht wurde:

Code: Alles auswählen

# Import der benötigten Bibliotheken

import random
import time
import os

# Deklaration der Variablen

name=' '
janein=1
menu=0
versuche=0
schwierigkeitsgrad=0
eversuche=0
zahl=0
highscore = open('highscore.txt', 'a')
highscore.close()

# Beginn des Programms

while janein==1:
    versuche=0

    print 'Zahlenraten'
    print '================'
    print '1. Spiel starten'
    print '2. Highscores'
    menu=input('3. Beenden ')
    if menu==1:
        # Namen erfassen
        name=raw_input('Trage deinen namen ein! ')
        # Schwierigkeitsgrad wählen
        schwierigkeitsgrad = input('Waehle einen Schwierigkeitsgrad! 1=leicht, 2=mittel, 3=schwer ')
        if schwierigkeitsgrad==1:
            zahl=random.randint(1,10)
            eversuche=5
        elif schwierigkeitsgrad==2:
            zahl=random.randint(1,100)
            eversuche=6
        else:
            zahl=random.randint(1,1000)
            eversuche=7
        # Schleife solange ausführen bis Limit erreicht ist
        while versuche != eversuche:
            bzahl=input('Gebe eine Zahl ein! ')
            if bzahl<zahl:
                print 'Leider zu klein!'
                versuche = versuche + 1
            elif bzahl>zahl:
                print 'Leider zu gross'
                versuche = versuche + 1
            else:
                versuche = versuche + 1
                print 'Gratulation! Anzahl der benoetigten Versuche:',versuche
                # schreibe ergebnis in die highscoreliste
                highscore = open('highscore.txt', 'a')
                highscore.write(name)
                highscore.write(str(zahl))
                highscore.write(str(versuche))
                highscore.close()

                time.sleep(3)
                janein=input('Nochmal? 1=JA,0=NEIN ')
                if janein==1:
                    versuche=0
                    zahl=schwierigkeitsgrad
                if janein==0:
                    print 'Bis zum naechsen Mal!'
                    break
            # Wenn Limit erreicht, Game Over!
            if versuche==eversuche:
                print 'Game Over! Die gesuchte Zahl war:',zahl
                time.sleep(3)
                janein=input('Nochmal versuchen? 1=JA,0=NEIN ')
                versuche=0
            if janein==0:
                print 'Bis zum naechsen Mal!'
                break
    if menu==2:
        highscore=file('highscore.txt', 'r')
        print highscore.readlines()
        highscore.close()

    if menu==3:
        print '..beendet!'
        break 
Ein Problem mit 'list' hatte ich nicht, da müsstest du dann wirklich die Fehlermeldung posten.
cyp++
User
Beiträge: 69
Registriert: Freitag 22. September 2006, 13:54

Freitag 22. September 2006, 14:23

Traceback (most recent call last):
File:"E:\Daten\Zahlen\zahlenraten.py", line 77, in ?
highscore.write(name)
I0Error: (0, 'Error')
cyp++
User
Beiträge: 69
Registriert: Freitag 22. September 2006, 13:54

Freitag 22. September 2006, 14:31

danke Nirven! klappt wunderbar!
Allgemein verläßt du dich zu sehr darauf, dass die benutzer nur das erwartete tun. Aber wie man das unerwartete abfängt lernst du wahrscheinlich noch
ja in theorie wurde es schon angesprochen aber noch nicht in der praxis!
kleine frage noch: wie mach ich das, dass die neu eingetragenen highscores untereinander geschrieben werden und mit leerzeichen? so z.b.

test 1 3
name 2 5
.
.
.
usw
selbiges auch wenn ich auf highscores drück um sie mir anzeigen zu lassen!

mfg
murph
User
Beiträge: 622
Registriert: Freitag 14. April 2006, 19:23
Kontaktdaten:

Freitag 22. September 2006, 15:58

indem du diese schreibst!
my_file.write("\n") erzeugt einen Zeilenumbruch,
my_file.write(" ") ein Leerzeichen.
Ich würde zuerst alle strings zusammenfügen und dann diese größere Variable in die datei schreiben, also eher:

Code: Alles auswählen

to_write = name + " " + str(zahl) +  " " + str(versuche) + "\n"
my_file.write(to_write)
wenn du das so abspeicherst, wird das natürlich auch so wiedergegeben...zweiter teil der frage auch gelöst :-)
Zuletzt geändert von murph am Sonntag 24. September 2006, 09:16, insgesamt 1-mal geändert.
http://www.cs.unm.edu/~dlchao/flake/doom/
cyp++
User
Beiträge: 69
Registriert: Freitag 22. September 2006, 13:54

Samstag 23. September 2006, 09:56

funktioniert nicht murph
BlackJack

Samstag 23. September 2006, 10:51

Mal davon abgesehen das er in Zeile 3 den Unterstrich in `to_write` vergessen hat, funktioniert das. Da hättest Du aber auch selbst drauf kommen können, da es eine ziemlich eindeutige Ausnahme dazu gibt.
cyp++
User
Beiträge: 69
Registriert: Freitag 22. September 2006, 13:54

Samstag 23. September 2006, 14:31

nein, bei mir nicht!

Code: Alles auswählen

to_write = name + " " + str(zahl) " " + str(versuche) + "\n"
bei dieser zeile zeigt er mir einen syntaxerror: invalid syntax und ich habe es 1zu1 übernommen bis auf den variablen namen
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Samstag 23. September 2006, 14:37

Da fehlt ja auch ein +. Und genau dafür bieten sich die ursprünglich aus C bekannten printf-Konstrukte an:

Code: Alles auswählen

highscore.write('%s %d %d\n' % (name, zahl, versuche))
Wobei %s ein Platzhalter für einen String und %d oder %i für einen Integer/Dezimalzahl ist. Sieht ungewohnt aus, ist im täglichen Einsatz aber Gold wert.

Übrigens kannst du auch den Operator += verwenden, um den Code zu verkürzen und Variablen einfacher umbenennen zu können:

Code: Alles auswählen

versuche = versuche + 1
# wird zu
versuche += 1
Entsprechend funktioniert das auch bei Strings (auch wenn man da besser eine Liste join()en sollte) und ähnliche Operatoren sind -= und *= und /=.

Edit (Leonidas): Code in Python-Tags geändert.
Antworten