Esempio n. 1
0
        private IEnumerable <SingleGameMove> SingleMoveOptions(int diceRoll, GameColor player)
        {
            if (this.EatenDisksExist(player))
            {
                int destinationColumnIndex = player.RelativeColumnIndex(diceRoll);
                var destinationColumn      = this[destinationColumnIndex];
                if (destinationColumn.Color == player || destinationColumn.IsEmpty)
                {
                    yield return(new RemoveEatenDisk(destinationColumnIndex));
                }
                else if (destinationColumn.NumOfDisks == 1)
                {
                    yield return(new RemoveEatenDiskEats(destinationColumnIndex));
                }
            }
            else
            {
                bool canAquit = true;
                for (int columnIndex = 0; columnIndex <= 23 - diceRoll; columnIndex++)
                {
                    int sourceColumnIndex = player.RelativeColumnIndex(columnIndex);
                    var sourceColumn      = this[sourceColumnIndex];
                    if (sourceColumn.NumOfDisks > 0 && sourceColumn.Color == player)
                    {
                        canAquit = false;
                        int destinationColumnIndex = player.RelativeColumnIndex(columnIndex + diceRoll);
                        var destinationColumn      = this[destinationColumnIndex];
                        if (destinationColumn.IsEmpty || destinationColumn.Color == player)
                        {
                            yield return(new RegularMove(sourceColumnIndex, destinationColumnIndex));
                        }
                        else if (destinationColumn.NumOfDisks == 1)
                        {
                            yield return(new EatDisk(sourceColumnIndex, destinationColumnIndex));
                        }
                    }
                }
                if (canAquit)
                {
                    int columnIndex = 24 - diceRoll;
                    while (true)
                    {
                        int relativeColumn = player.RelativeColumnIndex(columnIndex);
                        var column         = this[relativeColumn];
                        if (column.NumOfDisks > 0 && column.Color == player)
                        {
                            yield return(new AcquitDisk(relativeColumn));

                            break;
                        }
                        columnIndex++;
                    }
                }
            }
        }