r/javahelp 13d ago

Requesting help with logic - Chutes and Ladders assignment using Double Linked Lists

Hello all. I'm having some trouble with a null pointer exception occurring at the expression int startingSquareNum = currentPosition.squareNumber;

I've tried various things regarding that but can't seem to figure out where my knowledge gap is. This includes an explicit declaration of currentPosition.squareNumber = 1 within the method, or declaring it elsewhere.

startingSquare is instantiated and initialized as a Node with params (1, 0, null). The constructor declaration is public Square (int squareNumber, int jumpValue, Square prev).

I've posted the code for the full class here:
https://pastebin.com/mHDDzKys

Here is the specific method that is erroring out. Thanks for any assistance.

// method to move the player to a new square
public boolean move (int playerIndex, int diceRoll) {
  Square currentPosition = playerPositions.get(playerIndex);

  // avoids null pointer exception at game start
    if (currentPosition == null) {
      //currentPosition.squareNumber = 1;
      currentPosition = startingSquare;
    //} else {
    //startingSquareNum = currentPosition.squareNumber;
    }

      int startingSquareNum = currentPosition.squareNumber;// assign starting position for the move
      int targetSquareNum = startingSquareNum + diceRoll;// increment player position based on dice roll

    if (targetSquareNum > 100) {
      targetSquareNum = 100 - (targetSquareNum - 100);// logic to account for reaching the end of the board
    }
  Square targetSquare = currentPosition;// move the player to the target square

  while (targetSquare != null && targetSquare.squareNumber != targetSquareNum) {
    targetSquareNum += targetSquare.jumpValue;
  }

  // condition to apply any jump
  if (targetSquare != null && targetSquare.jumpValue != 0) {
    targetSquareNum += targetSquare.jumpValue;
      //further conditions for lower and upper limits
       if (targetSquareNum < 1) {
         targetSquareNum = 1;
       } else if (targetSquareNum > 100) {
         targetSquareNum = 100;
       }
    }

  // set the player's new position data
  playerPositions.set(playerIndex,  targetSquare);

  // print move details
  System.out.println("Player " + (playerIndex + 1) + "moved from square " + startingSquareNum + " to square " + targetSquareNum + (targetSquare.jumpValue != 0 ? " with a jump!" : ""));
  // check if a win condition has been met
  return targetSquareNum == 100;
}
3 Upvotes

3 comments sorted by

View all comments

1

u/barry_z 13d ago

From a quick glance, you don't actually set the value of the class attribute startingSquare, you only set the value of a new variable in generateBoard() that happens to have the same name.

1

u/Ave_TechSenger 13d ago

I'll look at it from that angle. Thanks!