From 3cc92d13776127175e5b254bb8d0d391358bacf5 Mon Sep 17 00:00:00 2001 From: Vaishali Date: Mon, 23 Dec 2024 23:08:49 +0530 Subject: [PATCH] Snakes and Ladders LLD --- snakes/and/ladders/Board.java | 44 ++++++++++++++++++++++++++++++ snakes/and/ladders/Cell.java | 14 ++++++++++ snakes/and/ladders/Game.java | 49 ++++++++++++++++++++++++++++++++++ snakes/and/ladders/Ladder.java | 15 +++++++++++ snakes/and/ladders/Main.java | 38 ++++++++++++++++++++++++++ snakes/and/ladders/Player.java | 33 +++++++++++++++++++++++ snakes/and/ladders/Snake.java | 16 +++++++++++ 7 files changed, 209 insertions(+) create mode 100644 snakes/and/ladders/Board.java create mode 100644 snakes/and/ladders/Cell.java create mode 100644 snakes/and/ladders/Game.java create mode 100644 snakes/and/ladders/Ladder.java create mode 100644 snakes/and/ladders/Main.java create mode 100644 snakes/and/ladders/Player.java create mode 100644 snakes/and/ladders/Snake.java diff --git a/snakes/and/ladders/Board.java b/snakes/and/ladders/Board.java new file mode 100644 index 00000000..a0479c9f --- /dev/null +++ b/snakes/and/ladders/Board.java @@ -0,0 +1,44 @@ +package practice.snakes.and.ladders; + + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import lombok.Data; + +@Data +public class Board { + + private Map cells; + private List snakes; + private List ladders; + public static final int BOARD_SIZE = 100; + + public Board() { + this.cells = new HashMap<>(); + this.snakes = new ArrayList<>(); + this.ladders = new ArrayList<>(); + this.buildBoard(); + } + + public void addSnake(int head, int tail) { + this.snakes.add(new Snake(head, tail)); + } + + public void addLadder(int start, int end) { + this.ladders.add(new Ladder(start, end)); + } + + private void buildBoard() { + for (int i=1; i<=BOARD_SIZE; i++) { + this.cells.put(i, new Cell()); + } + } + + public void addSnakesAndLadders() { + snakes.forEach(snake -> cells.get(snake.getHead()).setSnake(snake)); + ladders.forEach(ladder -> cells.get(ladder.getStart()).setLadder(ladder)); + } +} diff --git a/snakes/and/ladders/Cell.java b/snakes/and/ladders/Cell.java new file mode 100644 index 00000000..dd94a8ed --- /dev/null +++ b/snakes/and/ladders/Cell.java @@ -0,0 +1,14 @@ +package practice.snakes.and.ladders; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class Cell { + + private Snake snake; + private Ladder ladder; +} diff --git a/snakes/and/ladders/Game.java b/snakes/and/ladders/Game.java new file mode 100644 index 00000000..77922f0c --- /dev/null +++ b/snakes/and/ladders/Game.java @@ -0,0 +1,49 @@ +package practice.snakes.and.ladders; + +import java.util.ArrayList; +import java.util.List; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class Game { + + List players; + Board board; + boolean gameCompleted; + + public Game() { + players = new ArrayList<>(); + board = new Board(); + gameCompleted = false; + } + + public void addPlayer(String name) { + players.add(new Player(name, 0)); + } + + public void startGame() { + + board.addSnakesAndLadders(); + + while (!gameCompleted) { + + for (Player player: players) { + int diceRoll = (int)(Math.random() * 6) + 1; + int initialPosition = player.getPosition(); + player.moveToPosition(board, diceRoll); + System.out.println(player.getName() +" rolled a "+diceRoll+" and moved from "+initialPosition+" to "+player.getPosition()); + + if (player.getPosition() == Board.BOARD_SIZE) { + System.out.println(player.getName()+" wins the game"); + gameCompleted = true; + break; + } + } + + } + } + +} diff --git a/snakes/and/ladders/Ladder.java b/snakes/and/ladders/Ladder.java new file mode 100644 index 00000000..0b8b54da --- /dev/null +++ b/snakes/and/ladders/Ladder.java @@ -0,0 +1,15 @@ +package practice.snakes.and.ladders; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class Ladder { + + int start, end; + + public int newPositionAfterLadderJump() { + return end; + } +} diff --git a/snakes/and/ladders/Main.java b/snakes/and/ladders/Main.java new file mode 100644 index 00000000..2497b939 --- /dev/null +++ b/snakes/and/ladders/Main.java @@ -0,0 +1,38 @@ +package practice.snakes.and.ladders; + +import java.util.Scanner; + +public class Main { + + public static void main(String[] args) { + + Game game = new Game(); + + Scanner scanner = new Scanner(System.in); + int noOfSnakes = scanner.nextInt(); + + for (int i=1; i<=noOfSnakes; i++) { + int head = scanner.nextInt(); + int tail = scanner.nextInt(); + game.getBoard().addSnake(head, tail); + } + + int noOfLadders = scanner.nextInt(); + for (int i=1; i<=noOfLadders; i++) { + int start = scanner.nextInt(); + int end = scanner.nextInt(); + game.getBoard().addLadder(start, end); + } + + + int noOfPlayers = scanner.nextInt(); + for (int i=1; i<=noOfPlayers; i++) { + String name = scanner.next(); + game.addPlayer(name); + } + + game.startGame(); + scanner.close(); + } + +} diff --git a/snakes/and/ladders/Player.java b/snakes/and/ladders/Player.java new file mode 100644 index 00000000..356f70c6 --- /dev/null +++ b/snakes/and/ladders/Player.java @@ -0,0 +1,33 @@ +package practice.snakes.and.ladders; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class Player { + + String name; + int position; + + public boolean moveToPosition(Board board, int diceRoll) { + + int newPosition = position + diceRoll; + + if (newPosition > Board.BOARD_SIZE) return false; + + + Cell newCell = board.getCells().get(newPosition); + + while (newCell.getSnake() != null || newCell.getLadder() != null) { + newPosition = newCell.getSnake() != null ? newCell.getSnake().newPositionAfterSnakeBite(): newCell.getLadder().newPositionAfterLadderJump(); + newCell = board.getCells().get(newPosition); + } + + this.position = newPosition; + return true; + + } + + +} diff --git a/snakes/and/ladders/Snake.java b/snakes/and/ladders/Snake.java new file mode 100644 index 00000000..50814986 --- /dev/null +++ b/snakes/and/ladders/Snake.java @@ -0,0 +1,16 @@ +package practice.snakes.and.ladders; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class Snake { + + private int head, tail; + + public int newPositionAfterSnakeBite() { + return tail; + } + +}