鼠标岛应用程序上的文本文件加载错误和数组错误

时间:2014-05-01 21:15:41

标签: java arrays multidimensional-array computer-science

我有一个问题,我不是在寻找我的问题的答案我想帮助找到为什么我的数组,即使在主要的下方开关中指定:case1,case2,case3。我使用了一个for循环,其数组在第5次迭代时停止。但是,当我运行程序时,它只运行一次,我是否正确指定使其运行5次或是否应该以另一种方式声明?提前致谢。我还应该包括eclipse此时没有报告错误,直到它被运行并且仅在第一次输入之后。 文本文件包含

##B##
#---#
#-M-#
#---#
##B##

##B##########
#-----------#
#-----------#
#-----------B
#-----------#
#------M----#
#-----------#
#-----------#
#-----------#
#-----------#
#-----------#
#-----------#
#############

##B#####
#------#
#-M----#
#------#
#------#
#------#
#------#
#####B##

岛屿地图可以在这里找到 [http://rapidshare.com/share/9704FE33EFF98F1C1E71F6F1DF2DC0D4]

这是数组(int i = 0; i< 5; i ++)但我认为这不是问题,我还可以提供文本文件

这是控制台输出

CS1181 Mouse Island

    1.  mouseIsland1.txt
    2.  mouseIsland2.txt
    3.  mouseIsland3.txt
    9.  Exit

Please make your selection: 2

Filename: mouseIsland2.txt
Bridge1:     0,0
Bridge2:     0,0
Mouse:       0,0

OUCH! The Mouse fell into the water and died at: 1|1
01
0100000000000
0000000000000
0000000000000
0000000000000
0000000000000
0000000000000
0000000000000
0000000000000
0000000000000
0000000000000
0000000000000
0000000000000
0000000000000

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1
    at MouseEscape.runMouseIsland(MouseEscape.java:349)
    at MouseEscape.main(MouseEscape.java:71)

结束控制台

import java.io.File;
import java.util.Scanner;

public class MouseEscape {
    public static Scanner input = new Scanner(System.in);
    public static MouseEscape island1;
    public static MouseEscape island2;
    public static MouseEscape island3;
    private String islandTxt;
    private boolean moveDebug;
    private int mouseEscaped;
    private int mouseDrowned;
    private int mouseStarved;
    private int islandRows;
    private int [] islandCols;
    private int runCount;
    private int [][] mousePosition;
    private int [][] bridgePosition;
    private int [][] islandIntArray;
    private char [][] islandCharArray;



    // main
    // Allows the user to select which mouse island map to simulate
    public static void main(String[] args) throws Exception  
    {

        System.out.println("CS1181 Mouse Island");

        int choice = 0, continueRun = 1;
        boolean runResponce = false, correctInput = false;
        while (continueRun == 1)
        {
            System.out.print("\n    1.  mouseIsland1.txt"
                    + "\n   2.  mouseIsland2.txt"
                    + "\n   3.  mouseIsland3.txt"
                    + "\n   9.  Exit\n\nPlease make your selection: ");
            continueRun = 9;
            runResponce = false;
            while (correctInput == false){
                while (!input.hasNextInt()) {
                    input.next();
                    System.out.print("Enter a number 1-3 or 9 to exit.\nPlease make your selection: ");
                }
                choice = input.nextInt();
                if (choice>=1 && choice <=3 || choice == 9){
                    correctInput = true;
                    break;
                }
            }
            switch(choice)
            {
            case 1:
                MouseEscape island1 = new MouseEscape("mouseIsland1.txt");
                System.out.println("\nFilename: "+island1.getIslandTxt()
                        +"\nBridge1:     "+island1.getBridgePosition(0,0)+","+island1.getBridgePosition(0,1)
                        +"\nBridge2:     "+island1.getBridgePosition(1,0)+","+island1.getBridgePosition(1,1)
                        +"\nMouse:       "+island1.getMousePosition(1,0)+","+island1.getMousePosition(1,1)+"\n");
                //island1.drawCharIsland();             
                for (int i=0;i<5;i++) island1.runMouseIsland();
                island1.printIslandStats();
                correctInput=false; continueRun=1;  break;
            case 2:
                MouseEscape island2 = new MouseEscape("mouseIsland2.txt");
                System.out.println("\nFilename: "+island2.getIslandTxt()
                        +"\nBridge1:     "+island2.getBridgePosition(0,0)+","+island2.getBridgePosition(0,1)
                        +"\nBridge2:     "+island2.getBridgePosition(1,0)+","+island2.getBridgePosition(1,1)
                        +"\nMouse:       "+island2.getMousePosition(1,0)+","+island2.getMousePosition(1,1)+"\n");
                //island1.drawCharIsland();             
                for (int i=0;i<5;i++) island2.runMouseIsland();
                island2.printIslandStats();
                correctInput=false; continueRun=1;  break;
            case 3:
                MouseEscape island3 = new MouseEscape("mouseIsland3.txt");
                System.out.println("\nFilename: "+island3.getIslandTxt()
                        +"\nBridge1:     "+island3.getBridgePosition(0,0)+","+island3.getBridgePosition(0,1)
                        +"\nBridge2:     "+island3.getBridgePosition(1,0)+","+island3.getBridgePosition(1,1)
                        +"\nMouse:       "+island3.getMousePosition(1,0)+","+island3.getMousePosition(1,1)+"\n");
                //island1.drawCharIsland();             
                for (int i=0;i<5;i++) island3.runMouseIsland();
                island3.printIslandStats();
                correctInput=false; continueRun=1;  break;
            }
            if (runResponce == false)
            {
                if (continueRun == 1)
                {
                        runResponce = true;
                        correctInput = false;                       
                    }
            }
        }
        input.close();  

    }

        // MouseIslandClass
        // Constructs a mouseIslandClass without specifying which mouseIsland to load
        public MouseEscape() {
            islandTxt = "";
            mouseEscaped = 0;
            mouseDrowned = 0;
            mouseStarved = 0;
            islandRows = 0;
            runCount = 0;
            mousePosition = null;
            bridgePosition = null;
            islandIntArray = null;
            islandCharArray = null;     
        }

        // MouseIslandClass
        // Constructs a mouseIslandClass given a mouseIsland map name
        public MouseEscape(String _islandTxt) throws Exception{
            islandTxt = _islandTxt;
            loadIsland();
        }

        // setIslandTxt
        // Sets the mouseIsland filename for the current mouseIsland
        public void setIslandTxt(String _islandTxt) throws Exception{
            islandTxt = _islandTxt;
        }

        // getIslandTxt
        // Gets the mouseIsland filename for the current mouseIsland
        public String getIslandTxt(){
            return islandTxt;
        }

        // getMouseEscaped
        // Returns the total number of times a mouse has escaped from the current mouseIsland
        public int getMouseEscaped(){
            return mouseEscaped;
        }

        // getMouseDrowned
        // Returns the total number of times a mouse has drowned on the current mouseIsland
        public int getMouseDrowned(){
            return mouseDrowned;
        }

        // getMouseStarved
        // Returns the total number of times a mouse has starved on the current mouseIsland
        public int getMouseStarved(){
            return mouseStarved;
        }

        // getBridgePosition
        // Returns the coordinate row(x) or column(y) to either of the bridges on the current mouseIsland
        public int getBridgePosition(int x, int y){
            return bridgePosition[x][y];
        }

        // getMousePosition
        // Returns the coordinate row(x) or column(y) of the mouse on the current mouseIsland
        public int getMousePosition(int x, int y){
            return mousePosition[x][y];
        }

        // loadIsland
        // Populates any information needed to run the simulation for the current mouseIsland
        public void loadIsland() throws Exception{
            if (islandTxt == "" || islandTxt == null){
                System.out.println("loadIsland() failed! 'islandTxt' variable is empty!");
                return;
            }
            findIslandRow();
            findIslandCol();
            setCharIslandArray();
            findIslandVariables();  
        }

        // printIslandStats
        // Prints to the console the statistics for this mouseIsland at its current state
        public void printIslandStats(){
            System.out.println("Run count: " + runCount + " times\n" 
                    + "Drowned: " + mouseDrowned + " times\n"
                    + "Starved: " + mouseStarved + " times\n"
                    + "Escaped: " + mouseEscaped + " times \n");
        }

        // maxValue
        // This function returns the max value of an integer array.
        public int maxValue(int [] inArray){ 
            int value = 0;
            for (int i=0;i<inArray.length;i++)
                if (value<inArray[i]) value = inArray[i];
            return value;
        }

        // findIslandRow
        // Counts the number of rows for the current mouseIsland
        public void findIslandRow() throws Exception {
            Scanner input = new Scanner(new File(islandTxt));
            islandRows = 0;
            while(input.hasNext()){ 
                input.nextLine();
                islandRows++;
            }
            //System.out.println("Rows: "+islandRows);
            input.close();
        }

        // findIslandCol
        // Counts and stores the number of columns for each row in the current mouseIsland
        public void findIslandCol() throws Exception {
            Scanner input = new Scanner(new File(islandTxt));
            String inputLine = ""; int row = 0; islandCols = new int [islandRows];
            while(input.hasNext()){
                inputLine = input.nextLine();
                islandCols[row] = inputLine.length();
                //System.out.println("Col"+row+": "+islandCols[row]);
                row++;
            }

            input.close();
        }

        // loads a mouse island map into a 2 dimensional character array
        public void setCharIslandArray() throws Exception {
            Scanner input = new Scanner(new File(islandTxt));
            islandCharArray = new char [islandRows+1][maxValue(islandCols)+1];  
            String islandRow ="";
            for(int row=0;row<islandRows;row++){
            islandRow = input.nextLine();
                for (int col=0;col<islandRow.length();col++) {
                    islandCharArray[row][col] = islandRow.charAt(col);
                }   
            }
            input.close();
        }


        // drawCharIsland
        // Draws a character array to the console for testing
        public void drawCharIsland() throws Exception{
            String ln = "";
            for (int row= 0;row<islandRows;row++){
                    for (int col= 0;col<islandCols[row];col++){
                        if (col == islandCols[row]-1) ln = "\n"; else ln  ="";
                        System.out.print(islandCharArray[row][col]+ln);

                }
            }
            System.out.println("");
        }

        // drawIntIsland
        // Draws an integer array to the console for testing
        public void drawIntIsland() throws Exception{
            String ln = "";
            for (int row= 0;row<islandRows;row++){
                    for (int col= 0;col<islandCols[row];col++){
                        if (col == islandCols[row]-1) ln = "\n"; else ln  ="";
                        System.out.print(islandIntArray[row][col]+ln);

                }
            }
            System.out.println("");
        }

        // drawBigIntIsland
        // Draws an integer array with special formatting for larger numbers the console for testing
        public void drawBigIntIsland() throws Exception{
            String ln = ""; String rowZero = ""; String colZero = "";
            int i=0;
            for (int row= 0;row<islandRows;row++){
                if (row <= 9) rowZero = " "; else rowZero  ="";
                    for (int col= 0;col<islandCols[row];col++){
                        if (row == 0) 
                            while (i<islandRows){
                            if (i == 0) System.out.print("XY");
                            if (i <= 9) colZero = " "; else colZero  ="";
                            if (i == islandCols[row]-1) ln = "\n"; else ln  ="";
                            System.out.print(colZero+i+ln);
                            i++;
                        }
                        if (col == islandCols[row]-1) ln = "\n"; else ln  ="";
                        if (islandIntArray[row][col] <= 9) colZero = "|"; else colZero  ="";
                        if (col == 0) System.out.print(rowZero+row);
                        if (row >=0 && col >=0) System.out.print(colZero+islandIntArray[row][col]+ln);

                }
            }
        }

        // findIslandVariables
        // finds and stores all of the mouseIsland object variables
        public void findIslandVariables() throws Exception{
            int bCount = 0;
            mousePosition = new int [2][2]; bridgePosition = new int [200][2];
            for (int row= 0;row<islandRows;row++){
                    for (int col= 0;col<islandCols[row];col++){
                        //System.out.println(row+"|"+col);
                        switch(islandCharArray[row][col]) {
                        case 'X' : mousePosition[0][0] = row; mousePosition[0][1] = col; //current position
                                    mousePosition[1][0] = row; mousePosition[1][1] = col; //start position
                                    //System.out.println("Mouse found on: "+row+"|"+col);
                            break;

                        case '-' :
                            if (row == 0 || col == 0 || row == islandRows-1 || col == islandCols[row]-1){
                                bridgePosition[bCount][0] = row; bridgePosition[bCount][1] = col;
                                bCount++;
                                //System.out.println("Bridge"+bCount+": "+row+"|"+col);
                            } else if (col>=islandCols[row-1]-1 || col>=islandCols[row+1]-1){
                                bridgePosition[bCount][0] = row; bridgePosition[bCount][1] = col;
                                //System.out.println("Bridge found: "+row+"|"+col);
                                bCount++;
                            }
                            break;

                        }   
                    }
            }
        }

        // moveMouse
        // Computes the movement for the mouse 
        // set moveDebug to 'true' to display the mouse's moves 
        public void moveMouse(){
            moveDebug = false;
            int mouseMove = (int)(Math.random() * 4);
            switch(mouseMove){
            case 0: mousePosition[0][0]--; if (moveDebug == true) System.out.print("Move: "+mouseMove+"[UP] "); break;
            case 1: mousePosition[0][0]++; if (moveDebug == true) System.out.print("Move: "+mouseMove+"[DOWN] "); break;
            case 2: mousePosition[0][1]--; if (moveDebug == true) System.out.print("Move: "+mouseMove+"[LEFT] "); break;
            case 3: mousePosition[0][1]++; if (moveDebug == true) System.out.print("Move: "+mouseMove+"[RIGHT] "); break;
            }
            if (moveDebug == true) System.out.println(" Location:|"+mousePosition[0][0]+"|"+mousePosition[0][1]+"|");
        }

        // runMouseIsland
        // Displays the outcome of one trial of the current mouseIsland
        public void runMouseIsland() throws Exception{
            islandIntArray = new int [islandRows][maxValue(islandCols)];
            mousePosition[0][0] = mousePosition [1][0]; mousePosition[0][1] = mousePosition [1][1];
            for (int count=0;count<100;count++){
                moveMouse();            

                 if (mousePosition[0][0] == bridgePosition[0][0] && mousePosition[0][1] == bridgePosition[0][1] || mousePosition[0][0] == bridgePosition[1][0] && mousePosition[0][1] == bridgePosition[1][1] ){
                         System.out.println("The mouse has escaped using the bridge at: "+mousePosition[0][0]+"|"+mousePosition[0][1]);
                         islandIntArray[mousePosition[0][0]][mousePosition[0][1]]++;
                         mouseEscaped++;
                         break;
                     } else
                 if (islandCharArray[mousePosition[0][0]][mousePosition[0][1]] == '#') {
                        System.out.println("OUCH! The Mouse fell into the water and died at: "+mousePosition[0][0]+"|"+mousePosition[0][1]);
                        islandIntArray[mousePosition[0][0]][mousePosition[0][1]]++;
                        mouseDrowned++;
                        break;
                 }
                 islandIntArray[mousePosition[0][0]][mousePosition[0][1]]++;
                if (count == 99){
                    System.out.println("The mouse withered away (died) at: "+mousePosition[0][0]+"|"+mousePosition[0][1]);
                    mouseStarved++;
                }
            }
            drawIntIsland();
            runCount++;
        }




    }   

0 个答案:

没有答案