Hallo, ich habe folgendes Problem. Ich mach gerade ein Spiel nach dem Prinzip von Tic Tac Toe. Also 3 mal 3 Felder. Durchläuft der Code folgende Stellen:
[Java]
public HashMap<String, A_Situation> fuehre_Aus(HashMap<String, A_Situation> situationen, String agent) {
java.util.Set<String> keys= situationen.keySet();
for(String agent_Key : keys){
Situation sit = (Situation) situationen.get(agent_Key);
System.out.println("VErsu cht zu ändern bei einem Besitzer " + sit.besitzer + " mit " + horizontal + " vert " +vertikal + " bei " + (vertikal*3+horizontal));
if(agent.equals("a1"))
sit.veraendere("a1", (vertikal*3+horizontal));
else
sit.veraendere("a2", (vertikal*3+horizontal));
System.out.println("GERÄNDERT auf " + sit.toString());
}
return situationen;
}
[/code]
Jede Situation besteht aus einem Array
[Java]
class Situation extends A_Situation implements Serializable{
String besitzer;
Status_Feld[] feld = new Status_Feld[9];
public Situation() {
for(int i=0;i<9;i++)
feld = new Status_Feld();
}
public String getBesitzer() {
return besitzer;
}
public void setBesitzer(String besitzer) {
this.besitzer = besitzer;
}
public Situation(String besitzer) {
this.besitzer = besitzer;
for(int i=0;i<9;i++)
feld = new Status_Feld();
}
public void veraendere(String agent, int feld){
if(agent.equals("a1")){
this.feld[feld].isP1();
}
else{
this.feld[feld].p2();
}
}
@Override
public int defeniere_ID() {
int id= 0;
for(int i =0;i<9;i++){
if(this.feld.isGeaendert())
id+=i*4 + 1;
else if(feld.isP1())
id+=i*4 +2;
else
id+=i*4 + 3;
}
return id;
}
public String toString(){
String tmp = "\n";
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
if(!feld[i*2+j].isGeaendert())
tmp = tmp + " " + " 0";
else if(this.feld[i*2+j].isP1())
tmp = tmp + " " + " 1";
else if(this.feld[i*2+j].isP2())
tmp = tmp + " " + " 2";
}
tmp = tmp +"\n";
}
/* for(int i=0;i<9;i++){
if(!feld.isGeaendert())
tmp = tmp + " " + " 0";
else if(feld.isP1())
tmp = tmp + " " + " 1";
else if(feld.isP2())
tmp = tmp + " " + " 2";
}*/
return "Situation :"+ tmp;
}
}
[/Java]
Sprich das Array kann von jedem Spieler an 9 Stellen keinen Besitzer haben(dann die 0) von Spieler 1 sein(dann die 1) oder von Spieler 2(dann die 2). Also müsste nach jeweils einem Durchlauf von Spieler 1 und Spieler 2 eine 1 in beiden SItuationen sein und eine 2. (Dabei erwähnt jeder Spieler besitzt das Objekt Situation).
Das Ergebnis varriert allerdings abhängig davon was ausgewählt wurde. Mal werden 2 Stellen im Array auf 1 oder 2 gesetzt mal gar keine. Beispielweise soll die 8te Stelle auf 1 geändert werden. Klappt aber nicht er ändert nix. Ab der Stelle mit:
"sit.veraendere("a1", (vertikal*3+horizontal));"
nimmt das ganze komische Züge. Dann springt er mit dem Debugger in:
da ist laut Debugger alles OK. Die toString Methode von Array wird gut ausgegeben. Dann wieder zurück ist meist nix mehr. Dann hat er meist 2 Stellen verändert oder gar keine. Mal auch die richtige.
Hier nochmal die Klasse Status_Feld:
Hat irgendjemand ne Ahnung woran das liegt? Ich finde den Fehler einfach nicht. Danke und Gruß
[Java]
public HashMap<String, A_Situation> fuehre_Aus(HashMap<String, A_Situation> situationen, String agent) {
java.util.Set<String> keys= situationen.keySet();
for(String agent_Key : keys){
Situation sit = (Situation) situationen.get(agent_Key);
System.out.println("VErsu cht zu ändern bei einem Besitzer " + sit.besitzer + " mit " + horizontal + " vert " +vertikal + " bei " + (vertikal*3+horizontal));
if(agent.equals("a1"))
sit.veraendere("a1", (vertikal*3+horizontal));
else
sit.veraendere("a2", (vertikal*3+horizontal));
System.out.println("GERÄNDERT auf " + sit.toString());
}
return situationen;
}
[/code]
Jede Situation besteht aus einem Array
[Java]
class Situation extends A_Situation implements Serializable{
String besitzer;
Status_Feld[] feld = new Status_Feld[9];
public Situation() {
for(int i=0;i<9;i++)
feld = new Status_Feld();
}
public String getBesitzer() {
return besitzer;
}
public void setBesitzer(String besitzer) {
this.besitzer = besitzer;
}
public Situation(String besitzer) {
this.besitzer = besitzer;
for(int i=0;i<9;i++)
feld = new Status_Feld();
}
public void veraendere(String agent, int feld){
if(agent.equals("a1")){
this.feld[feld].isP1();
}
else{
this.feld[feld].p2();
}
}
@Override
public int defeniere_ID() {
int id= 0;
for(int i =0;i<9;i++){
if(this.feld.isGeaendert())
id+=i*4 + 1;
else if(feld.isP1())
id+=i*4 +2;
else
id+=i*4 + 3;
}
return id;
}
public String toString(){
String tmp = "\n";
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
if(!feld[i*2+j].isGeaendert())
tmp = tmp + " " + " 0";
else if(this.feld[i*2+j].isP1())
tmp = tmp + " " + " 1";
else if(this.feld[i*2+j].isP2())
tmp = tmp + " " + " 2";
}
tmp = tmp +"\n";
}
/* for(int i=0;i<9;i++){
if(!feld.isGeaendert())
tmp = tmp + " " + " 0";
else if(feld.isP1())
tmp = tmp + " " + " 1";
else if(feld.isP2())
tmp = tmp + " " + " 2";
}*/
return "Situation :"+ tmp;
}
}
[/Java]
Sprich das Array kann von jedem Spieler an 9 Stellen keinen Besitzer haben(dann die 0) von Spieler 1 sein(dann die 1) oder von Spieler 2(dann die 2). Also müsste nach jeweils einem Durchlauf von Spieler 1 und Spieler 2 eine 1 in beiden SItuationen sein und eine 2. (Dabei erwähnt jeder Spieler besitzt das Objekt Situation).
Das Ergebnis varriert allerdings abhängig davon was ausgewählt wurde. Mal werden 2 Stellen im Array auf 1 oder 2 gesetzt mal gar keine. Beispielweise soll die 8te Stelle auf 1 geändert werden. Klappt aber nicht er ändert nix. Ab der Stelle mit:
"sit.veraendere("a1", (vertikal*3+horizontal));"
nimmt das ganze komische Züge. Dann springt er mit dem Debugger in:
Java:
}
public void veraendere(String agent, int feld){
if(agent.equals("a1")){
this.feld[feld].p1();
}
else{
this.feld[feld].p2();
}
}
Hier nochmal die Klasse Status_Feld:
Java:
package TicTacToe;
import jade.util.leap.Serializable;
public class Status_Feld implements Serializable{
public boolean isP1() {
return p1;
}
public boolean isP2() {
return p2;
}
public static Status_Feld status_Feld_COP (Status_Feld tmp){
Status_Feld neu = new Status_Feld();
neu.setGeaendert(tmp.isGeaendert());
neu.setP1(tmp.isP1());
neu.setP2(tmp.isP2());
return neu;
}
public void setP1(boolean p1) {
this.geaendert = true;
this.p1 = p1;
}
public void setP2(boolean p2) {
this.geaendert = true;
this.p2 = p2;
}
boolean p1 = false;
boolean p2 = false;
boolean geaendert = false;
public boolean isGeaendert() {
return geaendert;
}
public void setGeaendert(boolean geaendert) {
this.geaendert = geaendert;
}
public boolean p1(){
if(!geaendert){
p1 = true;
geaendert = true;
return true;
}else
return false;
}
public boolean p2(){
if(!geaendert){
p2 = true;
geaendert = true;
return true;
}else
return false;
}
@Override
public String toString() {
if(!geaendert)
return "leer";
else if(p1)
return "p1";
else
return "p2";
}
}
Zuletzt bearbeitet: