public ReversiField PrepareField(Position?blackHole = null)
        {
            var size  = 8;
            var cells = new Cell[size, size];

            for (int row = 0; row < size; row++)
            {
                for (int column = 0; column < size; column++)
                {
                    var position = new Position(row, column);
                    if (position != blackHole)
                    {
                        cells[row, column] = new Cell();
                    }
                }
            }

            var field = new ReversiField(cells);

            field.GetCell("D4").Place(new Piece(Color.White));
            field.GetCell("E5").Place(new Piece(Color.White));
            field.GetCell("D5").Place(new Piece(Color.Black));
            field.GetCell("E4").Place(new Piece(Color.Black));

            return(field);
        }
        static void DrawField(ReversiField field, Color currentMove, List <PossibleMove> possibleMoves)
        {
            var delimiter = "  ";

            Console.Write($"{delimiter} ");
            for (char letter = 'A'; letter <= 'H'; letter++)
            {
                Console.Write($"{letter}{delimiter}");
            }

            for (var row = 0; row <= 7; row++)
            {
                Console.WriteLine();
                Console.Write($"{(row + 1)}  ");
                for (var column = 0; column <= 7; column++)
                {
                    var position = new Position(row, column);
                    var cell     = field.GetCell(position);
                    DrawCell(cell, position);
                }
            }

            void DrawCell(Cell cell, Position position)
            {
                string code;

                if (cell.HasPiece)
                {
                    code = cell.Piece.Color == Color.Black ? "B" : "W";
                }
                else
                {
                    code = possibleMoves.Any(move => move.Position.Equals(position) && move.Color == currentMove)
                        ? "+"
                        : ".";
                }

                Console.Write($"{code}  ");
            }

            Console.WriteLine();
        }
Exemple #3
0
 public IEnumerable <PossibleMove> GetPossibleMoves(ReversiField field)
 {
     foreach (var(position, cell) in field.AllCells())
     {
         if (cell.HasPiece)
         {
             continue;
         }
         var streaks = streakFinder.GetStreaksFor(position, field);
         foreach (var streak in streaks)
         {
             var firstPoint = streak[0];
             var firstPieceOppositeColor = firstPoint.Piece.Color.Opposite();
             if (streak.Count > 1 &&
                 streak.Any(c => c.HasPiece && c.Piece.Color == firstPieceOppositeColor))
             {
                 yield return(new PossibleMove(position, firstPieceOppositeColor));
             }
         }
     }
 }
Exemple #4
0
        public IEnumerable <List <Cell> > GetStreaksFor(Position origin, ReversiField field)
        {
            var directionOffsets = new List <Position>();

            for (var x = -1; x <= 1; x++)
            {
                for (var y = -1; y <= 1; y++)
                {
                    if (x != 0 || y != 0)
                    {
                        directionOffsets.Add(new Position(x, y));
                    }
                }
            }

            foreach (var offset in directionOffsets)
            {
                var  streak = new List <Cell>();
                Cell next;
                var  nextPosition = origin;
                do
                {
                    nextPosition += offset;
                    next          = field.GetCell(nextPosition);
                    if (next != null && next.HasPiece)
                    {
                        streak.Add(next);
                    }
                } while (next != null && next.HasPiece);

                if (streak.Any())
                {
                    yield return(streak);
                }
            }
        }