Spielerwechsel über boolsche Werte läuft inkorrekt

  • Themenstarter Themenstarter Dracor1588
  • Beginndatum Beginndatum
D

Dracor1588

Gast
Guten Abend,

ich sitze gerade an einem Uni Abschlussprojekt namens Knobel (nein, NICHT Kniffel, weil das hat ja copyright, so unser Prof *gg*).

Folgendes Problem. Die ganze Swing GUI läuft gut, als Punktezettel verwende ich eine JTable. ich kann würfeln, bla bla, summa summarum klappt auch das eintragen der Werte in die JTable gut, aber ich habe Probleme zwischen den 4 möglichen Spielern zu wechseln. Meine Vier Spieler sind bool'sche Werte

Java:
 public class KnobelModel {
       static int wurfzaehler = 0;
       static boolean spieler1;
       static boolean spieler2;
       static boolean spieler3;
       static boolean spieler4;



über

Java:
 private void jTable1MouseClicked(java.awt.event.MouseEvent evt) {                                     
        int f = jTable1.getSelectedColumn();
        int e = jTable1.getSelectedRow();

        jTable1.setValueAt(KnobelModel.tabelleneintrag(e, f), e, f);

lass ich mir, sobald meine 3 Würfe um sind, durch einen Klick auf die Tabelle angeben, wo die Punkte eingetragen werden sollen.
Die Berechnung der einzelnen Einträge mach ich über eine switch/case Anweisung

Java:
 public static int tabelleneintrag(int reihe, int spalte){

//(...)

if((spieler1 == true)&&(spalte == 1)){

               switch(reihe){
                    case (1):
                       
                        for(int i=0;i<wurfaugen2.length; i++){
                            if(KnobelModel.wurfaugen2[i] == 1){
                                ergebnis = ergebnis + KnobelModel.wurfaugen2[i];
                            }
                        }
                        ergebnisse[0] = ergebnis;
                        KnobelView21.jTable1.setValueAt(ergebnis, 1, 1);
                        checksum();
                        reset();
                return ergebnis;
//(...)

ganz am Ende aller Case Anweisung schalte ich den aktuellen Spieler auf false und den nächsten auf true:

Java:
//(hier oben der letzte return aus der case schleife)

} 
spieler1 =false;
 spieler2 = true; 

} //(Hier geht die große if schleife if((spieler1==true)&&(spalte ==1)) zuende

Problem ist: Das überswitchen in den nächsten Spieler klappt nicht. Jedesmal wenn eigentlich spieler 1 = false sein sollte und ich was bei spieler 2 eintragen will springt er mir aus der gesamten schleife raus und trägt mir nur den standard return wert -1 ein....

Ein bisschen schlauer bin ich schon:

Wenn ich den Wechsel gleich zu Beginn der if Schleife mache, also:

Java:
 if((spieler1 == true)&&(spalte == 1)){
                 spieler1 =false;
                 spieler2 = true;

klappen die ersten 3 spielerwechsel gut (mal davon abgesehen, dass meine checksum Funktion dann umgeschrieben werden müsste, aber das is wurst)..nur der Spielerwechsel von 3 auf 4 klappt wieder nicht. Ich habs 3 mal überprüft, der code is genau der selbe ^^ auch keinen zahlendreher oder so nen blödsinn drin.

Ich weiß nicht mehr weiter...was mach ich falsch? Um Fragen vorwegzunehmen...die Funktionen reset() und checksum() nehmen keinen einfluss auf die bool'schen Spieler und auch sonst ändere ich die werte NUR in den if Schleifen.

ich dachte erst, weil ich standardmäßig spieler1 als true initialisiert habe, dass es daran liegen könnte, aber ich hab mir jetzt nen spiel starten button geschrieben, wodurch spieler1 auch als default false initialisiert wird, und dann erst mit klick auf true gesetzt wird -> keine Wirkung.

ich muss da irgendwo nen Denkfehler drin haben, aber ich seh ihn einfach nicht, deshalb hoffe ich dass ein paar Augenpaare mehr in erkennbar machen ^^

Liebe Grüße

Dracor
 
Wenn du spieler1 und spieler2 "umschalten" willst, geht das am einfachsten mit
Java:
  spieler1 = ! spieler1;
  spieler2 = ! spieler2;
 
Ok, alles zurück...ich hatte nen dämlichen Klammerungsfehler vo 3ten zum 4erten Spieler...jetzt läuft der Spielerwechsel, aber eben halt auch nur wenn ich wie oben beschrieben die spieler gleich nach Beginn der if Schleife umswitche....was aber doof für meine checksum Funktion ist.

Außerdem möchte ich auch gerne verstehen WARUM das mit der Variante ich switche die als letztes um nicht klappt....kann mir das jemand bitte erläutern? dann müsste ich nicht die nächste Funktion umschreiben ^^

Liebe Grüße

Dracor
 
Wenn du spieler1 und spieler2 "umschalten" willst, geht das am einfachsten mit
Java:
  spieler1 = ! spieler1;
  spieler2 = ! spieler2;

Hmm, kannst du mir 2 sätze dazu schreiben? wenn ich das richtig verstehe progge ich damit: spieler1 ungleich spieler1 und spieler2 ungleich spieler2.....? ^^
 
Also ich habe es gerade mal eingebunden...zur Erinnerung: ich will von Spieler1 auf Spieler2 UMSCHALTEN..eingebunden habe ich es genauso wie du es oben gesagt hast.

Funktioniert irgendwie auch nicht. Bin wohl zu doof ^^
 
Ich gehe mal davon aus, dass am Anfang spieler1 == true und spieler2 == false ist, und dass du bei jedem "Zug" die Werte wechseln willst, also beim nächsten Durchlauf spieler1 == false und spieler2 == true u.s.w. Also wenn in einer der Variablen true drinsteht, soll beim nächsten mal false drinstehen und umgekehrt. Also negiere ich einfach den aktuellen Wert (das ! ist die logische Negation, in anderen Sprachen z.B. das "not").

Generell erscheint mir das, was ich oben sehe, ziemlich umständlich, aber ohne mehr Code kann ich dazu nicht viel sagen.
 
Hi Dracor,

das ganze sieht mir auf den ersten Blick ein bisschen arg "festverdrahtet" und wenig nach OOP aus.

Läuft dein Programm nur mit 4 Spielern oder auch mit 2,3 oder 100? Vielleicht lohnt sich ein allgemeinerer Ansatz, selbst wenn die Vorgabe heißt "genau 4 Spieler", das ist ja dann nur ein Spezialfall der allgemeinen Lösung.

Der codeteil if ((spieler==1) && (spalte==1)) kommt doch bestimmt für jeden Spieler extra im Code vor? Saubereres Design wäre bestimmt
Java:
if (gewaehlteSpalte == spielerDerGeradeDranIst)

oder wahrscheinlich noch besser

Java:
if(geawahlteSpalte == spielmanager.spielerDerGeradeDranIst() )

und zum Spielerwechsel:
Java:
spielmanager.zumNaechstenSpielerWechseln();
 

Zurück
Oben