Example #1
0
        public bool Mark(int x, int y, PlayerMark playerMark)
        {
            if (!_Cells[x, y].Empty)
            {
                return(false);
            }

            BoardState boardState = _Stack[_StackPointer++];

            CopyBoardState(_CurrentBoardState, boardState);
            boardState.Point = new Point2D(x, y);
            _EmptyCount--;
            _Cells[x, y] = Cell.Get(playerMark);

            int index = (int)playerMark;
            int count = _CurrentBoardState.MaxCountInRowPerMark[index];

            if (count >= CountInRow)
            {
                return(true);
            }

            int  primaryDiagonal = 1;
            bool primaryDiagonalInRowBackward   = true;
            bool primaryDiagonalInRowForward    = true;
            int  secondaryDiagonal              = 1;
            bool secondaryDiagonalInRowBackward = true;
            bool secondaryDiagonalInRowForward  = true;
            int  horizontal = 1;
            bool horizontalInRowBackward = true;
            bool horizontalInRowForward  = true;
            int  vertical = 1;
            bool verticalInRowBackward = true;
            bool verticalInRowForward  = true;

            for (int i = 1; i < CountInRow; i++)
            {
                int pdx = x + i;
                int pdy = y + i;
                int ndx = x - i;
                int ndy = y - i;

                ProcessCoords(playerMark, ref primaryDiagonal, ref primaryDiagonalInRowBackward, ndx, ndy);
                ProcessCoords(playerMark, ref primaryDiagonal, ref primaryDiagonalInRowForward, pdx, pdy);

                ProcessCoords(playerMark, ref secondaryDiagonal, ref secondaryDiagonalInRowBackward, ndx, pdy);
                ProcessCoords(playerMark, ref secondaryDiagonal, ref secondaryDiagonalInRowForward, pdx, ndy);

                ProcessCoords(playerMark, ref horizontal, ref horizontalInRowBackward, ndx, y);
                ProcessCoords(playerMark, ref horizontal, ref horizontalInRowForward, pdx, y);


                ProcessCoords(playerMark, ref vertical, ref verticalInRowBackward, x, ndy);
                ProcessCoords(playerMark, ref vertical, ref verticalInRowForward, x, pdy);
            }

            int candidateCount = Math.Max(Math.Max(horizontal, vertical), Math.Max(primaryDiagonal, secondaryDiagonal));

            _CurrentBoardState.MaxCountInRowPerMark[index] = Math.Max(candidateCount, count);

            return(true);
        }