Seite 1 von 1

Rangliste mit file?

Verfasst: Montag 8. Oktober 2007, 15:08
von AphrodiTe
hi @ all,
ich habe ien Problem.Ich wollte sozusagen eine rangliste schreiben die den namen und die benötigten versuche Dokumentiert.
kann ich das mit file machne??? oder womit soll ich das machen.

Code: Alles auswählen

import random
def lieseingabe(prompt):
        eingabe=raw_input(prompt)
        return eingabe
        
def Zufallsziffern(n):
	m=""
	for i in range(4):
		m=m+str(random.randint(0,9))
	return(m)
def bestimmeap(z,ziffern):
	r=0
	for i in range(len(z)):
		if z[i]==ziffern[i]:
			r=r+1
	return(r) 
def bestimmeRichtige(z,hallo):
	r=0
	liste=[]
	liste.append(hallo[0])
	liste.append(hallo[1])
	liste.append(hallo[2])
	liste.append(hallo[3])
	for i in range(len(z)):
		if z[i] in liste:
			r=r+1
			liste[i]="x"
			
	return(r)
print "Willkommen bei mastermind.py ! geben sie 4 zahlen ein!"	
z=Zufallsziffern(4)
amplatz=0
versuche=0
while amplatz < 4:
	versuche=versuche+1
	eingabe=lieseingabe("Tipp?")
	richtig=bestimmeRichtige(z,eingabe)
	print "Sie haben",richtig,"Zahlen richtig"
	amplatz=bestimmeap(z,eingabe)
	print "und",amplatz,"am richtigen platz"
print "Hurra...sie haben mit nur",versuche, "Versuchen gewonnen"
ps: habe ein programm geschrieben:Mastermind. Ich möchte, dass das programm nachdem man gespielt hat, einen in die rangliste schreibt wenn man gut genug ist!

vielen dank

Verfasst: Montag 8. Oktober 2007, 15:33
von schlangenbeschwörer
Hi!
So ganz versteh ich deinen Code grad nicht, aber mal sehn...

Code: Alles auswählen

def lieseingabe(prompt):
        eingabe=raw_input(prompt)
        return eingabe
Das ist total überflüssig.

Code: Alles auswählen

def Zufallsziffern(n):
    m=""
    for i in range(4):
        m=m+str(random.randint(0,9))
    return(m)
Hier ist "n" überflüssig. (wolltest du range(n) schreiben?)
"m = m+ ..." lässt sich zu "m += ..." verkürzen.

Code: Alles auswählen

def bestimmeRichtige(z,hallo):
    r=0
    liste=[]
    liste.append(hallo[0])
    liste.append(hallo[1])
    liste.append(hallo[2])
    liste.append(hallo[3])
    for i in range(len(z)):
        if z[i] in liste:
            r=r+1
            liste[i]="x"
-was ist hallo für ein name?
-wenn len(hallo) immer gleich 4 ist, ist das überflüssig. Sonst ist auch mit

Code: Alles auswählen

liste=hallo[0:4]
getan
-die for-Schleife kann man auch schöner gestallten. Zuerst aber sollte man über die liste iritieren und dann eine neue anfertigen, die man ändert. Wenn du sie aber eh nicht verwendest brauchst du auch nix dran ändern.

Code: Alles auswählen

    versuche=versuche+1
Schon vor der ersten Eingabe hat man einen Versuch.

Zur Rangliste:
Am einfachsten wäre eine Liste in die du Tupel der Form (Anzahl-Versuche, Name) einfügst, die kannst du direkt sortieren und ausgeben.

mfg, jj

hi

Verfasst: Montag 8. Oktober 2007, 16:01
von AphrodiTe
hi,
also das ist dafür da damit ich später ncoh eine fehlermeldung einbauen kann,damit der benutzer nciht 5 zahlen oder sogar buchstaben eingeben kann...
das geht im moment nämlich nciht.
außerdem ist es somit übersichtlicher

Code: Alles auswählen

def lieseingabe(prompt):
        eingabe=raw_input(prompt)
        return eingabe
das mit dem tuple kenne ich. aber wie kann ich es so programmieren das er den spielstand sozusagen speichert?

thX

Verfasst: Montag 8. Oktober 2007, 16:27
von Rebecca
Wenn du Daten auch ueber die Laufzeit deines Programmes hinaus speichern willst, musst du das in Dateien tun. Schau mal hier:
http://www.python-forum.de/topic-6157.html

Verfasst: Montag 8. Oktober 2007, 16:55
von BlackJack
Ein paar Leerzeilen zumindest zwischen den Funktionen und Leerzeichen vor und nach Operatoren, sowie nach Kommata wären nicht schlecht. Dann "klebt" das optisch nicht alles so zusammen.

Solange `lieseingabe()` nichts anderes macht als `raw_input()` kann man das auch so schreiben:

Code: Alles auswählen

lieseingabe = raw_input
``return`` ist keine Funktion sondern eine Anweisung. So etwas wie ``return(obj)`` sieht deshalb sehr komisch aus. Das schreibt man normalerweise mit einem Leerzeichen und ohne Klammern: `` return obj``.

`zufallsziffern()` kann man mit `str.join()` und einem Generatorausdruck kompakter schreiben:

Code: Alles auswählen

def zufallsziffern(n): 
    return ''.join(str(randint.randint(0, 9)) for dummy in xrange(n))
`bestimmeap()` geht auch in einer Zeile:

Code: Alles auswählen

def am_richtigen_platz(vorgabe, eingegeben):
    return sum(int(a == b) for a, b in zip(vorgabe, eingegeben))
`bestimmeRichtige()` hätte ich wahrscheinlich so geschrieben:

Code: Alles auswählen

def anzahl_richtiger_ziffern(vorgabe, eingegeben):
    tmp = list(eingegeben)
    for ziffer in vorgabe:
        try:
            tmp.remove(ziffer)
        except ValueError:
            pass
    return len(vorgabe) - len(tmp)

thx

Verfasst: Dienstag 9. Oktober 2007, 12:48
von AphrodiTe
Vielen dank dafür =)
habe es mal verbessert bei mir. Glaube aber das bei dir auch ein fehler drinnen ist.
heißt es nciht random.randint und nicht randint.randint ??

mache mich jetzt mal an die rangliste :)



kai

das mit der textdatei habe ich verstanden =) ...ich öffne sie und schreibe etwas hinein.
wie kann ich jetzt dem programm klar machen das es gucken soll ob mal mit der anzahl der versuchen in die rangliste kommt??

Verfasst: Dienstag 9. Oktober 2007, 23:10
von Joghurt
Noch ein Tipp:
schlangenbeschwörer hat geschrieben:

Code: Alles auswählen

    for i in range(len(z)):
        if z[i] in liste:
            r=r+1
            liste[i]="x"
Das läßt sich schöner mit enumerate schreiben:

Code: Alles auswählen

for i,element in enumerate(z):
    if element in liste:
...