Java 构建跳棋游戏时出错

Java 构建跳棋游戏时出错,java,arrays,Java,Arrays,错误消息: Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1 at neegjar.Play.canJump(Play.java:113) at neegjar.Play.getLegalMoves(Play.java:278) at neegjar.Board.printLegalMoves(Board.java:198) at neegjar.main.main(main.java:17) Java

错误消息:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1
at neegjar.Play.canJump(Play.java:113)
at neegjar.Play.getLegalMoves(Play.java:278)
at neegjar.Board.printLegalMoves(Board.java:198)
at neegjar.main.main(main.java:17)
Java Result: 1
我正在尝试用java构建一个跳棋游戏(目前在控制台中)。我有6门课:

  • 线路板:显示并跟踪线路板。它是一个称为mySquare的二维方形对象数组

  • CheckerMove:包含来自x、fromY、toX、toY和boolean的变量。在游戏中,我创建了一个CheckerMove对象数组,以找出哪些移动是有效的

  • 棋子:一个棋盘格棋子。每个玩家都有一个由12件物品组成的数组可供使用。包含变量xCoord、yCoord、isKing、isAlive和team

  • 游戏:基本上是项目的骨干。处理什么是有效的移动,什么是“跳跃”,等等。它包括在下面

  • 正方形:正方形对象是棋盘上的一块瓷砖。它包含变量squareColor、hasapeece和hasaredpice(播放器一)

  • main(包含main方法)

当我尝试运行main方法来创建棋盘、放置棋子并打印合法移动时,一切都会正常工作,直到它尝试打印合法移动为止(它会显示上面的错误消息)

为什么要这样做?我不知道。我将非常感谢您的帮助,感谢您抽出时间阅读本文

这里是游戏:

package neegjar;
import java.util.ArrayList;


