Exemplo n.º 1
0
        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;
                }
            }
        }
Exemplo n.º 2
0
        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());
        }
Exemplo n.º 3
0
        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));
        }