2012-11-28 102 views
0

這樣做的目的是在選擇其中一個合法的選項之前弄清楚哪些動作是合法的,以暴力推動騎士之旅。我是新來的Java,但我覺得我的錯誤是我無法理解如何處理這個問題:找不到我的OutOfBoundsException

import java.util.*; 



public class KnightTour 
{ 
    public static void main(String[] args) 
    { 
    KnightTour kt = new KnightTour(8, 8); 
    int tries = 3; 
    int tryCount = 0; 

    while(tryCount < tries) 
    { 
     kt.makeMoves(); 
    } 
} 

int rows = 0; //change to args later 
int columns = 0; //change to args later 
int tries = 0; //change to args later 
String[][] saves; 

int tryCount = 0; 
int turnNr = 2; 
int wait = 0; 

Random rand = new Random(); 

int xCurrent = 1; 
int yCurrent = 1; 

int[] xMoves = { 1, 2, -1, -2, 1, 2, -1, -2 }; 
int[] yMoves = { 2, 1, 2, 1, -2, -1, -2, -1 }; 

public KnightTour(int x, int y) 
{ 
    rows = x; 
    columns = y; 
    saves = new String[y][x]; 

    for (int i = 0; i < y; i++) 
    { 
     for (int j = 0; j < x; j++) 
     { 
      saves[i][j] = Integer.toString(0); 
     } 
    } 
    saves[0][0] = Integer.toString(1); 
} 

private void makeMoves() 
{ 
    int k = 0; 

    while(k < (rows * columns)) 
    { 
     int[] d = { 0, 0, 0, 0, 0, 0, 0, 0 }; // holds move legality 
     int i = 0; 

     while(i < d.length) // loop determines which moves are legal 
     { 
      if(xCurrent + xMoves[ i ] > 0 && xCurrent + xMoves[ i ] < rows) 
      { 
       if(xCurrent + yMoves[ i ] > 0 && yCurrent + yMoves[ i ] < rows) 
        d[ i ] = 1; 
      } 
      i++; 
     } 

     int t = 0; 
     int w = 0; 

     while(t < d.length) // checks if no moves are legal 
     { 
      if(d[ t ] == 0) 
      { 
       w++; 
      } 
      t++; 
     } 

     if(w == 8) 
     { 
      writeFailures(); // fills the rest of the grid with "x"'s 
      k = (rows * columns); // breaks the loop 
     } 
     else 
     { 
      w = 0; 
      chooseMove(d); 
     } 
     k++; 
    } 
    printSolution(); 
} 

private void chooseMove(int[] d) // chooses a move that was previously determined to be legal randomly and checks if it is available 
{ 
    System.out.println("trace"); 
    Random rand = new Random(); 
    int r = rand.nextInt(8); 
    switch(r) 
    { 
    case 0: 
     if(d[ 0 ] == 1) 
     { 
      setX(xCurrent + xMoves[ 0 ]); 
      setY(yCurrent + yMoves[ 0 ]); 
      saves[yCurrent][xCurrent] = Integer.toString(turnNr); 
      turnNr++; 
     } 
     else 
     { 
      chooseMove(d); 
     } 
     break; 

    case 1: 
     if(d[ 1 ] == 1) 
     { 
      setX(xCurrent + xMoves[ 1 ]); 
      setY(yCurrent + yMoves[ 1 ]); 
      saves[yCurrent][xCurrent] = Integer.toString(turnNr); 
      turnNr++; 
     } 
     else 
     { 
      chooseMove(d); 
     } 
     break; 

    case 2: 
     if(d[ 2 ] == 1) 
     { 
      setX(xCurrent + xMoves[ 2 ]); 
      setY(yCurrent + yMoves[ 2 ]); 
      saves[yCurrent][xCurrent] = Integer.toString(turnNr); 
      turnNr++; 
     } 
     else 
     { 
      chooseMove(d); 
     } 
     break; 

    case 3: 
     if(d[ 3 ] == 1) 
     { 
      setX(xCurrent + xMoves[ 3 ]); 
      setY(yCurrent + yMoves[ 3 ]); 
      saves[yCurrent][xCurrent] = Integer.toString(turnNr); 
      turnNr++; 
     } 
     else 
     { 
      chooseMove(d); 
     } 
     break; 

    case 4: 
     if(d[ 4 ] == 1) 
     { 
      setX(xCurrent + xMoves[ 4 ]); 
      setY(yCurrent + yMoves[ 4 ]); 
      saves[yCurrent][xCurrent] = Integer.toString(turnNr); // LINE 166 
      turnNr++; 
     } 
     else 
     { 
      chooseMove(d); 
     } 
     break; 

    case 5: 
     if(d[ 5 ] == 1) 
     { 
      setX(xCurrent + xMoves[ 5 ]); 
      setY(yCurrent + yMoves[ 5 ]); 
      saves[yCurrent][xCurrent] = Integer.toString(turnNr); 
      turnNr++; 
     } 
     else 
     { 
      chooseMove(d); 
     } 
     break; 

    case 6: 
     if(d[ 6 ] == 1) 
     { 
      setX(xCurrent + xMoves[ 6 ]); 
      setY(yCurrent + yMoves[ 6 ]); 
      saves[yCurrent][xCurrent] = Integer.toString(turnNr); 
      turnNr++; 
     } 
     else 
     { 
      chooseMove(d); 
     } 
     break; 

    case 7: 
     if(d[ 7 ] == 1) 
     { 
      setX(xCurrent + xMoves[ 7]); 
      setY(yCurrent + yMoves[ 7 ]); 
      saves[yCurrent][xCurrent] = Integer.toString(turnNr); 
      turnNr++; 
     } 
     else 
     { 
      chooseMove(d); 
     } 
     break; 
    default: 
     System.out.println("error"); 
    } 
} 

public int getX() 
{ 
    return xCurrent; 
} 

public void setX(int x) 
{ 
    xCurrent = x; 
} 

public int getY() 
{ 
    return yCurrent; 
} 

public void setY(int y) 
{ 
    yCurrent = y; 
} 

private void writeFailures() // writes an "x" to empty spots in the save array when no legal moves are found 
{ 
    for (int i = 0; i < saves.length; i++) 
    { 
     for (int j = 0; j < saves[i].length; j++) 
     { 
      if(saves[i][j] == "0"); 
       saves[i][j] = "x"; 
     }    
    } 
} 

private void printSolution() 
{ 
    for (int i = 0; i < saves.length; i++) 
    { 
     for (int j = 0; j < saves[i].length; j++) 
     { 
      System.out.print(saves[i][j] + " "); 
     } 
     System.out.println(""); 
    } 
    System.out.println(""); 
} 
} 

