🎲
Game Design

Snake and Ladder

Board, Dice Aur Turn Rotation
💡 Snake and Ladder EK SEEDHI LINE ka safar hai jisme kuch jagah shortcut (ladder) hain aur kuch jagah phisalpatti (snake). Design ka kaam sirf ye hai ki jump ko ek hi tarah se model kar do.

Sabse achha design decision: Snake aur Ladder ko ALAG classes mat banao — dono "Jump" hain (start → end). Ladder mein end > start, snake mein end < start. Ek Map<Integer, Integer> jumps hi kaafi hai aur code aadha ho jaata hai.

Turn rotation ke liye Queue use karo — player nikaalo, khilao, wapas peeche daal do. Dice ko interface banao (rollable) taaki test mein fixed-value dice inject kar sako. Interviewer aksar poochta hai "6 aane par extra turn kaise?" — Queue mein wapas aage daal do.

class Game {
  private final Map<Integer, Integer> jumps = new HashMap<>(); // snake + ladder dono
  private final Deque<Player> turnOrder = new ArrayDeque<>();
  private final Dice dice;

  void playTurn() {
    Player p = turnOrder.poll();
    int roll = dice.roll();
    int next = p.getPosition() + roll;
    if (next <= 100) {
      p.setPosition(jumps.getOrDefault(next, next));   // jump apne aap lag gaya
    }
    if (roll == 6) turnOrder.addFirst(p); else turnOrder.addLast(p);
  }
}
🎲
Snake and Ladder EK SEEDHI LINE ka safar hai jisme kuch jagah shortcut (ladder) hain aur kuch jagah phisalpatti (snake). Design ka kaam sirf ye hai ki jump ko ek hi tarah se model kar do.
1 / 2
⚡ Quick Recap
  • Snake aur Ladder ko ek hi Jump abstraction se model karo
  • Turn rotation Queue/Deque se — extra turn addFirst se
  • Dice ko interface banao taaki deterministic test likha ja sake
Is page mein (2 subtopics)

Board banate waqt validate karo: snake ka start > end hona chahiye, ladder ka start < end. Ek hi cell par do jumps nahi ho sakte. 100 par na snake ka mooh ho na ladder ka top. 1 par snake ka mooh nahi ho sakta.

Ye validations batana dikhata hai ki tumne INVALID INPUT socha hai — bahut kam candidates ye karte hain aur ye alag se marks deta hai.

void addJump(int start, int end) {
  if (start == end) throw new InvalidBoardException("start aur end same");
  if (jumps.containsKey(start)) throw new InvalidBoardException("cell par pehle se jump");
  if (start == 100 || start == 1) throw new InvalidBoardException("boundary cell");
  jumps.put(start, end);
}

Classic rule hai ki 100 par pahunchne ke liye EXACT roll chahiye — 97 par ho aur 5 aa jaaye to move cancel. Ye if condition (next <= 100) se handle hota hai; batao ki ye ek configurable RULE hai, hardcoded behaviour nahi.

Multiple dice support ke liye Dice class mein count rakho — roll() sabka jod return kare. Ye chhota sa extension interviewer ke "2 dice se khel sakte ho?" ka jawab de deta hai.

💡Tip: Rules ko GameConfig object mein rakho (exactRollToWin, diceCount, boardSize) — isse har rule variation config change ban jaata hai, code change nahi.