Vergleich eines Int und Array Eintrags funktioniert nicht :(

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
h3nsen
User
Beiträge: 5
Registriert: Donnerstag 11. März 2010, 16:44

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 =)
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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
Das Leben ist wie ein Tennisball.
h3nsen
User
Beiträge: 5
Registriert: Donnerstag 11. März 2010, 16:44

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
Jack Daniels
User
Beiträge: 30
Registriert: Freitag 1. Januar 2010, 11:38

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.
Gabelmensch
User
Beiträge: 79
Registriert: Montag 12. Oktober 2009, 11:50

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.
h3nsen
User
Beiträge: 5
Registriert: Donnerstag 11. März 2010, 16:44

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
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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.
Antworten