# Create A Snake and Ladder Game in Java Assignment Solution.

## Instructions

Objective
Write a java assignment program to create a snake and ladder game.

## Requirements and Specifications

Create an application to simulate the game of snake and ladder.
Rules of the game
• The game is played on a board with numbered, gridded squares. In an example illustrated above, the board has 36 positions in total, and a few ladders and snakes that will be explained later.
• Two or more players will play the game. Each player starts from position 0
• Each player takes turns rolling a single die to move their token by the number of squares indicated by the die roll.
1. A random number from 1 to 6 is generated by a dice. If the dice is 5 and one player is at position 10, the player will move to position 15 (10 + 5)
• A player wins if it exactly reaches the end position (aka position 36 in the example above) and the game ends.
1. If a player is supposed to move outside the board, for example dice is 5 and the player is at position 34, the player will stay at current position 34 because 34 + 5 > 36.
• About Ladder: when a player ends up at a position of the start of one ladder, the player will move to the position of the end of the ladder. E.g. moving from position 3 to 16.
• About Snake: when a player ends up at a position of the head of one snake, the player will move to the position of the tail of the snake. E.g. moving from position 30 to 4.
• There could be another snake or ladder at the end position of the ladder or snake, and then the player will have to move up or down accordingly again.
• Constraints and Validations

The application should consider the following constraints:

• No snake head at the end position
• Snakes and ladders should not form an infinite loop
• Snake should have its tail at a smaller number than its head
• Ladder should have its end position at a larger number than its start position
• Logging

The application should be able to print the following messages, either to console or to file

• Print every movement of each player in the following format.
• Format: rolled a and moved from to

• When someone wins the game, print that the player won the game.

Format: wins the game

Source Code ```import logic.*; import java.util.Locale; import java.util.Scanner; public class Driver {  /**   * Plays a text-based game   */  public static void main(String[] args) {   try(Scanner scanner = new Scanner(System.in)) {    GameBuilder gameBuilder = new GameBuilder();    while (true) {     try {      gameBuilder = gameBuilder.boardSize(readIntChoice(scanner, "Please, enter board size: "));      break;     } catch (GameConfigurationException e) {      System.out.println(e.getMessage());     }    }    System.out.println();    while (true) {     try {      gameBuilder = gameBuilder.playersNum(readIntChoice(scanner, "Please, enter number of players: "));      break;     } catch (GameConfigurationException e) {      System.out.println(e.getMessage());     }    }    System.out.println();    while(readBoolChoice(scanner, "Do you want to add ladder? (y/n): ")) {     try {      int head = readIntChoice(scanner, "Please, enter ladder head: ");      int tail = readIntChoice(scanner, "Please, enter ladder tail: ");      gameBuilder = gameBuilder.ladder(new Ladder(head, tail));      System.out.println("Ladder added successfully");     }     catch (GameConfigurationException e) {      System.out.println(e.getMessage());     }     System.out.println();    }    while(readBoolChoice(scanner, "Do you want to add snake? (y/n): ")) {     try {      int head = readIntChoice(scanner, "Please, enter snake head: ");      int tail = readIntChoice(scanner, "Please, enter snake tail: ");      gameBuilder = gameBuilder.snake(new Snake(head, tail));      System.out.println("Snake added successfully");     }     catch (GameConfigurationException e) {      System.out.println(e.getMessage());     }     System.out.println();    }    System.out.println("Starting the game:");    Game game = gameBuilder.build();    while(!game.isOver()) {     System.out.print("Please, hit 'Enter' to roll the die: ");     scanner.nextLine();     game.makeMove();    }   }  }  private static int readIntChoice(Scanner scanner, String prompt) {   while(true) {    try {     System.out.print(prompt);     return Integer.parseInt(scanner.nextLine());    }    catch (NumberFormatException e) {     System.out.println("Invalid input");    }   }  }  private static boolean readBoolChoice(Scanner scanner, String prompt) {   while(true) {    System.out.print(prompt);    String input = scanner.nextLine().trim().toLowerCase();    if (input.equals("y")) {     return true;    }    if (input.equals("n")) {     return false;    }    System.out.println("Invalid input");   }  } } GAME package logic; import java.util.ArrayList; import java.util.Collection; import java.util.Random; public class Game {  private final int length;  private final Collection actions;  private final IDie die;  private final Player[] players;  private int playerToMove;  private Player winner;  /**   * Creates a square game board.   *   * @param length the width and height.   */  Game(int length, int playersNum, Collection actions, IDie die) {   this.length = length;   this.actions = new ArrayList<>(actions);   this.die = die;   this.players = new Player[playersNum];   for (int i = 0; i < playersNum; i++) {    players[i] = new Player(i + 1);   }   this.winner = null;   this.playerToMove = 0;  }  /**   * The size of the current game.   *   * @return this is both the width and the height.   */  public int getLength() {   return length;  }  public void makeMove() {   makeMove(playerToMove);   playerToMove = (playerToMove + 1) % players.length;  }  public void makeMove(int currPlayer) {   Player player = players[currPlayer];   int dieScore = die.rollDie();   int currPosition = player.getPosition();   int nextPosition = (currPosition + dieScore > length) ? currPosition : currPosition + dieScore;   while(true) {    int nextPositionTmp = nextPosition;    Action action = actions.stream().filter(a -> a.getHeadIndex() == nextPositionTmp).findAny().orElse(null);    if (action == null) {     break;    }    nextPosition = action.getTailIndex();   }   player.updatePosition(nextPosition);   logMove(player, dieScore, currPosition, nextPosition);   if (nextPosition == length) {    winner = player;    logWinner(player);   }  }  private void logMove(Player player, int die, int from, int to) {   System.out.printf("%s rolled a %d and moved from %d to %d%n", "Player " + player.getId(), die, from, to);  }  private void logWinner(Player player) {   System.out.printf("%s wins the game%n", "Player " + player.getId());  }  public boolean isOver() {   return winner != null;  } } LADDER package logic; public class Ladder extends Action {  public Ladder(int headIndex, int tailIndex) throws GameConfigurationException {   super(headIndex, tailIndex);   if (headIndex >= tailIndex) {    throw new GameConfigurationException("Ladder has tail at a smaller number, than its head");   }  }  @Override  public String toString() {   return "Ladder{head=" + getHeadIndex() + " tail=" + getTailIndex() + "}";  } }```