我得到的錯誤是:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -2 
at KnightTour.chooseMove(KnightTour.java:166) 
at KnightTour.makeMoves(KnightTour.java:91) 
at KnightTour.main(KnightTour.java:14) 

編輯:現在代碼行號是好的。

+2

會,如果你是有益的可以說哪一行是166 –

回答

0

數組超出界限錯誤通常意味着您正在嘗試調用數組中超出數組大小的存儲位置。如果你聲明瞭一個固定大小的數組(例如8個數據點),你只能夠設置和檢索數組值[array] [array array [7])。

默認情況下,數組計數從0開始,而不是從1開始,這是大多數越界錯誤的原因,因爲人們會嘗試訪問他們假設的最後一個元素,參考上面的示例,陣列[8]。

避免出現越界錯誤的最簡單方法是聲明你的數組的大小,這將允許它擴大到所需的大小。但是,這會在代碼失控的情況下冒內存泄漏的風險。

0

問題來了,當你調用這條線(類似者之一)

setY(yCurrent + yMoves[ 4 ]); 

yCurrent < 0。當這種情況發生,yCurrent爲-2(因爲yMoves[4] = -2),並且你然後調用下面這行代碼:

saves[yCurrent][xCurrent] = Integer.toString(turnNr); 

由於yCurrent < 0,你要訪問一個不存在的數組索引;因此是例外。

現在,這個錯誤可能會出現很多次(並且在我的測試中)。出於同樣的原因,當yCurrent(或xCurrent)變成大於或等於數組大小的值時也會發生類似的效果。

0

我檢查了您的代碼,並且從中看來,saves[yCurrent][xCurrent] = Integer.toString(turnNr); 正在引發異常。正在改變yCurrentxCurrent的邏輯是不正確的。 因此,即使您將保存數組限制增加到保存[100] [100],其行爲也是如此。

我建議你先了解代碼和流程,而不是直接處理異常。

0

的錯誤是在「循環確定哪些舉動是合法的」附近的makeMoves()

線頂部

if (xCurrent + yMoves[i] > 0 && yCurrent + yMoves[i] < rows) 

應改爲

if (yCurrent + yMoves[i] > 0 && yCurrent + yMoves[i] < rows)