From 2c4f5267ec4add5757758879308fc98f406f20ff Mon Sep 17 00:00:00 2001 From: Architjain128 Date: Mon, 17 Feb 2025 02:54:30 +0530 Subject: [PATCH] solved --- SnakeLadderGame.iml | 20 +++++++ out/production/SnakeLadderGame/input.txt | 22 +++++++ src/Dto/GameDTO.java | 33 +++++++++++ src/InputReader/InputReaderFromFile.java | 54 +++++++++++++++++ src/OutputWriter/OutputWriter.java | 13 ++++ src/SnakeLadderGameApp.java | 25 ++++++++ src/input.txt | 22 +++++++ src/models/Board.java | 30 ++++++++++ src/models/Dice.java | 40 +++++++++++++ src/models/Game.java | 30 ++++++++++ src/models/Ladder.java | 8 +++ src/models/Obstacles.java | 22 +++++++ src/models/Player.java | 35 +++++++++++ src/models/Snake.java | 10 ++++ src/services/DiceService.java | 16 +++++ src/services/GameService.java | 75 ++++++++++++++++++++++++ src/services/PlayerService.java | 24 ++++++++ 17 files changed, 479 insertions(+) create mode 100644 SnakeLadderGame.iml create mode 100644 out/production/SnakeLadderGame/input.txt create mode 100644 src/Dto/GameDTO.java create mode 100644 src/InputReader/InputReaderFromFile.java create mode 100644 src/OutputWriter/OutputWriter.java create mode 100644 src/SnakeLadderGameApp.java create mode 100644 src/input.txt create mode 100644 src/models/Board.java create mode 100644 src/models/Dice.java create mode 100644 src/models/Game.java create mode 100644 src/models/Ladder.java create mode 100644 src/models/Obstacles.java create mode 100644 src/models/Player.java create mode 100644 src/models/Snake.java create mode 100644 src/services/DiceService.java create mode 100644 src/services/GameService.java create mode 100644 src/services/PlayerService.java 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); + } + +}