Seite 1 von 1

Vergleich eines Int und Array Eintrags funktioniert nicht :(

Verfasst: Donnerstag 11. März 2010, 17:04
von h3nsen
Hallo,
ich bin neu hier deswegen wollte ich kurz was zu mir sagen. Ich studiere Bioinformatik und werde es in naechster Zeit wohl oefters mit Python zutun bekommen. Aus diesem Grund habe ich mich ma eingelesen und angefangen zu programmieren.
Da ich eben die Regeln gelesen habe: Das ist KEINE HAUSAUFGABE ich bin an einer Uni nicht FH da bekommt man so nette Aufgabe leider NICHT als Hausaufgaben ich mach das aus eigenem Interesse!

Als kleines Projekt will ich einen DartWurf Zaehler implementieren, der fuer je zwei Spieler 3 Wuerfe einspeichert, addiert und am Schluss bekannt gibt wer gewonnen hat.
Im Moment bin ich an der Klasse und habe soweit alles nur laesst sich der Sieger noch nicht ermittlen! Und ich kann nicht nachvollziehen WARUM? Waere super wenn ihr mir da weiterhelfen koenntet!
Am Schluss will ich mit Tkinter das ganze noch grafisch aufpeppen aber das kommt ers spaeter.
Also zu meinem Problem:

Ich speichere alle drei Wuerfe in eine List (ist wohl das Pendant zu Array, wenn ich das richtig verstanden habe?) und die Summe der Wuerfe. So nun wollte ich bei jedem Wurf abgleichen, ob jemand den gegebenen Startwert zB von 501 erreicht hat, um die while Schleife daraufhin abzubrechen und den Sieger bekannt zu geben.
Leider kommt bei meiner if-Abfrage allerdings jedes mal ein false raus und ich kann nicht nachvollziehen warum?
Der Code ist verkuerzt auf die entscheidende Teile!

Code: Alles auswählen

actValue0 = [ ] #aktueller Wert Spieler 1
actValue1 = [ ] # aktueller Wert Spieler 2
actVaule0.append(0) # Anfangswert jeweils auf 0 setzen
actValue1.append(0)
# das es eine List ist hat bestimmte Gruende ;)
startValue = raw_input("Bitte Startwert eingeben: ") # Startwert

# Gibt STartwert zurueck
def getStartValue():
    return startValue
    
 # Gibt aktuelle Wert des Spieler zureuck  
def getActValue(player):
    if(player == 0):
        return actValue0[0]
    else:
        return actValue1[0]

# Setzt aktuellen Wert des Spielers
def setActValue(player,value):
    if(player == 0):
        actValue0[0] = getActValue(0) +value
    else:
        actValue1[0] = getActValue(1) +value


# Spielt Methode
def start(player):
    while(1):

        print "neue Runde"
        print "Wert getActValue(0): ", getActValue(0)
        print "Wert getActValue(0): " , getActValue(1)
        print "Wert getStartValue: " , getStartValue()
        
        if(getActValue(0) == getStartValue()):  #entscheidenen STELLE!
            print "%s hat gewonnen!! =)" % name0
            break
        elif(getActValue(1) is getStartValue()): # auch immer FALSE
            print "%s hat gewonnen!! =)" % name1
            break
        else:
            #round = round+1
            print "Runde: " , getRound()
    
        saveShoot(player)
        
Selbst wenn ich als startValue = 0 setzte geht er nicht in die if Abfarge bzw. die Abfrage ist false und wird nicht ausgefuehert?

Hier mal die Ausgabe:
Importing test modules ... Bitte Startwert eingeben: 50
Bitte Name Spieler 1 eingeben: Hans
Bitte Name Spieler 2 eingeben: Bert
Startwert: 50
Hans beginnt!
neue Runde
Wert getActValue(0): 0
Wert getActValue(1): 0
Wert getStartValue: 50
Runde: 0
Wurf1 Spieler1: 10
Wurf2 Spieler1: 20
Wurf3 Spieler1: 20
neue Runde
Wert getActValue(0): 50
Wert getActValue(1): 0
Wert getStartValue: 50
Runde: 0
Wurf1 Spieler2: 20
Wurf2 Spieler2: 20
Wurf3 Spieler2: 20
neue Runde
Wert getActValue(0): 50
Wert getActValue(1): 60
Wert getStartValue: 50
Runde: 0
Wurf1 Spieler1: #etc geht nich aus der while Schleife raus
sowohl bei startValue = 50 als auch bei anderen (zB =0) ist die if Abfarge IMMER false? Wenn ich if(1); setze geht er rein also muss es am ausdruck

Code: Alles auswählen

getActValue(0) == getStartValue() 
liegen!? Aber ich lass mir die beiden Werte ja extra ausgeben und sie stimmen ueberein aber in der if KLammer nicht!?
Hab es auch schon mit

Code: Alles auswählen

getActValue(0) is getStartValue()
probiert? Aber nix

Danke fuer eure Hilfe =)

Verfasst: Donnerstag 11. März 2010, 17:18
von EyDu
Hallo und willkommen im Forum!

Ich gebe mal einen Hinweis:

Code: Alles auswählen