public class Play extends Board
{

public int currentPlayer;
public boolean gameOver;
public int turnNumber;



public Play()
{
    currentPlayer = 1;
    gameOver = false;
    turnNumber = 0;



}

public void takeTurn()
{
    System.out.println("It is player "+ this.currentPlayer + "'s         turn");         
//for Player 1
    have user select a piece
    System.out.println("Select a piece by typing and x coordinate,              followed by a y coordinate (seperated by commas");
    System.out.println("For an example input, type h");

}

//can the piece jump from x1,y1 TO x2,y2?
public boolean canJump(int player, int x1, int y1, int x2, int y2) 
{
    boolean CURRENT_KING = false;  //by default
    int CURRENT_PIECE = -1;

    if(player == 1)
    {
        if((x2 != x1+2) && (x2 != x1-2) && (y2 != y1+2) && (y2 != y1-2))   return false;


        for(int i=0; i<12; i++)
        {
            if((player1Pieces[i].getX() == x1)&&(player1Pieces[i].getY() == y1))
            {
                CURRENT_PIECE = i;
                break;  //get out of foor loop
            }                    
        }                
        if(player1Pieces[CURRENT_PIECE].isAKing() == true)
        {
            CURRENT_KING = true;    

        }

        //top left spot
        if((x2 == x1-2)&&(y2 == y1-2))
        {
            //first check to see if there is an enemy black piece on the adjacent square
            if((mySquare[y1-1][x1-1].getHasAPiece()==true)&&(mySquare[y1-1][x1-1].getHasARedPiece()==false))
                if((mySquare[y1-2][x1-2].getHasAPiece()==true)||(y1-2 < 0)||(x1-2 < 0)) //check for a blocker
                {    
                    return false;
                }
                else
                    return true;
        }

        //top right spot
        if((x2 == x1+2)&&(y2 == y1-2))
        {   
            //first check to see if there is an enemy black piece on the adjacent square
            if((mySquare[y1-1][x1+1].getHasAPiece()==true)&&(mySquare[y1-1][x1+1].getHasARedPiece()==false))
                if((mySquare[y1-2][x1+2].getHasAPiece()==true)||(y1-2 < 0)||(x1+2 > 7)) //check for a blocker
                {    
                    return false;
                }
                else
                    return true;
        }

        //Next 2 are for Kings only!
        if(CURRENT_KING = true)
        {
            //bottom left
            if((x2 == x1-2)&&(y2 == y1+2))    
            {
                if((mySquare[y1+1][x1-1].getHasAPiece()==true)&&(mySquare[y1+1][x1-1].getHasARedPiece()==false))
                    if((mySquare[y1+2][x1-2].getHasAPiece()==true)||(y1+2 > 7)||(x1-2 < 0)) //check for a blocker or out of bounds
                    {    
                        return false;
                    }
                    else
                        return true;    

            }

            //bottom right
            if((x2 == x1+2)&&(y2 == y1+2))
            {
                if((mySquare[y1+1][x1+1].getHasAPiece()==true)&&(mySquare[y1+1][x1+1].getHasARedPiece()==false))
                    if((mySquare[y1+2][x1+2].getHasAPiece()==true)||(y1+2 > 7)||(x1+2 >7)) //check for a blocker
                    {    
                        return false;
                    }
                    else
                        return true;     
            }


        }//end if King

    }//end p1


    if(player == 2)
    {
        if((x2 != x1+2) && (x2 != x1-2) && (y2 != y1+2) && (y2 != y1-2))   return false;

        for(int i=0; i<12; i++)
        {
            if((player2Pieces[i].getX() == x1)&&(player2Pieces[i].getY() == y1))
            {
                CURRENT_PIECE = i;
                break;  //get out of foor loop
            }                    
        }                
        if(player2Pieces[CURRENT_PIECE].isAKing() == true)
        {
            CURRENT_KING = true;    

        }

        //bottom left
        if((x2 == x1-2)&&(y2 == y1+2))    
        {
            if((mySquare[y1+1][x1-1].getHasAPiece()==true)&&(mySquare[y1+1][x1-1].getHasARedPiece()==false))
                if((mySquare[y1+2][x1-2].getHasAPiece()==true)||(y1+2 > 7)||(x1-2 < 0)) //check for a blocker or out of bounds
                {    
                    return false;
                }
                else
                    return true;    

        }

        //bottom right
        if((x2 == x1+2)&&(y2 == y1+2))
        {
            if((mySquare[y1+1][x1+1].getHasAPiece()==true)&&(mySquare[y1+1][x1+1].getHasARedPiece()==false))
                if((mySquare[y1+2][x1+2].getHasAPiece()==true)||(y1+2 > 7)||(x1+2 >7)) //check for a blocker
                {    
                    return false;
                }
                else
                    return true;     
        }

        //Next 2 are for Kings only!
        if(CURRENT_KING = true)
        {
            //top left spot
            if((x2 == x1-2)&&(y2 == y1-2))
            {
                //first check to see if there is an enemy black piece on the adjacent square
                if((mySquare[y1-1][x1-1].getHasAPiece()==true)&&(mySquare[y1-1][x1-1].getHasARedPiece()==false))
                    if((mySquare[y1-2][x1-2].getHasAPiece()==true)||(y1-2 < 0)||(x1-2 < 0)) //check for a blocker
                    {    
                        return false;
                    }
                    else
                        return true;
            }

            //top right spot
            if((x2 == x1+2)&&(y2 == y1-2))
            {   
                //first check to see if there is an enemy black piece on the adjacent square
                if((mySquare[y1-1][x1+1].getHasAPiece()==true)&&(mySquare[y1-1][x1+1].getHasARedPiece()==false))
                    if((mySquare[y1-2][x1+2].getHasAPiece()==true)||(y1-2 < 0)||(x1+2 > 7)) //check for a blocker
                    {    
                        return false;
                    }
                    else
                        return true;
            }     

            }//end if king
    } //end p2

    //default, or if nothing is found
    return false;


}  // end canJump()

/**
   * This is called by the getLegalMoves() method to determine whether
   * the player can legally move from (r1,c1) to (r2,c2).  It is
   * assumed that (r1,r2) contains one of the player's pieces and
   * that (r2,c2) is a neighboring square.
   */
public boolean canMove(int player, int x1, int y1, int x2, int y2) 
{

   if (y2 < 0 || y2 >= 8 || x2 < 0 || x2 >= 8)  //check to see if move is on the board
      return false;

   if (mySquare[y2][x2].getHasAPiece() == true)
      return false;  // (r2,c2) already contains a piece.

   if (player == 1) 
   {
      if (mySquare[y1][x1].getHasARedPiece() == true && y2 < y1)
         return false;  //red can only move up if not a king
      return true; 
   }
   else     //player == 2
   {
      if (mySquare[y1][x1].getHasAPiece() == true && mySquare[y1][x1].getHasARedPiece()==false && y2 > y1)
         return false;  // black can only move down if not a king
      return true;  
   }

}  // end canMove()

public CheckerMove[] getLegalMoves(int whichPlayer)
{
    int pX =0;
    int pY = 0;
    int CURRENT_PIECE = -1;    //used to signify desired piece
    boolean CURRENT_KING = false;   //default not a king
    ArrayList<CheckerMove> legalMoves = new ArrayList<CheckerMove>();  //ADJUSTABLE arraylist of legalMoves
    if((whichPlayer != 1)&&(whichPlayer != 2)) return null; //not a valid player


//player One /********************************************************/
    if(whichPlayer == 1)
    {
        //loop through array to find piece
        for(int i=0; i<12; i++)
        {
            if(player1Pieces[i].getIsAlive() == false) break;
            if(player1Pieces[i].isAKing() == true)
                CURRENT_KING = true;

            pX = player1Pieces[i].getX();
            pY = player1Pieces[i].getY();

            //check for Jumps 1st
                if (canJump(1, pX, pY, pX+2, pY+2))
                    legalMoves.add(new CheckerMove(pX, pY, pX+2, pY+2, true));
                if (canJump(1, pX, pY, pX-2, pY+2))
                    legalMoves.add(new CheckerMove(pX, pY, pX-2, pY+2, true));
                if (canJump(1, pX, pY, pX+2, pY-2))
                    legalMoves.add(new CheckerMove(pX, pY, pX+2, pY-2, true));
                if (canJump(1, pX, pY, pX-2, pY-2))
                    legalMoves.add(new CheckerMove(pX, pY, pX-2, pY-2, true));


        }//end for

        if (legalMoves.size() == 0) //if there are no jumps
        {
            //loop through pieces array to find valid moves for each piece
            for(int ctr = 0; ctr < 12; ctr++)
            {
                if(player1Pieces[ctr].isAlive == true)
                {
                    int currX = player1Pieces[ctr].getX();
                    int currY = player1Pieces[ctr].getY();
                    if(canMove(1,currX,currY,currX-1,currY-1))
                        legalMoves.add(new CheckerMove(currX,currY,currX-1,currY-1,false));
                    if(canMove(1,currX,currY,currX+1,currY-1))
                        legalMoves.add(new CheckerMove(currX,currY,currX+1,currY-1,false));
                    if(canMove(1,currX,currY,currX-1,currY+1))
                        legalMoves.add(new CheckerMove(currX,currY,currX-1,currY+1,false));
                    if(canMove(1,currX,currY,currX+1,currY+1))
                        legalMoves.add(new CheckerMove(currX,currY,currX+1,currY+1,false));

                }
            }

        }//if no legal moves exist


    }//end player One /**********************************************/
//player Two
    if(whichPlayer == 2)
    {
        //loop through array to find piece
        for(int i=0; i<12; i++)
        {

            if(player2Pieces[i].getIsAlive() == false) break;

            if(player2Pieces[i].isAKing() == true)
                CURRENT_KING = true;

            pX = player2Pieces[i].getX();
            pY = player2Pieces[i].getY();

            //check for Jumps 1st
                if (canJump(2, pX, pY, pX+2, pY+2))
                    legalMoves.add(new CheckerMove(pX, pY, pX+2, pY+2, true));
                if (canJump(2, pX, pY, pX-2, pY+2))
                   legalMoves.add(new CheckerMove(pX, pY, pX-2, pY+2, true));
                if (canJump(2, pX, pY, pX+2, pY-2))
                   legalMoves.add(new CheckerMove(pX, pY, pX+2, pY-2, true));
                if (canJump(2, pX, pY, pX-2, pY-2))
                   legalMoves.add(new CheckerMove(pX, pY, pX-2, pY-2, true));
        }//end for

        if (legalMoves.size() == 0) //if there are no jumps
        {
            //loop through pieces array to find valid moves for each piece
            for(int ctr = 0; ctr < 12; ctr++)
            {
                if(player2Pieces[ctr].isAlive == true)
                {
                    int currX = player2Pieces[ctr].getX();
                    int currY = player2Pieces[ctr].getY();
                    if(canMove(2,currX,currY,currX-1,currY-1))
                        legalMoves.add(new CheckerMove(currX,currY,currX-1,currY-1,false));
                    if(canMove(2,currX,currY,currX+1,currY-1))
                        legalMoves.add(new CheckerMove(currX,currY,currX+1,currY-1,false));
                    if(canMove(2,currX,currY,currX-1,currY+1))
                        legalMoves.add(new CheckerMove(currX,currY,currX-1,currY+1,false));
                    if(canMove(2,currX,currY,currX+1,currY+1))
                        legalMoves.add(new CheckerMove(currX,currY,currX+1,currY+1,false));

                }
            }

        }

    }//end p2

    if (legalMoves.size() == 0)
        return null;    //no legal moves found
    else    //there are legal moves, so copy array list to an array and return
    {
        CheckerMove[] validMoves = new CheckerMove[legalMoves.size()];
        for (int lastCtr = 0; lastCtr < legalMoves.size(); lastCtr++)
        {
            validMoves[lastCtr] = legalMoves.get(lastCtr);
        }
        return validMoves;
    }

}//end getLegalMoves




}//end class

}//这是一个非常基本的调试问题

