spiel "Gefangenendilemma" Probleme mit Interfaces

Status
Nicht offen für weitere Antworten.

Jatoll

Bekanntes Mitglied
Hallo, bin ja noch neu in Java und wir haben folgende Klassen (vielleicht erklärt sich das schon von selbst):

Java:
package Hausaufgaben;

public interface GefStrategie {
	
 boolean getNextDecision();
 // Diese Methode gibt als Ergebnis die nächste eigene Spielsentscheidung zurück.
 
 void setOpponentsLastDecision (boolean decision);
 //In dieser Methode wird dem Spieler der letzte Zug des Gegners mitgeteilt.
}


Java:
package Hausaufgaben;

public class DasSpiel {
	public static void main(String[] args) {
		
		//Neues Objekt vom Typ GefDilemma mit 2 Spielern 
		GefDilemma GD=new GefDilemma(new Pavlov(),new PerKind());
		
		
		//100 mal spielen
		GD.spiele(100);
		
		}
}


Java:
package Hausaufgaben;

public class GefDilemma {
	
	int player1 = 0;
	int player2 = 0;
	public GefDilemma(GefStrategie spieler1, GefStrategie spieler2) {
	
	}
	

	public void spiele(int n){
	  
		for (int i = n; i>0; i--){
		if (spieler1 == true && spieler2 == true) // klappt nicht aber wieso?
			
			
	    }	
	}
	
	/* führt n Spielrunden aus. Das darf den Spielern natürlich nicht bekannt sein.
	 * Eine Spielrunde besteht aus:
		 - Abfrage der Spieltaktik beider Spieler,
	     - Verteilen der Punkte.
         - Beide Spieler bekommen den Zug des gegnerischen Spielers mitgeteilt und
         überdenken so ihre Taktik für die nächste Runde.

 Nach den n Spielrunden wird das Ergebnis auf dem Bildschirm ausgegeben.
 Es gewinnt der Spieler mit den wenigsten Strafpunkten.
*/
	
}


und hier mal eine Strategie:
Java:
package Hausaufgaben;

public class Pavlov implements GefStrategie {
	private boolean erster = false;
	private boolean opponentsLastDecision = true;
	private boolean myLast = true;

	public boolean getNextDecision() {
		if (erster == false){
			this.myLast = true;
			System.out.println("Pavlov true");
			erster = true;
			return true;
		}else{
		
		if (opponentsLastDecision != myLast) {
			this.myLast = false;
			System.out.println("Pavlov false");
			return false;
		} else {
			this.myLast = true;
			System.out.println("Pavlov true");
			return true;
		}}
	}


	public void setOpponentsLastDecision(boolean decision) {
		this.opponentsLastDecision = decision;
		
		
	}

}


wie krieg ich das hin? hab da so meine Probleme mit weil ich mich mit meinen gedanken immer verranz irgendwie
 
public void spiele(int n){

for (int i = n; i>0; i--){
if (spieler1 == true && spieler2 == true) // klappt nicht aber wieso?


}
}
Dein Programm wiess nicht was spieler1 und spieler2 sein sollen. Da du auf true untersuchst sollten es vielleicht booleans sein, aber woher die kommen, keine Ahnung.
 
ok soweit war ich ja auch.... nur häng ich gerade genau da, dass ich nicht weiß wie ich dem klar mach, dass der auf die strategie zugreifen soll und sich dem entsprechend sein true oder false holt :bahnhof:
 
ok soweit war ich ja auch.... nur häng ich gerade genau da, dass ich nicht weiß wie ich dem klar mach, dass der auf die strategie zugreifen soll und sich dem entsprechend sein true oder false holt :bahnhof:

Die Methode spiele() kennt deine Spielstrategien (spieler1/spieler2) nicht.
Die musst du entweder in der Klasse speichern (zur Übersichtlichkeit ganz oben über jeder Methode), oder als Parameter übergeben.
 
und wie übergeb ich die? ... also das soll von der form so aufgebaut sein mit den Klassen... aber keine ahnung wie ich das jetzt übergebe
 
spieler1 und spieler2 sind in der Methode spiele() nicht bekannt. Ausserdem sollen die wohl vom Typ GefStrategie sein, dann kann das nie funktionieren
Code:
if (spieler1 == true && spieler2 == true)
da es sich ja um komplexe Objekte handelt und nich um booleans.

Eventuell sollte das ganze ja so aussehen:

Java:
package Hausaufgaben;
 
public class GefDilemma {
    
    int player1 = 0;
    int player2 = 0;
    GefStrategie spieler1, spieler2;

    public GefDilemma(GefStrategie spieler1, GefStrategie spieler2) {
        this.spieler1 = spieler1;
        this.spieler2 = spieler2;    
    }
    
 
    public void spiele(int n){
      
        for (int i = n; i>0; i--){
        if (spieler1.getNextDecision() && spieler2getNextDecision()) {            
            
        }   
    }
...
 
Java:
if (spieler1.getNextDecision() && spieler2.getNextDecision())

muss man bei boolean nicht == true noch dran schreiben? ... kann man das im Fall von true weglassen?
 
Java:
if (spieler1.getNextDecision() && spieler2.getNextDecision())

muss man bei boolean nicht == true noch dran schreiben? ... kann man das im Fall von true weglassen?
Die Methode liefert ja ein boolean, daher benötigt man das
Code:
== true
um auf false zu prüfen kann man den Ausdruck negieren
Code:
!spieler1.getNextDecision()
. In dem Fall wäre es sogar sinnvoll ==true zu schreiben, da aufgrund des Methodennames niemand erwartet, dass da ein boolean zurückgegeben wird. Daher aussagekräftige Methodennamen verwenden.
 
Ja, es wird ein boolischer Wert erwartet, [c]spieler1.getNextDecision()[/c] ist bereits boolisch. Würdest du false erwarten wollen, könntest du das mit [c]spieler1.getNextDecision() != true[/c], [c]spieler1.getNextDecision() == false[/c], oder viel einfacher mit [c]!spieler1.getNextDecision()[/c] machen.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben