示例#1
0
        // Calculates how many wins each characteristic of the piece to be played can win on any given board.
        public static int calculateHeuristic(string[] gameBoard, string pieceToPlay)
        {
            byte pieceBinary;

            byte[]        pieces        = new byte[16];
            winningValues winningValues = new winningValues();

            for (int i = 0; i < 10; i++)
            {
                winningValues.rowWon[i] = false;
            }
            // Array.Fill is not working in Unity as of 2/18/2020
            // Array.Fill(rowWon, false);

            pieceBinary = convertToBinaryRepresentation(pieceToPlay);
            for (int i = 0; i < MAXGAMEBOARD; i++)
            {
                pieces[i] = convertToBinaryRepresentation(gameBoard[i]);
            }

            if (pieceToPlay == null)
            {
                winningValues.isPlaying = false;
            }

            //checks columns and rows for wins
            int rowCounter = 0;

            for (int colCounter = 0; colCounter < 4; colCounter++)
            {
                //checks rows for wins on all matches
                winningValues = comparePiecesInRow(pieces[rowCounter], pieces[rowCounter + 1], pieces[rowCounter + 2], pieces[rowCounter + 3], colCounter, winningValues, pieceBinary, 1);
                winningValues = comparePiecesInRow(pieces[rowCounter], pieces[rowCounter + 1], pieces[rowCounter + 2], pieces[rowCounter + 3], colCounter, winningValues, pieceBinary, 0);

                //checks columns for wins on all matches
                winningValues = comparePiecesInRow(pieces[colCounter], pieces[colCounter + 4], pieces[colCounter + 8], pieces[colCounter + 12], colCounter + 4, winningValues, pieceBinary, 1);
                winningValues = comparePiecesInRow(pieces[colCounter], pieces[colCounter + 4], pieces[colCounter + 8], pieces[colCounter + 12], colCounter + 4, winningValues, pieceBinary, 0);

                rowCounter += 4;
            }


            //check first diagonal for wins
            winningValues = comparePiecesInRow(pieces[0], pieces[5], pieces[10], pieces[15], 8, winningValues, pieceBinary, 1);
            winningValues = comparePiecesInRow(pieces[0], pieces[5], pieces[10], pieces[15], 8, winningValues, pieceBinary, 0);

            //check second diagonal for wins
            winningValues = comparePiecesInRow(pieces[3], pieces[6], pieces[9], pieces[12], 9, winningValues, pieceBinary, 1);
            winningValues = comparePiecesInRow(pieces[3], pieces[6], pieces[9], pieces[12], 9, winningValues, pieceBinary, 0);

            return(winningValues.finalResult);
        }
示例#2
0
        public static winningValues checkWinRows(byte piece1, byte piece2, byte piece3, byte piece4, int rowNumber, winningValues winningValues, byte pieceBinary, int oddBit)
        {
            var slot1         = 0;
            var slot2         = 0;
            var slot3         = 0;
            var slot4         = 0;
            var potentialSlot = 0;
            int oppositeBit;

            if (oddBit == 1)
            {
                oppositeBit = 0;
            }
            else
            {
                oppositeBit = 1;
            }

            for (int k = 3; k >= 0; k--)
            {
                //checks rows for wins on all matches
                slot1         = piece1 >> k;
                slot2         = piece2 >> k;
                slot3         = piece3 >> k;
                slot4         = piece4 >> k;
                potentialSlot = pieceBinary >> k;

                winningValues.nullPiece = countNullPieces(piece1, piece2, piece3, piece4);

                if (winningValues.nullPiece[1] > 1)
                {
                }

                else
                {
                    if (winningValues.nullPiece[0] == 1)
                    {
                        slot1 = oppositeBit;
                    }
                    else if (winningValues.nullPiece[0] == 2)
                    {
                        slot2 = oppositeBit;
                    }
                    else if (winningValues.nullPiece[0] == 3)
                    {
                        slot3 = oppositeBit;
                    }
                    else if (winningValues.nullPiece[0] == 4)
                    {
                        slot4 = oppositeBit;
                    }

                    if (winningValues.isPlaying && (slot1 % 2 == oddBit && slot2 % 2 == oddBit && slot3 % 2 == oddBit && potentialSlot % 2 == oddBit) ||
                        (slot1 % 2 == oddBit && slot2 % 2 == oddBit && slot4 % 2 == oddBit && potentialSlot % 2 == oddBit) ||
                        (slot1 % 2 == oddBit && slot3 % 2 == oddBit && slot4 % 2 == oddBit && potentialSlot % 2 == oddBit) ||
                        (slot2 % 2 == oddBit && slot3 % 2 == oddBit && slot4 % 2 == oddBit && potentialSlot % 2 == oddBit))
                    {
                        if (winningValues.rowWon[rowNumber] == false)
                        {
                            winningValues.finalResult++;
                            winningValues.rowWon[rowNumber] = true;
                        }
                    }
                }
            }
            return(winningValues);
        }
