Esempio n. 1
0
        private static Task <bool> IsValuePossibleAsync(byte[] boardData, int zeroBasedRowIndex, int zeroBasedColumnIndex, byte value)
        {
            Board.BoardDataContract(boardData);
            Board.IndexValidContract(zeroBasedColumnIndex);
            Board.IndexValidContract(zeroBasedRowIndex);
            Board.CellValueContract(value);

            // Note how we run the three tests in parallel. They are independent of each other.
            var tasks = new Task <bool> [3];

            tasks[0] = Task.Run <bool>(() => Board.IsValuePossibleInRow(boardData, zeroBasedRowIndex, value));
            tasks[1] = Task.Run <bool>(() => Board.IsValuePossibleInColumn(boardData, zeroBasedColumnIndex, value));
            tasks[2] = Task.Run <bool>(() => Board.IsValuePossibleInSquare(boardData, zeroBasedRowIndex, zeroBasedColumnIndex, value));
            return(Task.Factory.ContinueWhenAll(tasks, t => t[0].Result && t[1].Result && t[2].Result));
        }
Esempio n. 2
0
        /// <summary>
        /// Internal implementation for setting a cell's value.
        /// </summary>
        private static bool TrySetCellInternal(byte[] boardData, int zeroBasedRowIndex, int zeroBasedColumnIndex, byte value)
        {
            Board.BoardDataContract(boardData);
            Board.IndexValidContract(zeroBasedRowIndex);
            Board.IndexValidContract(zeroBasedColumnIndex);
            Board.CellValueContract(value, allowZero: false);

            if (Board.IsValuePossible(boardData, zeroBasedRowIndex, zeroBasedColumnIndex, value))
            {
                boardData[Board.CalculateIndexFromRowAndColumn(zeroBasedRowIndex, zeroBasedColumnIndex)] = value;
                return(true);
            }

            return(false);
        }
Esempio n. 3
0
        private static bool IsValuePossibleInColumn(byte[] boardData, int zeroBasedColumnIndex, byte value)
        {
            Board.BoardDataContract(boardData);
            Board.IndexValidContract(zeroBasedColumnIndex);
            Board.CellValueContract(value);

            for (int i = 0, index = zeroBasedColumnIndex; i < 9; i++, index += 9)
            {
                if (boardData[index] == value)
                {
                    return(false);
                }
            }

            return(true);
        }
Esempio n. 4
0
        private static bool IsValuePossibleInSquare(byte[] boardData, int zeroBasedRowIndex, int zeroBasedColumnIndex, byte value)
        {
            Board.BoardDataContract(boardData);
            Board.IndexValidContract(zeroBasedColumnIndex);
            Board.IndexValidContract(zeroBasedRowIndex);
            Board.CellValueContract(value);

            for (int r = 0, rowIndex = (zeroBasedRowIndex / 3) * 3; r < 3; r++, rowIndex++)
            {
                for (int c = 0, columnIndex = (zeroBasedColumnIndex / 3) * 3; c < 3; c++, columnIndex++)
                {
                    if (boardData[(rowIndex * 9) + columnIndex] == value)
                    {
                        return(false);
                    }
                }
            }

            return(true);
        }