diff --git a/SnakeLadderGame.iml b/SnakeLadderGame.iml
new file mode 100644
index 00000000..ea8fe863
--- /dev/null
+++ b/SnakeLadderGame.iml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/out/production/SnakeLadderGame/input.txt b/out/production/SnakeLadderGame/input.txt
new file mode 100644
index 00000000..6dfd78bf
--- /dev/null
+++ b/out/production/SnakeLadderGame/input.txt
@@ -0,0 +1,22 @@
+9
+62 5
+33 6
+49 9
+88 16
+41 20
+56 53
+98 64
+93 73
+95 75
+8
+2 37
+27 46
+10 32
+51 68
+61 79
+65 84
+71 91
+81 100
+2
+Gaurav
+Sagar
\ No newline at end of file
diff --git a/src/Dto/GameDTO.java b/src/Dto/GameDTO.java
new file mode 100644
index 00000000..a705bf2b
--- /dev/null
+++ b/src/Dto/GameDTO.java
@@ -0,0 +1,33 @@
+package Dto;
+
+import lombok.Getter;
+import lombok.Setter;
+import models.Obstacles;
+import models.Player;
+
+import java.util.List;
+
+public class GameDTO {
+ List players;
+ List obstacles;
+
+ public GameDTO(List players, List obstacles) {
+ this.players = players;
+ this.obstacles = obstacles;
+ }
+
+ public List getObstacles() {
+ return obstacles;
+ }
+
+ public void setObstacles(List obstacles) {
+ this.obstacles = obstacles;
+ }
+
+ public List getPlayers() {
+ return players;
+ }
+ public void setPlayers(List players) {
+ this.players = players;
+ }
+}
diff --git a/src/InputReader/InputReaderFromFile.java b/src/InputReader/InputReaderFromFile.java
new file mode 100644
index 00000000..e515bf02
--- /dev/null
+++ b/src/InputReader/InputReaderFromFile.java
@@ -0,0 +1,54 @@
+package InputReader;
+
+import Dto.GameDTO;
+import models.Obstacles;
+import models.Player;
+
+import java.io.BufferedReader;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.StringTokenizer;
+
+public class InputReaderFromFile {
+ final String fileName;
+
+ public InputReaderFromFile(String fileName) {
+ this.fileName = fileName;
+ }
+
+ public GameDTO readGameInput() throws IOException {
+ final BufferedReader reader = new BufferedReader(new FileReader(fileName));
+ StringTokenizer st;
+
+ List players = new ArrayList<>();
+ List obstacles = new ArrayList<>();
+
+ int SnakeCount = Integer.parseInt(reader.readLine().trim());
+ for(int i = 0; i < SnakeCount; i++) {
+ st = new StringTokenizer(reader.readLine().trim());
+ int startPosition = Integer.parseInt(st.nextToken());
+ int endPosition = Integer.parseInt(st.nextToken());
+ obstacles.add(new Obstacles(startPosition, endPosition));
+ }
+
+ int LadderCount = Integer.parseInt(reader.readLine().trim());
+ for(int i = 0; i < LadderCount; i++) {
+ st = new StringTokenizer(reader.readLine().trim(), " ");
+ int startPosition = Integer.parseInt(st.nextToken());
+ int endPosition = Integer.parseInt(st.nextToken());
+ obstacles.add(new Obstacles(startPosition, endPosition));
+ }
+
+ int PlayerCount = Integer.parseInt(reader.readLine().trim());
+ for(int i = 0; i < PlayerCount; i++) {
+ String playerName = reader.readLine().trim();
+ players.add(new Player(playerName));
+ }
+ reader.close();
+
+ return new GameDTO(players, obstacles);
+ }
+
+}
diff --git a/src/OutputWriter/OutputWriter.java b/src/OutputWriter/OutputWriter.java
new file mode 100644
index 00000000..bab0d6a1
--- /dev/null
+++ b/src/OutputWriter/OutputWriter.java
@@ -0,0 +1,13 @@
+package OutputWriter;
+
+import models.Player;
+
+public class OutputWriter {
+ public void onTurnCompletion(Player player, int diceValue) {
+ System.out.println(player.getName() + " rolled a " + diceValue + " moved from " + player.getLastPosition() + " from " + player.getCurrentPosition());
+ }
+
+ public void onWin(Player player) {
+ System.out.println(player.getName() + " won the game");
+ }
+}
diff --git a/src/SnakeLadderGameApp.java b/src/SnakeLadderGameApp.java
new file mode 100644
index 00000000..6f0e69e6
--- /dev/null
+++ b/src/SnakeLadderGameApp.java
@@ -0,0 +1,25 @@
+import Dto.GameDTO;
+import InputReader.InputReaderFromFile;
+import OutputWriter.OutputWriter;
+import models.Dice;
+import models.Game;
+import models.Player;
+import services.DiceService;
+import services.GameService;
+import services.PlayerService;
+
+import java.io.IOException;
+
+public class SnakeLadderGameApp {
+ public static void main(String[] args) throws IOException {
+ final String inputFile = "src/input.txt";
+ final InputReaderFromFile inputReaderFromFile = new InputReaderFromFile(inputFile);
+ final OutputWriter outputWriter = new OutputWriter();
+ final DiceService diceService = new DiceService(new Dice(6));
+ final PlayerService playerService = new PlayerService(outputWriter, diceService);
+ final GameService gameService = new GameService(new Game(inputReaderFromFile.readGameInput()), playerService, outputWriter);
+
+ gameService.runGame();
+
+ }
+}
\ No newline at end of file
diff --git a/src/input.txt b/src/input.txt
new file mode 100644
index 00000000..6dfd78bf
--- /dev/null
+++ b/src/input.txt
@@ -0,0 +1,22 @@
+9
+62 5
+33 6
+49 9
+88 16
+41 20
+56 53
+98 64
+93 73
+95 75
+8
+2 37
+27 46
+10 32
+51 68
+61 79
+65 84
+71 91
+81 100
+2
+Gaurav
+Sagar
\ No newline at end of file
diff --git a/src/models/Board.java b/src/models/Board.java
new file mode 100644
index 00000000..2f4049ac
--- /dev/null
+++ b/src/models/Board.java
@@ -0,0 +1,30 @@
+package models;
+
+import java.util.List;
+
+public class Board {
+ final int maxPosition;
+ List obstacles;
+
+ public Board(List obstacles) {
+ this.maxPosition = 100;
+ this.obstacles = obstacles;
+ }
+
+ public Board(int maxPosition, List obstacles) {
+ this.maxPosition = maxPosition;
+ this.obstacles = obstacles;
+ }
+
+ public int getMaxPosition() {
+ return maxPosition;
+ }
+
+ public List getObstacles() {
+ return obstacles;
+ }
+
+ public void setObstacles(List obstacles) {
+ this.obstacles = obstacles;
+ }
+}
diff --git a/src/models/Dice.java b/src/models/Dice.java
new file mode 100644
index 00000000..007ff6aa
--- /dev/null
+++ b/src/models/Dice.java
@@ -0,0 +1,40 @@
+package models;
+
+import lombok.Getter;
+
+@Getter
+public class Dice {
+ int lowerLimit;
+ int upperLimit;
+
+ public Dice() {
+ this.lowerLimit = 1;
+ this.upperLimit = 6;
+ }
+
+ public Dice(int upperLimit) {
+ this.lowerLimit = 1;
+ this.upperLimit = upperLimit;
+ }
+
+ Dice(int lowerLimit, int upperLimit) {
+ this.lowerLimit = lowerLimit;
+ this.upperLimit = upperLimit;
+ }
+
+ public int getLowerLimit() {
+ return lowerLimit;
+ }
+
+ public void setLowerLimit(int lowerLimit) {
+ this.lowerLimit = lowerLimit;
+ }
+
+ public int getUpperLimit() {
+ return upperLimit;
+ }
+
+ public void setUpperLimit(int upperLimit) {
+ this.upperLimit = upperLimit;
+ }
+}
diff --git a/src/models/Game.java b/src/models/Game.java
new file mode 100644
index 00000000..8d2cf809
--- /dev/null
+++ b/src/models/Game.java
@@ -0,0 +1,30 @@
+package models;
+
+import Dto.GameDTO;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Getter
+@Setter
+public class Game {
+ Board board;
+ List players;
+
+ public Game(GameDTO gameDTO){
+ players = gameDTO.getPlayers();
+ board = new Board(gameDTO.getObstacles());
+ }
+
+ public List getPlayers() {
+ return players;
+ }
+
+ public void setPlayers(List players) {
+ this.players = players;
+ }
+
+
+}
diff --git a/src/models/Ladder.java b/src/models/Ladder.java
new file mode 100644
index 00000000..989c8a4d
--- /dev/null
+++ b/src/models/Ladder.java
@@ -0,0 +1,8 @@
+package models;
+
+public class Ladder extends Obstacles {
+ final String OBSTACLE_TYPE = "Ladder";
+ Ladder(int start, int end) {
+ super(start, end);
+ }
+}
diff --git a/src/models/Obstacles.java b/src/models/Obstacles.java
new file mode 100644
index 00000000..c9ff4ee7
--- /dev/null
+++ b/src/models/Obstacles.java
@@ -0,0 +1,22 @@
+package models;
+
+import lombok.Getter;
+
+@Getter
+public class Obstacles {
+ final int start;
+ final int end;
+
+ public Obstacles(int start, int end) {
+ this.start = start;
+ this.end = end;
+ }
+
+ public int getStart() {
+ return start;
+ }
+
+ public int getEnd() {
+ return end;
+ }
+}
diff --git a/src/models/Player.java b/src/models/Player.java
new file mode 100644
index 00000000..b678cd89
--- /dev/null
+++ b/src/models/Player.java
@@ -0,0 +1,35 @@
+package models;
+
+import lombok.Getter;
+import lombok.Setter;
+
+public class Player {
+ final String name;
+ int currentPosition;
+ int lastPosition;
+
+ public Player(final String name) {
+ this.name = name;
+ this.currentPosition = 0;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public int getCurrentPosition() {
+ return currentPosition;
+ }
+
+ public void setCurrentPosition(int currentPosition) {
+ this.currentPosition = currentPosition;
+ }
+
+ public int getLastPosition() {
+ return lastPosition;
+ }
+
+ public void setLastPosition(int lastPosition) {
+ this.lastPosition = lastPosition;
+ }
+}
diff --git a/src/models/Snake.java b/src/models/Snake.java
new file mode 100644
index 00000000..039be871
--- /dev/null
+++ b/src/models/Snake.java
@@ -0,0 +1,10 @@
+package models;
+
+public class Snake extends Obstacles {
+ final String OBSTACLE_TYPE = "Ladder";
+
+ Snake(int start, int end) {
+ super(start, end);
+ }
+
+}
diff --git a/src/services/DiceService.java b/src/services/DiceService.java
new file mode 100644
index 00000000..8cc6a5f3
--- /dev/null
+++ b/src/services/DiceService.java
@@ -0,0 +1,16 @@
+package services;
+
+import models.Dice;
+
+public class DiceService {
+ final Dice dice;
+
+ public DiceService(Dice dice) {
+ this.dice = dice;
+ }
+
+ public int rollDice() {
+ return (int)(Math.floor(Math.random() * dice.getUpperLimit())+ dice.getLowerLimit());
+ }
+
+}
diff --git a/src/services/GameService.java b/src/services/GameService.java
new file mode 100644
index 00000000..53dc969b
--- /dev/null
+++ b/src/services/GameService.java
@@ -0,0 +1,75 @@
+package services;
+
+import OutputWriter.OutputWriter;
+import models.Game;
+import models.Obstacles;
+import models.Player;
+
+import java.util.LinkedList;
+import java.util.Queue;
+
+public class GameService {
+ final Game game;
+ final PlayerService playerService;
+ final OutputWriter outputWriter;
+
+ public GameService(Game game, PlayerService playerService, OutputWriter outputWriter) {
+ this.game = game;
+ this.playerService = playerService;
+ this.outputWriter = outputWriter;
+ }
+
+ private int getNewPosition(Player player, int diceValue) {
+ int currentPosition = player.getCurrentPosition();
+ int newPosition = currentPosition + diceValue;
+
+ if(newPosition > 100){
+ newPosition = currentPosition;
+ } else {
+ newPosition = getPostionIfObstacle(newPosition);
+ }
+
+ return newPosition;
+ }
+
+ public int getPostionIfObstacle(int position) {
+ int newPosition = -1;
+ while(position!=newPosition && newPosition==-1){
+ for(Obstacles obstacle : game.getBoard().getObstacles()) {
+ if(obstacle.getStart() == position){
+ position = obstacle.getEnd();
+ break;
+ }
+ }
+ newPosition = position;
+
+ }
+ return newPosition;
+ }
+
+ public boolean checkWinner(Player player) {
+ if (player.getCurrentPosition() == game.getBoard().getMaxPosition()){
+ outputWriter.onWin(player);
+ return true;
+ }
+ return false;
+ }
+
+ public void runGame() {
+ Queue playersQueue = new LinkedList<>();
+ playersQueue.addAll(game.getPlayers());
+
+ while (!playersQueue.isEmpty()) {
+ Player player = playersQueue.poll();
+ int diceValue = playerService.rolldice(player);
+ int newPostion = getNewPosition(player, diceValue);
+ playerService.updatePosition(player, newPostion);
+ outputWriter.onTurnCompletion(player, diceValue);
+ if(!checkWinner(player)){
+ playersQueue.add(player);
+ } else {
+ break;
+ }
+ }
+ }
+}
diff --git a/src/services/PlayerService.java b/src/services/PlayerService.java
new file mode 100644
index 00000000..75d787f6
--- /dev/null
+++ b/src/services/PlayerService.java
@@ -0,0 +1,24 @@
+package services;
+
+import OutputWriter.OutputWriter;
+import models.Player;
+
+public class PlayerService {
+ final OutputWriter outputWriter;
+ final DiceService diceService;
+
+ public PlayerService(OutputWriter outputWriter, DiceService diceService) {
+ this.outputWriter = outputWriter;
+ this.diceService = diceService;
+ }
+
+ public int rolldice(Player player) {
+ return diceService.rollDice();
+ }
+
+ public void updatePosition(Player player, int newPosition) {
+ player.setLastPosition(player.getCurrentPosition());
+ player.setCurrentPosition(newPosition);
+ }
+
+}