public void drawTilesWithDragonHolder() { if (dragonTileHolder == null) { throw new Exception("There is not a dragon tile holder."); } if (drawPile.Count != 0) { int dragonHolderIndex = activePlayers.FindIndex(x => x.getColor() == dragonTileHolder.getColor()); int toDrawIndex = dragonHolderIndex; SPlayer nextPlayerToDraw = dragonTileHolder; do { nextPlayerToDraw.addTileToHand(drawTile()); toDrawIndex++; nextPlayerToDraw = activePlayers[(toDrawIndex) % activePlayers.Count]; } while (drawPile.Count != 0 && nextPlayerToDraw.getHandSize() < 3); // if nextPlayer has 3 tiles in its hand, set dragonTileHolder back to null if (nextPlayerToDraw.getHandSize() < 3) { dragonTileHolder = nextPlayerToDraw; } else { dragonTileHolder = null; } } }
public TurnResult playATurn(Board b, Tile t) { // Place tile on board SPlayer currentPlayer = b.getFirstActivePlayer(); b.placeTile(currentPlayer, t); // Move active players if newly placed tile affects them b.movePlayers(); bool isCurrentPlayerEliminated = b.isEliminated(currentPlayer.returnColor()); // Check if game is over if (b.isGameOver()) { return(b.GetTurnResult()); } // Players draw if (b.existsDragonTileHolder()) { b.drawTilesWithDragonHolder(); } else { if (!isCurrentPlayerEliminated) { if (b.isDrawPileEmpty()) { b.setDragonTileHolder(currentPlayer); } else { currentPlayer.addTileToHand(b.drawATile()); } } } // Update game play order if (!isCurrentPlayerEliminated) { b.moveCurrentPlayerToEndOfPlayOrder(); } // Compute turn result return(b.GetTurnResult()); }
public TurnResult playATurn(Board b, Tile t) { if (activePlayers.Count == 0) { throw new TsuroException("Cannot play turn - No more active players on the board"); } List <SPlayer> winners = null; SPlayer currentPlayer = activePlayers[0]; b.placeTile(currentPlayer.getColor(), t); // Move active players if newly placed tile affects them List <string> onEdgeColors = b.moveActivePlayers(getActivePlayerColors()); // Eliminate on edge players bool isCurrentPlayerEliminated = false; List <SPlayer> onEdgePlayers = new List <SPlayer>(); foreach (string playerColor in onEdgeColors) { eliminatePlayer(playerColor); onEdgePlayers.Add(getPlayer(playerColor)); if (playerColor == currentPlayer.getColor()) { isCurrentPlayerEliminated = true; } } // Check if game is over bool gameOver = false; if (activePlayers.Count == 0) { // If all active players eliminated in the same turn, they all are winners winners = onEdgePlayers; gameOver = true; } else if (b.getNumTilesOnBoard() == 35 || activePlayers.Count == 1) { // If all tiles played, all remaining players tie as winners // If only one active player left, he/she wins winners = activePlayers; gameOver = true; } if (gameOver) { return(new TurnResult(drawPile, activePlayers, eliminatedPlayers, b, winners)); } // Players draw if (dragonTileHolder != null) { drawTilesWithDragonHolder(); } else { if (!isCurrentPlayerEliminated) { if (drawPile.Count == 0) { dragonTileHolder = currentPlayer; } else { currentPlayer.addTileToHand(drawTile()); } } } // Update game play order if (!isCurrentPlayerEliminated) { activePlayers.RemoveAt(0); activePlayers.Add(currentPlayer); } // Compute turn result return(new TurnResult(drawPile, activePlayers, eliminatedPlayers, b, winners)); }