Skip to content

Commit 2d71bc5

Browse files
author
Vishal M Yadav
committed
added solution for the problem snakes and ladders
1 parent 72f6181 commit 2d71bc5

16 files changed

+447
-0
lines changed
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package com.gatomalvado.snakesandladders;
2+
3+
import java.util.ArrayList;
4+
import java.util.HashSet;
5+
import java.util.List;
6+
import java.util.Scanner;
7+
import java.util.Set;
8+
9+
import com.gatomalvado.snakesandladders.model.Ladder;
10+
import com.gatomalvado.snakesandladders.model.Player;
11+
import com.gatomalvado.snakesandladders.model.Snake;
12+
import com.gatomalvado.snakesandladders.orchestrator.GameOrchestrator;
13+
14+
public class Main {
15+
16+
public static void main(String[] args) throws InterruptedException {
17+
GameOrchestrator gameOrchestrator = new GameOrchestrator(1, 1, false, 100);
18+
gameOrchestrator.takeSnakeInput();
19+
gameOrchestrator.takeLadderInput();
20+
gameOrchestrator.takePlayerInput();
21+
while(!gameOrchestrator.anyWinner()){
22+
gameOrchestrator.takeTurn();
23+
Thread.sleep(2000);
24+
}
25+
}
26+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
Problem Link:- https://workat.tech/machine-coding/practice/snake-and-ladder-problem-zgtac9lxwntg
2+
3+
Input:-
4+
9
5+
62 5
6+
33 6
7+
49 9
8+
88 16
9+
41 20
10+
56 53
11+
98 64
12+
93 73
13+
95 75
14+
8
15+
2 37
16+
27 46
17+
10 32
18+
51 68
19+
61 79
20+
65 84
21+
71 91
22+
81 100
23+
2
24+
Gaurav
25+
Sagar
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.gatomalvado.snakesandladders.model;
2+
3+
import com.gatomalvado.snakesandladders.model.enums.EntityType;
4+
5+
import lombok.AllArgsConstructor;
6+
import lombok.Getter;
7+
8+
@Getter
9+
@AllArgsConstructor
10+
public class Entity {
11+
protected String id;
12+
protected int startPos;
13+
protected int endPos;
14+
protected EntityType type;
15+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.gatomalvado.snakesandladders.model;
2+
3+
import com.gatomalvado.snakesandladders.model.enums.EntityType;
4+
5+
import lombok.AllArgsConstructor;
6+
import lombok.Data;
7+
import lombok.Getter;
8+
import lombok.NoArgsConstructor;
9+
10+
@Getter
11+
public class Ladder extends Entity {
12+
13+
public Ladder(String id, int xPos, int yPos) {
14+
super(id, xPos, yPos, EntityType.LADDER);
15+
}
16+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.gatomalvado.snakesandladders.model;
2+
3+
import com.gatomalvado.snakesandladders.model.enums.EntityType;
4+
5+
import lombok.AllArgsConstructor;
6+
import lombok.Data;
7+
import lombok.Getter;
8+
import lombok.NoArgsConstructor;
9+
import lombok.Setter;
10+
11+
@Getter
12+
public class Player {
13+
14+
private String name;
15+
16+
@Setter
17+
private int currPos;
18+
19+
public Player(String name, int currPos) {
20+
this.name = name;
21+
this.currPos = currPos;
22+
}
23+
24+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.gatomalvado.snakesandladders.model;
2+
3+
import com.gatomalvado.snakesandladders.model.enums.EntityType;
4+
5+
import lombok.AllArgsConstructor;
6+
import lombok.Data;
7+
import lombok.Getter;
8+
import lombok.NoArgsConstructor;
9+
10+
@Getter
11+
public class Snake extends Entity {
12+
13+
public Snake(String id, int xPos, int yPos) {
14+
super(id, xPos, yPos, EntityType.SNAKE);
15+
}
16+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.gatomalvado.snakesandladders.model.enums;
2+
3+
import lombok.Getter;
4+
5+
@Getter
6+
public enum EntityType {
7+
PLAYER("player"),
8+
SNAKE("snake"),
9+
LADDER("ladder");
10+
11+
private String name;
12+
13+
EntityType(String name) {
14+
this.name = name;
15+
}
16+
}
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
package com.gatomalvado.snakesandladders.orchestrator;
2+
3+
import java.util.List;
4+
import java.util.Optional;
5+
import java.util.Queue;
6+
7+
import com.gatomalvado.snakesandladders.model.Ladder;
8+
import com.gatomalvado.snakesandladders.model.Player;
9+
import com.gatomalvado.snakesandladders.model.Snake;
10+
import com.gatomalvado.snakesandladders.service.BoardFactory;
11+
import com.gatomalvado.snakesandladders.service.BoardGenerator;
12+
import com.gatomalvado.snakesandladders.service.NextPositionStrategy;
13+
import com.gatomalvado.snakesandladders.service.WinnerDeciderStrategy;
14+
15+
public class GameOrchestrator {
16+
17+
private Queue<Player> players;
18+
private List<Snake> snakes;
19+
private List<Ladder> ladders;
20+
private final int boardLength;
21+
private final NextPositionStrategy nextPositionStrategy;
22+
private final WinnerDeciderStrategy winnerDeciderStrategy;
23+
private final BoardGenerator boardGenerator;
24+
25+
public GameOrchestrator(int noOfDice, int noOfWinners, boolean autoGenerate, int boardLength) {
26+
synchronized (this) {
27+
BoardFactory boardFactory = new BoardFactory(noOfDice, noOfWinners, autoGenerate);
28+
this.nextPositionStrategy = boardFactory.getNextPositionStrategy();
29+
this.winnerDeciderStrategy = boardFactory.getWinnerDeciderStrategy();
30+
this.boardGenerator = boardFactory.getBoardGenerator();
31+
this.boardLength = boardLength;
32+
}
33+
}
34+
35+
public synchronized void takeSnakeInput() {
36+
this.snakes = this.boardGenerator.takeSnakeInput();
37+
}
38+
39+
public synchronized void takeLadderInput() {
40+
this.ladders = this.boardGenerator.takeLadderInput();
41+
}
42+
43+
public synchronized void takePlayerInput() {
44+
this.players = this.boardGenerator.takePlayerInput();
45+
}
46+
47+
public boolean anyWinner() {
48+
return this.winnerDeciderStrategy.closeGame(this.players, this.boardLength);
49+
}
50+
51+
public void takeTurn() {
52+
Player currPlayer = players.remove();
53+
this.players.add(currPlayer);
54+
int rolledValue = this.nextPositionStrategy.rollDice();
55+
int newPosition = currPlayer.getCurrPos() + rolledValue;
56+
Optional<Snake> snake = checkForSnake(newPosition);
57+
if (snake.isPresent()) {
58+
int snakeFinalPos = snake.get().getEndPos();
59+
System.out.println(
60+
"Player " + currPlayer.getName() + " got bit by snake at " + newPosition + " and moved from " + currPlayer.getCurrPos() + " to "
61+
+ snakeFinalPos);
62+
currPlayer.setCurrPos(snakeFinalPos);
63+
return;
64+
}
65+
Optional<Ladder> ladder = checkForLadder(newPosition);
66+
if (ladder.isPresent()) {
67+
int ladderFinalPos = ladder.get().getEndPos();
68+
System.out.println(
69+
"Player " + currPlayer.getName() + " got supported by a ladder at " + newPosition + " and moved from " + currPlayer.getCurrPos()
70+
+ " to " + ladderFinalPos);
71+
currPlayer.setCurrPos(ladderFinalPos);
72+
return;
73+
}
74+
System.out.println("Player " + currPlayer.getName() + " moved from " + currPlayer.getCurrPos() + " to " + newPosition);
75+
currPlayer.setCurrPos(newPosition);
76+
}
77+
78+
private Optional<Snake> checkForSnake(int position) {
79+
List<Snake> snakes = this.snakes.stream().filter((s) -> s.getStartPos() == position).toList();
80+
if (snakes.size() == 0) {
81+
return Optional.empty();
82+
}
83+
return Optional.of(snakes.get(0));
84+
}
85+
86+
private Optional<Ladder> checkForLadder(int position) {
87+
List<Ladder> ladders = this.ladders.stream().filter((l) -> l.getStartPos() == position).toList();
88+
if (ladders.size() == 0) {
89+
return Optional.empty();
90+
}
91+
return Optional.of(ladders.get(0));
92+
}
93+
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package com.gatomalvado.snakesandladders.service;
2+
3+
4+
import java.util.concurrent.atomic.AtomicInteger;
5+
6+
import lombok.Getter;
7+
8+
@Getter
9+
public class BoardFactory {
10+
11+
12+
private NextPositionStrategy nextPositionStrategy;
13+
14+
15+
private WinnerDeciderStrategy winnerDeciderStrategy;
16+
17+
18+
private BoardGenerator boardGenerator;
19+
20+
public BoardFactory(int noOfDice, int noOfWinners, boolean autoGenerate) {
21+
synchronized (this) {
22+
initNextPositionStrategy(noOfDice);
23+
initWinnerDeciderStrategy(noOfWinners);
24+
initBoardGenerator(autoGenerate);
25+
}
26+
}
27+
28+
private void initBoardGenerator(boolean autoGenerate) {
29+
if(autoGenerate){
30+
throw new UnsupportedOperationException("Auto generation of snakes and ladders is not supported");
31+
}
32+
this.boardGenerator = new ManualBoardGenerator();
33+
}
34+
35+
private synchronized void initWinnerDeciderStrategy(int noOfWinners) {
36+
switch (noOfWinners) {
37+
case 1:
38+
this.winnerDeciderStrategy = new SingleWinnerStrategy();
39+
return;
40+
default:
41+
throw new UnsupportedOperationException("Only single winner is supported as of now");
42+
}
43+
}
44+
45+
private synchronized void initNextPositionStrategy(int noOfDice) {
46+
switch (noOfDice) {
47+
case 1:
48+
this.nextPositionStrategy = new SingleDiceNextPositionStrategy();
49+
return;
50+
default:
51+
throw new UnsupportedOperationException("Only single dice is supported as of now");
52+
}
53+
}
54+
55+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.gatomalvado.snakesandladders.service;
2+
3+
import java.util.ArrayList;
4+
import java.util.List;
5+
import java.util.Queue;
6+
import java.util.Scanner;
7+
import java.util.Set;
8+
9+
import com.gatomalvado.snakesandladders.model.Ladder;
10+
import com.gatomalvado.snakesandladders.model.Player;
11+
import com.gatomalvado.snakesandladders.model.Snake;
12+
13+
public interface BoardGenerator{
14+
15+
Queue<Player> takePlayerInput();
16+
17+
List<Snake> takeSnakeInput();
18+
19+
List<Ladder> takeLadderInput();
20+
21+
}

0 commit comments

Comments
 (0)