Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 包含2元组(字符串、布尔值)的对象数组列表:程序未运行_Java_Arraylist - Fatal编程技术网

Java 包含2元组(字符串、布尔值)的对象数组列表:程序未运行

Java 包含2元组(字符串、布尔值)的对象数组列表:程序未运行,java,arraylist,Java,Arraylist,我想为我的Sokoban游戏iPhone版的Sokoban 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

我想为我的Sokoban游戏iPhone版的Sokoban 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
以及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对象有问题,它是元组,第一个组件是字符串,第二个组件是布尔值。有人能帮忙吗?提前非常感谢

您能显示错误发生在93、47、42行吗?看起来您正在访问的索引不在ArrayList中。如果您使用的是特定的ArrayList类型,而不仅仅是对象的ArrayList,那么调试可能会更容易。我最近也从iOS转换过来了——这是不同的,但它是Java方式。换句话说,创建一个TupleWhatever类,然后传递ArrayList。这比使用备用数组索引更不脆弱。您还可以添加其他级别:ArrayList,其中Foo是一个包含TupleWhatevers实例的类。它被称为Java泛型。这会有帮助的@MarshallTigerus:93行:Object[]richtungUndVerschieben=Object[]alleMöglichkeiten.getwelchenAuswählen;第47行:schrittGehen;第42行:lf.TestLauf1000@MikeBonhoff你能在那句话之前在数组列表上执行一个.size,看看它有多大吗?@MarshallTigerus:我测试了via.size,里面有多少个数字alleMöglichkeiten:它应该是四个。
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)