>>> "42" == 42
False
Als erste Frage natürlich: hast du das Python-Tutorial schon durchgearbeitet? Außerdem solltest du dringend einen Blick in PEP8 werfen: Python ist kein Java.

Warum hast du actValue0 und ActValue1? Wenn man anfängt Namen nach Nummern zu vergeben, dann will man eine Liste, ein Tupel oder ein Dictionary. Listen sind übrigens mehr als nur Arrays.

Was sollen diese ganzen trivialen get- und set-Methoden? Das sieht alles nach Copy&Paste aus und mit einer vernünftigen Datenstruktur sind die Dinger hier völlig überflüssig.

Zum while, for, if, elif gehören keine Klammern um den Ausdruck. Wie gesagt: Python, nicht Java ;-) Auch in der start-Funktion hast du ordentlich kopiert. Ach ja: True und False existieren.

Und was man, auch an Universitäten, ganz am Anfang lernt: globale Variablen sind böse. Bis auf ganz wenige Ausnahmen. Und dann noch der Hinweis auf den "if __name__ == "__main__""-Guard, einfach mal danach googlen.

Mit den Hinweisen kannst du sicher schon einiges anfangen und deinen Code danach aufbauen.

Bis dann,
Sebastian

Verfasst: Donnerstag 11. März 2010, 17:24
von h3nsen
EyDu hat geschrieben:Hallo und willkommen im Forum!

Ich gebe mal einen Hinweis:

Code: Alles auswählen

>>> "42" == 42
False
Hallo und Danke schonmal =)

Jetzt hat es Klick gemacht weil ich es mit dem raw-input als String einlese .. alles klar. Also das erst in Int umwandeln, alles klaro =)
Was du allerdings mit Copy Paste meinst verstehe ich nicht habe alles selber geschrieben!
Und ja ich komme aus der Java Programmierung bin aber allg noch am Anfang meiner Programmierkentnisse und dabei Video2Brains sowie Tutorials durchzugehen. Habe nur gemerkt, dass ich den besten Erfolg erziele wenn ich etwas programmiere und danbei lernen.
Die ganzen Getter und Setter wollte ich mal ausprobieren, ob das so funktioniert wie ich dachte und tut es ja auch. Was du da mit Datenstrukutr meinst versteh ich nicht, bin wie gesagt noch Beginner!
Um den Rest keumemre ich mich spaeter muss jetzt schnell weg! Danke fuer die Tipps =)
So viel sei noch gesgat wegen dem Layout ich habe den Code sehr umgeschrieben, dass man hier mit einem Blick sieht um was es geht wie ich es vorhabe und woran es scheitert ;)

gruss

Verfasst: Donnerstag 11. März 2010, 18:25
von Jack Daniels
Er meint, dass du nicht

Code: Alles auswählen

 # Gibt aktuelle Wert des Spieler zureuck 
def getActValue(player):
    if(player == 0):
        return actValue0[0]
    else:
        return actValue1[0]

# Setzt aktuellen Wert des Spielers
def setActValue(player,value):
    if(player == 0):
        actValue0[0] = getActValue(0) +value
    else:
        actValue1[0] = getActValue(1) +value
schreiben sollst, sondern eine Liste dafür verwenden sollst.

Code: Alles auswählen

Werte = []
Werte.append([0])
Werte.append([0])
und später dann (ohne die unnötigen Funktionen):

Code: Alles auswählen

print "Wert getActValue(0): ", Werte[0][0]
print "Wert getActValue(0): " , Werte[1][0]
, die erste eckige Klammer entspricht damit der "Spielerzahl", die zweite dem sounsovielten Wert, der in der Liste dieses Spielers gespeichert ist und du hast keine durchnummerierten Variablen mehr, denn durchnummerierte Variablen sind böse... Ganz nebenbei lässt sich das dann auch erweitern für mehrere Spieler.

Verfasst: Donnerstag 11. März 2010, 20:50
von Gabelmensch
h3nsen hat geschrieben: noch am Anfang meiner Programmierkentnisse und dabei Video2Brains sowie Tutorials durchzugehen.
Ich habe mir das V2B mal ausgeliehen, ganz ehrlich finde ich es eher suboptimal.
Dies: http://ada.rg16.asn-wien.ac.at/~python/how2think/ fand ich recht gut.

Verfasst: Sonntag 14. März 2010, 12:41
von h3nsen
hallo und dank fuer die vielen netten antworten!

die getter und setter sind dafuer dass ich per tkinter leichter eine GUI schreiben kann.
ansonsten danke fuer die vielen tipps, werde es beherzigen =) bin wie gesgat noch frisch ;)
gabel ich werde mir das tutorial gleich mal genauer ansehen.

also nochmals danke
gruss h3nsen

Verfasst: Sonntag 14. März 2010, 14:56
von numerix
h3nsen hat geschrieben:die getter und setter sind dafuer dass ich per tkinter leichter eine GUI schreiben kann.
Nein, die sind bei dir DESWEGEN da, weil du es von Java gewöhnt bist, dass du sie brauchst. Du brauchst sie aber gar nicht, weil du direkt den Datenattributen Werte zuweisen oder diese abfragen kannst. Mit Tkinter hat das nichts zu tun.