你的方法canJump()有几个地方,它用一个减去1或2的数字对数组进行索引;在其中一个地方,结果是-1,数组(或任何java数组)中没有-1索引

错误消息会准确地告诉您在哪一行发生这种情况;我无法从你的来源判断,因为行号与你发布的行号不匹配。但是,它将准确地显示您的来源

学习查看java错误消息。它们是关于问题所在的优秀信息源(这不是语言运行时的通用信息)。它结合了虚拟机和强类型语言,使它能够比其他一些语言更准确地指出问题的根源


并学习使用调试器。你可以步到问题所在的代码,看看你的变量在执行过程中有什么价值。它对于您自己发现和解决问题是非常宝贵的。

我还没有阅读您的所有代码,但是您的数组从0变为7,您正在尝试访问-1。i、 e.从木板边缘脱落。您需要添加额外的签入,以确保在查找左上角和右上角时,工件不会跳出棋盘。通常,在StackOverflow上,向上投票您认为有用的任何答案(无论您是否提问),并将回答您问题的答案标记为“答案”。这增加了人们的声誉,这是所有人都希望通过阅读和帮助人们解决问题而获得的。当然,还有他们自己问题的答案。
package neegjar;




public class Board
{
public Square mySquare[][] = new Square[8][8];
public boolean gameover;

//initialize an Array of 12 Pieces (for the checkers) for EACH player 
public Piece player1Pieces[] = new Piece[12];; //declaration
public Piece player2Pieces[] = new Piece[12]; //declaration

public Board()
{
//CREATE THE BOARd  
//mySquare = new Square[8][8];
//initialize mySquare 
for(int i = 0; i < 8; i++) //not sure if I need this
{
    for(int j = 0; j < 8; j++)
    {
        mySquare[i][j] = new Square();
    }
} 
//initialize player1 and 2 Pieces arrays
initPieces(1);
initPieces(2);


//alternating colors  
/*
for (int row = 0; row < 8; row++)
{
  for (int col = 0; col < 8; col++)
  {

    if ((row == 0) || (row % 2 == 0) && ((col == 0) || (col % 2 == 0)))
    {
      mySquare[row][col].squareColor = "white";
    }
    else
    {
      // do nothing, the square will be black by default
    }
  }
}//end for loop
*/

//

}//end constructor 

public void placePieces()
{  
//set location of the pieces' initial location
//player 1    
player1Pieces[0].move(0,5); 
    mySquare[5][0].setHasAPiece(true);
    mySquare[5][0].setHasARedPiece(true);
player1Pieces[1].move(2,5);
    mySquare[5][2].setHasAPiece(true);
    mySquare[5][2].setHasARedPiece(true);
player1Pieces[2].move(4,5);
    mySquare[5][4].setHasAPiece(true);
    mySquare[5][4].setHasARedPiece(true);
player1Pieces[3].move(6,5);
    mySquare[5][6].setHasAPiece(true);
    mySquare[5][6].setHasARedPiece(true);

player1Pieces[4].move(1,6);
    mySquare[6][1].setHasAPiece(true);
    mySquare[6][1].setHasARedPiece(true);
player1Pieces[5].move(3,6);
    mySquare[6][3].setHasAPiece(true);
    mySquare[6][3].setHasARedPiece(true);
player1Pieces[6].move(5,6);
    mySquare[6][5].setHasAPiece(true);
    mySquare[6][5].setHasARedPiece(true);
player1Pieces[7].move(7,6);
    mySquare[6][7].setHasAPiece(true);
    mySquare[6][7].setHasARedPiece(true);

player1Pieces[8].move(0,7);
    mySquare[7][0].setHasAPiece(true);
    mySquare[7][0].setHasARedPiece(true);
player1Pieces[9].move(2,7);
    mySquare[7][2].setHasAPiece(true);
    mySquare[7][2].setHasARedPiece(true);
player1Pieces[10].move(4,7);
    mySquare[7][4].setHasAPiece(true);
    mySquare[7][4].setHasARedPiece(true);
player1Pieces[11].move(6,7);
    mySquare[7][6].setHasAPiece(true);
    mySquare[7][6].setHasARedPiece(true);
//player 2
player2Pieces[0].move(1,0);
    mySquare[0][1].setHasAPiece(true);
player2Pieces[1].move(3,0);
    mySquare[0][3].setHasAPiece(true);
player2Pieces[2].move(5,0);
    mySquare[0][5].setHasAPiece(true);
player2Pieces[3].move(7,0);
    mySquare[0][7].setHasAPiece(true);

player2Pieces[4].move(0,1);
    mySquare[1][0].setHasAPiece(true);
player2Pieces[5].move(2,1);
    mySquare[1][2].setHasAPiece(true);
player2Pieces[6].move(4,1);
    mySquare[1][4].setHasAPiece(true);
player2Pieces[7].move(6,1);
    mySquare[1][6].setHasAPiece(true);

player2Pieces[8].move(1,2);
    mySquare[2][1].setHasAPiece(true);
player2Pieces[9].move(3,2);
    mySquare[2][3].setHasAPiece(true);
player2Pieces[10].move(5,2);
    mySquare[2][5].setHasAPiece(true);
player2Pieces[11].move(7,2);
    mySquare[2][7].setHasAPiece(true);


}

public void alternateSquares()    //assign every other to white
{
    for(int row = 0; row < 8; row+=2)
    {
        for(int col = 0; col < 8; col+=2)
        {
            mySquare[row][col].setSquareColor("white");
        }          
    }    

    for(int row = 1; row < 8; row+=2)
    {
        for(int col = 1; col < 8; col+=2)
        {
            mySquare[row][col].setSquareColor("white");
        }          
    }       

}

public void initPieces(int whichPlayer)
{
  for(int p = 0; p <12; p++)
  {
      if(whichPlayer == 1)
          player1Pieces[p] = new Piece();
      else
          player2Pieces[p] = new Piece();
  }
}

public void printBoard()
{
System.out.print("     0     1     2     3     4     5     6     7    \n");
System.out.print("---------------------------------------------------\n");
for(int row=0; row<8; row++)
    {
        System.out.print(row);
        for(int col = 0; col < 8; col++)
        {
            System.out.print(" | ");
            if(mySquare[row][col].getHasAPiece() == false)
                System.out.print("   ");   
            else if(mySquare[row][col].getHasARedPiece()==true)
                System.out.print(" R ");
            else if(mySquare[row][col].getHasARedPiece()==false)
                System.out.print(" * ");

        }
        System.out.print(" |\n");
        System.out.print("---------------------------------------------------\n");
    }
}

public void printPieces()
{
for(int i=0; i<12; i++)
    {
        System.out.print(player1Pieces[i].getX() + ", ");
        System.out.print(player1Pieces[i].getY());
        System.out.println();

    }  

}

public void printLegalMoves()
{
  Play p1 = new Play();
  CheckerMove[] temp = p1.getLegalMoves(1);

  for(int i=0; i<temp.length; i++)
  {
      System.out.println("From: "+temp[i].fromX+", "+temp[i].fromY);
      System.out.println("To: "+temp[i].toX+", "+temp[i].toY);



  }
}


}//end class
public static void main(String[] args)
{
    Board newBoard = new Board();
    //newBoard.alternateSquares();
    //newBoard.alternateSquares();
        //System.out.println(newBoard.player1Pieces[0].getX());
    newBoard.placePieces();
    //newBoard.printBoard();
    newBoard.printLegalMoves();

    //newBoard.printPieces();



}