其中包含2-tupel(字符串,布尔值)的对象的数组列表:程序不运行

时间:2014-04-29 16:09:47

标签: java arraylist

我想为我的推箱子游戏创建一个解算器(推特的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对象有问题,它们是第一个组件作为字符串而第二个组件作为布尔值的元组。有人可以帮忙吗?非常感谢你提前!

0 个答案:

没有答案