我想为我的推箱子游戏创建一个解算器(推特的iPhone 4级别)。该程序无法运行。我不知道为什么。
首先:这是Lösungsfinder.java程序(请原谅我的德语评论)
//variables
//stones s1, ..., s6 with their starting points
//person p with its starting point
//person fiktivePerson with the same starting point as person
//methods
//TestLauf(int iterationen)
//main: Creates Testlauf-instance and starts the method TestLauf with the given number of iterations
//zufallsRichtung(): choses randomly a number out of {0,1,2,3}
//steinDa(int breite, int höhe): Is there a Stein?
//welcherSteinDa(int breite, int höhe): Welcher Stein ist da? (nur anwenden, wenn einer da steht)
//istFrei(int breite, int höhe): Feld und kein Stein drauf?
//Konstruktion mit Positionen Steine, Person, fiktivePerson
//main, die TestLauf-Objekt ausführt & TestLauf(iterationen): letzteres nutzt zufallsRichtung()
//steinDa(breite,höhe)
//welcherSteinDa(breite,höhe)
//istFrei(breite,höhe): kein Stein da?
import java.lang.Math;
import java.util.ArrayList;
public class Lösungsfinder {
//so, wie es wahrscheinlich anfängt, schon vorher eingefädelt
Stein s1 = new Stein(0,-2);
Stein s2 = new Stein(0,-1);
Stein s3 = new Stein(0,0);
Stein s4 = new Stein(-1,-1);
Stein s5 = new Stein(0,2);
Stein s6 = new Stein(1,2);
Person p = new Person(1,-2);
Person fiktivePerson = new Person (1,-2);
public static void main (String[] args){
Lösungsfinder lf = new Lösungsfinder();
lf.TestLauf(1000);
}
void TestLauf(int iterationen){
for (int i=0; i<iterationen; i++){
schrittGehen();
}
}
//einen Schritt machen: das davor ist einfach
//ArrayList<Object> alleMöglichkeiten = alleMöglichkeiten();
void schrittGehen(){ //hier soll ein Schritt gemacht werden
//hier wird die ArrayList<Object>-Variable alleMöglichkeiten deklariert und auf das Ergebnis von alleMöglichkeiten() gesetzt
ArrayList<Object> alleMöglichkeiten = alleMöglichkeiten();
//String letzteRichtung = "";
switch (alleMöglichkeiten.size()){
case 1: {
Object[] richtungUndVerschieben = (Object[]) alleMöglichkeiten.get(0); //einzige Möglichkeit gegeben; diese ist in richtungUndVerschieben
String richtung = (String) richtungUndVerschieben[0]; //richtung ist somit gegeben. Bewegung hängt davon ab, ob ein Stein mit verschoben werden muss
boolean mitVerschieben = (boolean) richtungUndVerschieben[1];
schrittGehenMitAngabe(richtung, mitVerschieben);
}
case 2: {
double x = Math.random();
int welchenAuswählen = -1;
if (x<0.5) welchenAuswählen = 0;
if (0.5 <= x) welchenAuswählen = 1;
Object[] richtungUndVerschieben = (Object[]) alleMöglichkeiten.get(welchenAuswählen);
String richtung = (String) richtungUndVerschieben[0];
boolean mitVerschieben = (boolean) richtungUndVerschieben[1];
schrittGehenMitAngabe(richtung, mitVerschieben);
}
case 3: {
double x = Math.random();
int welchenAuswählen = -1;
if (x<0.333) welchenAuswählen = 0;
if (0.333 <= x && x < 0.667) welchenAuswählen = 1;
else welchenAuswählen = 2;
Object[] richtungUndVerschieben = (Object[]) alleMöglichkeiten.get(welchenAuswählen);
String richtung = (String) richtungUndVerschieben[0];
boolean mitVerschieben = (boolean) richtungUndVerschieben[1];
schrittGehenMitAngabe(richtung, mitVerschieben);
}
case 4: {
double x = Math.random();
int welchenAuswählen = -1;
if (x<0.25) welchenAuswählen = 0;
if (0.25 <= x && x < 0.5) welchenAuswählen = 1;
if (0.5 <= x && x < 0.75) welchenAuswählen = 2;
if (0.75 <= x) welchenAuswählen = 3;
Object[] richtungUndVerschieben = (Object[]) alleMöglichkeiten.get(welchenAuswählen);
String richtung = (String) richtungUndVerschieben[0];
boolean mitVerschieben = (boolean) richtungUndVerschieben[1];
schrittGehenMitAngabe(richtung, mitVerschieben);
}//case 4
}//switch
} //schrittGehen
void schrittGehenMitAngabe(String richtung, boolean mitVerschieben){
switch(richtung){
case "rechts": {
p.breite++;
System.out.println("Person nach rechts.");
if (mitVerschieben){
Stein zuBewegenderStein = welcherSteinDa(p.breite,p.höhe);
zuBewegenderStein.nachRechtsVerschieben();
System.out.println("Stein nach rechts.");
}
} //case rechts
case "oben":{
p.höhe++;
System.out.println("Person nach oben.");
if (mitVerschieben){
Stein zuBewegenderStein = welcherSteinDa(p.breite,p.höhe);
zuBewegenderStein.nachObenVerschieben();
System.out.println("Stein nach oben.");
}
}//case oben
case "links":{
p.breite--;
System.out.println("Person nach links.");
if (mitVerschieben){
Stein zuBewegenderStein = welcherSteinDa(p.breite,p.höhe);
zuBewegenderStein.nachLinksVerschieben();
System.out.println("Stein nach links.");
}
}//case links
case "unten":{
p.höhe--;
System.out.println("Person nach unten.");
if (mitVerschieben){
Stein zuBewegenderStein = welcherSteinDa(p.breite,p.höhe);
zuBewegenderStein.nachUntenVerschieben();
System.out.println("Stein nach unten.");
}
}//case unten
}//switch richtung
}//schrittGehenMitAngabe()
//lieftert ein ArrayList<Object>-Objekt mit allen Möglichkeiten als (Richtung, mitVerschieben)
ArrayList<Object> alleMöglichkeiten(){
ArrayList<Object> möglicheRichtungen = new ArrayList<Object>(); //möglicheRichtungen enthält am Ende eine Liste mit Tupeln (Richtung, mitVerschieben?)
//nach rechts möglich?
fiktivePerson.breite = p.breite+1;
fiktivePerson.höhe = p.höhe;
if (Spielbrett.imFeld(fiktivePerson.breite, fiktivePerson.höhe)){
if(!steinDa(fiktivePerson.breite, fiktivePerson.höhe)){
Object[] richtungMitVerschieben = new Object[2];
richtungMitVerschieben[0] = "rechts";
richtungMitVerschieben[1] = false;
möglicheRichtungen.add(richtungMitVerschieben); //kein Stein da, also Schrittmöglichkeit
}
else{
Object[] richtungMitVerschieben = new Object[2];
richtungMitVerschieben[0] = "rechts";
richtungMitVerschieben[1] = true;
möglicheRichtungen.add(richtungMitVerschieben); //Stein da, aber rechts davon frei
} //else-Anweisung von "kein Stein da"
}//if imFeld
//nach oben möglich?
fiktivePerson.breite = p.breite;
fiktivePerson.höhe = p.höhe+1;
if (Spielbrett.imFeld(fiktivePerson.breite, fiktivePerson.höhe)){
if(!steinDa(fiktivePerson.breite, fiktivePerson.höhe)){
Object[] richtungMitVerschieben = new Object[2];
richtungMitVerschieben[0] = "oben";
richtungMitVerschieben[1] = false;
möglicheRichtungen.add(richtungMitVerschieben); //kein Stein da, also Schrittmöglichkeit
}
else{
Object[] richtungMitVerschieben = new Object[2];
richtungMitVerschieben[0] = "oben";
richtungMitVerschieben[1] = true;
möglicheRichtungen.add(richtungMitVerschieben); //Stein da, aber rechts davon frei
} //else-Anweisung von "kein Stein da"
}//if imFeld
//lach links möglich?
fiktivePerson.breite = p.breite-1;
fiktivePerson.höhe = p.höhe;
if (Spielbrett.imFeld(fiktivePerson.breite, fiktivePerson.höhe)){
if(!steinDa(fiktivePerson.breite, fiktivePerson.höhe)){
Object[] richtungMitVerschieben = new Object[2];
richtungMitVerschieben[0] = "links";
richtungMitVerschieben[1] = false;
möglicheRichtungen.add(richtungMitVerschieben); //kein Stein da, also Schrittmöglichkeit
}
else{
Object[] richtungMitVerschieben = new Object[2];
richtungMitVerschieben[0] = "links";
richtungMitVerschieben[1] = true;
möglicheRichtungen.add(richtungMitVerschieben); //Stein da, aber rechts davon frei
} //else-Anweisung von "kein Stein da"
}//if imFeld
//nach unten möglich?
fiktivePerson.höhe = p.höhe-1;
fiktivePerson.breite = p.breite;
if (Spielbrett.imFeld(fiktivePerson.breite, fiktivePerson.höhe)){
if(!steinDa(fiktivePerson.breite, fiktivePerson.höhe)){
Object[] richtungMitVerschieben = new Object[2];
richtungMitVerschieben[0] = "unten";
richtungMitVerschieben[1] = false;
möglicheRichtungen.add(richtungMitVerschieben); //kein Stein da, also Schrittmöglichkeit
}
else{
Object[] richtungMitVerschieben = new Object[2];
richtungMitVerschieben[0] = "unten";
richtungMitVerschieben[1] = true;
möglicheRichtungen.add(richtungMitVerschieben); //Stein da, aber rechts davon frei
} //else-Anweisung von "kein Stein da"
}//if imFeld
return möglicheRichtungen;
//jetzt sind bei möglicheRichtungen alle möglichen Richtungen zu finden
//return null;
}
//testet nicht, ob das überhaupt ein Feld ist
boolean steinDa(int breite, int höhe){
if (s1.breite == breite && s1.höhe == höhe) return true;
if (s2.breite == breite && s2.höhe == höhe) return true;
if (s3.breite == breite && s3.höhe == höhe) return true;
if (s4.breite == breite && s4.höhe == höhe) return true;
if (s5.breite == breite && s5.höhe == höhe) return true;
if (s6.breite == breite && s6.höhe == höhe) return true;
return false;
}
//möglichst nur aufrufen, wenn schon klar ist, dass ein Stein da ist. Sonst gibt er in falschen Situationen s6 zurück
Stein welcherSteinDa(int breite, int höhe){
if (s1.breite == breite && s1.höhe == höhe) return s1;
if (s2.breite == breite && s2.höhe == höhe) return s2;
if (s3.breite == breite && s3.höhe == höhe) return s3;
if (s4.breite == breite && s4.höhe == höhe) return s4;
if (s5.breite == breite && s5.höhe == höhe) return s5;
else return s6;
}
//definieren, ob ein bestimmtes Feld frei ist (d.h. auf dem Spielbrett und nicht durch einen Stein blockiert; durch die Person muss nicht getestet werden)
boolean istFrei (int breite, int höhe){ //darf da ein Stein hingeschoben werden?
if (Spielbrett.imFeld(breite, höhe)){
if (!steinDa(breite, höhe)){
if (!(ecke(breite, höhe))) return true;
}
}
return false;
}
boolean ecke (int breite, int höhe){//ist in einer Ecke drin
if ((breite == 0 || breite == 1) && höhe == -3) return true; //unten
if (breite == 2 && (höhe == -2 || höhe == -1)) return true; //rechts
if (höhe == 3 && (breite == -1 || breite == 1)) return true; //oben
if (breite == -2) return true; //links
return false;
}//ecke
}//Lösungsfinder
作为项目的其他文件,我有文件Stein.java:
public class Stein {
int breite;
int höhe;
public Stein(int breite, int höhe){
this.breite = breite;
this.höhe = höhe;
}
void setBreite(int breite){
this.breite = breite;
}
int getBreite(){
return this.breite;
}
void setHöhe(int höhe){
this.höhe = höhe;
}
int getHöhe (int höhe){
return this.höhe;
}
//testet nicht, ob rechts Platz ist
void nachRechtsVerschieben(){
this.breite++;
}
void nachObenVerschieben(){
this.höhe++;
}
void nachLinksVerschieben(){
this.breite--;
}
void nachUntenVerschieben(){
this.höhe--;
}
}
和文件Person.java:
public class Person {
int breite;
int höhe;
void setBreite(int breite){
this.breite = breite;
}
int getBreite(){
return this.breite;
}
void setHöhe(int höhe){
this.höhe = höhe;
}
int getHöhe(){
return höhe;
}
Person(int breite, int höhe){
this.breite = breite;
this.höhe = höhe;
}
Person(){
this.breite = 0;
this.höhe = 3;
}
}
以下是我得到的错误:
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 2, Size: 2
at java.util.ArrayList.rangeCheck(Unknown Source)
at java.util.ArrayList.get(Unknown Source)
at Lösungsfinder.schrittGehen(Lösungsfinder.java:93)
at Lösungsfinder.TestLauf(Lösungsfinder.java:47)
at Lösungsfinder.main(Lösungsfinder.java:42)
我不知道代码有什么问题。我认为我的ArrayList对象有问题,它们是第一个组件作为字符串而第二个组件作为布尔值的元组。有人可以帮忙吗?非常感谢你提前!