Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.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 Can';I don’我搞不懂我的越界感觉_Java - Fatal编程技术网

Java Can';I don’我搞不懂我的越界感觉

Java Can';I don’我搞不懂我的越界感觉,java,Java,这样做的目的是通过让骑士团在选择一个合法的招式之前找出哪些招式是合法的,从而对他们的巡演施加暴力。我是Java新手,但我觉得我的错误在于无法理解如何处理这个问题: import java.util.*; public class KnightTour { public static void main( String[] args ) { KnightTour kt = new KnightTour(8, 8); int tries = 3; int

这样做的目的是通过让骑士团在选择一个合法的招式之前找出哪些招式是合法的,从而对他们的巡演施加暴力。我是Java新手,但我觉得我的错误在于无法理解如何处理这个问题:

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("");
}
}

编辑:现在代码行号正常。

数组越界错误通常意味着您试图调用超出数组大小的数组中的存储位置。如果使用固定大小(例如8个数据点)声明数组,则只能从数组[0]到数组[7]设置和检索数组值

默认情况下,数组计数从0开始,而不是从1开始,这是导致大多数越界错误的原因,因为人们会尝试访问最后一个元素,参考上面的示例,他们认为最后一个元素是数组[8]


避免越界错误的最简单方法是使用nil大小声明数组,这将允许它扩展到所需的大小。但是,在代码失控的情况下,这会有内存泄漏的风险。

当您调用此行(类似的行之一)时,会出现此问题


yCurrent
我检查了您的代码,从中可以看出,
保存了[yCurrent][xCurrent]=Integer.toString(turnNr)
正在引发异常。改变
yCurrent
xCurrent
的逻辑不正确。 因此,即使您将saves数组限制增加到saves[100][100],其行为也是一样的

我建议您首先了解代码和流程,而不是直接处理异常。

错误位于
makeMoves()顶部附近的“循环确定哪些移动是合法的”

线路

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

if (yCurrent + yMoves[i] > 0 && yCurrent + yMoves[i] < rows)
if(yCurrent+yMoves[i]>0&&yCurrent+yMoves[i]
如果你能说出哪一行是166,那会很有用
saves[yCurrent][xCurrent] = Integer.toString(turnNr);
if (xCurrent + yMoves[i] > 0 && yCurrent + yMoves[i] < rows)
if (yCurrent + yMoves[i] > 0 && yCurrent + yMoves[i] < rows)