示例#3
0
        public static bool isWin(string[] gameBoard, string pieceToPlay, int boardPosition)
        {
            byte pieceBinary;

            byte[]        pieces        = new byte[16];
            winningValues winningValues = new winningValues();

            for (int i = 0; i < 10; i++)
            {
                winningValues.rowWon[i] = false;
            }

            pieceBinary = convertToBinaryRepresentation(pieceToPlay);
            for (int i = 0; i < MAXGAMEBOARD; i++)
            {
                pieces[i] = convertToBinaryRepresentation(gameBoard[i]);
            }

            if (boardPosition == 0 || boardPosition == 1 || boardPosition == 2 || boardPosition == 3)
            {
                winningValues = checkWinRows(pieces[0], pieces[1], pieces[2], pieces[3], 0, winningValues, pieceBinary, 1);
                winningValues = checkWinRows(pieces[0], pieces[1], pieces[2], pieces[3], 0, winningValues, pieceBinary, 0);
            }
            if (boardPosition == 4 || boardPosition == 5 || boardPosition == 6 || boardPosition == 7)
            {
                winningValues = checkWinRows(pieces[4], pieces[5], pieces[6], pieces[7], 1, winningValues, pieceBinary, 1);
                winningValues = checkWinRows(pieces[4], pieces[5], pieces[6], pieces[7], 1, winningValues, pieceBinary, 0);
            }
            if (boardPosition == 8 || boardPosition == 9 || boardPosition == 10 || boardPosition == 11)
            {
                winningValues = checkWinRows(pieces[8], pieces[9], pieces[10], pieces[11], 2, winningValues, pieceBinary, 1);
                winningValues = checkWinRows(pieces[8], pieces[9], pieces[10], pieces[11], 2, winningValues, pieceBinary, 0);
            }
            if (boardPosition == 12 || boardPosition == 13 || boardPosition == 14 || boardPosition == 15)
            {
                winningValues = checkWinRows(pieces[12], pieces[13], pieces[14], pieces[15], 3, winningValues, pieceBinary, 1);
                winningValues = checkWinRows(pieces[12], pieces[13], pieces[14], pieces[15], 3, winningValues, pieceBinary, 0);
            }
            if (boardPosition == 0 || boardPosition == 4 || boardPosition == 8 || boardPosition == 12)
            {
                winningValues = checkWinRows(pieces[0], pieces[4], pieces[8], pieces[12], 4, winningValues, pieceBinary, 1);
                winningValues = checkWinRows(pieces[0], pieces[4], pieces[8], pieces[12], 4, winningValues, pieceBinary, 0);
            }
            if (boardPosition == 1 || boardPosition == 5 || boardPosition == 9 || boardPosition == 13)
            {
                winningValues = checkWinRows(pieces[1], pieces[5], pieces[9], pieces[12], 5, winningValues, pieceBinary, 1);
                winningValues = checkWinRows(pieces[1], pieces[5], pieces[9], pieces[12], 5, winningValues, pieceBinary, 0);
            }
            if (boardPosition == 2 || boardPosition == 6 || boardPosition == 10 || boardPosition == 14)
            {
                winningValues = checkWinRows(pieces[2], pieces[6], pieces[10], pieces[14], 6, winningValues, pieceBinary, 1);
                winningValues = checkWinRows(pieces[2], pieces[6], pieces[10], pieces[14], 6, winningValues, pieceBinary, 0);
            }
            if (boardPosition == 3 || boardPosition == 7 || boardPosition == 11 || boardPosition == 15)
            {
                winningValues = checkWinRows(pieces[3], pieces[7], pieces[11], pieces[15], 7, winningValues, pieceBinary, 1);
                winningValues = checkWinRows(pieces[3], pieces[7], pieces[11], pieces[15], 7, winningValues, pieceBinary, 0);
            }
            if (boardPosition == 0 || boardPosition == 5 || boardPosition == 10 || boardPosition == 15)
            {
                winningValues = checkWinRows(pieces[0], pieces[5], pieces[10], pieces[15], 8, winningValues, pieceBinary, 1);
                winningValues = checkWinRows(pieces[0], pieces[5], pieces[10], pieces[15], 8, winningValues, pieceBinary, 0);
            }
            if (boardPosition == 3 || boardPosition == 6 || boardPosition == 9 || boardPosition == 12)
            {
                winningValues = checkWinRows(pieces[3], pieces[6], pieces[9], pieces[12], 9, winningValues, pieceBinary, 1);
                winningValues = checkWinRows(pieces[3], pieces[6], pieces[9], pieces[12], 9, winningValues, pieceBinary, 0);
            }

            if (winningValues.finalResult > 0)
            {
                return(true);
            }
            else
            {
                return(false);
            }
        }