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); }