Example #1
0
    public bool OpponentCanWin(Node currentPosition)
    {
        bool canWin = false;

        List <Piece> possiblePieceForcedToMove = currentPosition.gameState.ScanForAllForcedPiece();

        if (possiblePieceForcedToMove.Count > 0)
        {
            foreach (Piece selectedPiece in possiblePieceForcedToMove)
            {
                CheckerBoard lookAhead = gameObject.AddComponent <CheckerBoard>();
                lookAhead = currentPosition.gameState;
                List <Vector2> possiblePositionsToMoveTo = selectedPiece.possiblePositionForcedToMoveTo;
                startDrag = gameState.UpdateDrag(selectedPiece);

                foreach (Vector2 possiblePosition in possiblePositionsToMoveTo)
                {
                    endDrag = possiblePosition;
                    currentPosition.ChangeMovingInState((int)startDrag.x, (int)startDrag.y, (int)endDrag.x, (int)endDrag.y);
                    if (lookAhead.CheckVictory(state) == 1)
                    {
                        canWin = true;
                        break;
                    }
                }
            }
        }
        else
        {
            List <Piece> possiblePieceToMove = gameState.ScanForAllPiecePossibleToMove();
            if (possiblePieceToMove.Count > 0)
            {
                foreach (Piece selectedPiece in possiblePieceToMove)
                {
                    CheckerBoard lookAhead = gameObject.AddComponent <CheckerBoard>();
                    lookAhead = currentPosition.gameState;
                    List <Vector2> possiblePositionsToMoveTo = selectedPiece.possiblePositionForcedToMoveTo;
                    startDrag = gameState.UpdateDrag(selectedPiece);

                    foreach (Vector2 possiblePosition in possiblePositionsToMoveTo)
                    {
                        endDrag = possiblePosition;
                        currentPosition.ChangeMovingInState((int)startDrag.x, (int)startDrag.y, (int)endDrag.x, (int)endDrag.y);
                        if (lookAhead.CheckVictory(state) == 1)
                        {
                            canWin = true;
                            break;
                        }
                    }
                }
            }
        }
        return(canWin);
    }
Example #2
0
    public void selectAction()
    {
        LinkedList <Node> visited = new LinkedList <Node>();
        Node cur = this;

        visited.AddLast(this);

        // if not win and cur is a leaf
        if (gameState.CheckVictory(state) == -9)
        {
            cur.expand();
            Node newNode = cur.select();
            gameState.Moving((int)newNode.state[65], (int)newNode.state[66], (int)newNode.state[67], (int)newNode.state[68]);
            if (newNode != null)
            {
                //newNode.GetCurrentCheckerBoard();
                visited.AddLast(newNode);
                // caculate value of all child node
                double value = rollOut(newNode);
                foreach (Node node in visited)
                {
                    node.updateStats(value);
                }
            }
            else
            {
                Debug.LogError("select action selected a null node");
            }
        }
        else
        {
            double value = 0;
            switch (cur.gameState.CheckVictory(state))
            {
            case 8:
                value = 1.0;
                break;

            case -8:
                value = 0.0;
                break;

            default:
                break;
            }
            foreach (Node node in visited)
            {
                node.updateStats(value);
            }
        }

        //return
    }
Example #3
0
    public double rollOut(Node tn)
    {
        CheckerBoard rollGS = gameObject.AddComponent <CheckerBoard>();

        rollGS = tn.gameState;
        bool   stillPlaying = true;
        double rc           = 0;
        int    pos;
        int    move;

        List <Piece> possiblePieceForcedToMove = rollGS.ScanForAllForcedPiece();

        if (possiblePieceForcedToMove.Count > 0)
        {
            while ((possiblePieceForcedToMove.Count > 0) && stillPlaying)
            {
                pos       = r.Next(possiblePieceForcedToMove.Count - 1);
                startDrag = gameState.UpdateDrag(possiblePieceForcedToMove[pos]);
                List <Vector2> possiblePositionsToMoveTo = possiblePieceForcedToMove[pos].possiblePositionForcedToMoveTo;
                move    = r.Next(possiblePositionsToMoveTo.Count - 1);
                endDrag = possiblePositionsToMoveTo[move];

                tn.ChangeMovingInState((int)startDrag.x, (int)startDrag.y, (int)endDrag.x, (int)endDrag.y);

                switch (rollGS.CheckVictory(state))
                {
                case -9:     // 1 won - ai
                    stillPlaying = false;
                    if (!rollGS.whoseMove())
                    {
                        rc = 1.0;
                    }
                    break;

                default:     /* keep playing */
                    possiblePieceForcedToMove = rollGS.ScanForAllForcedPiece();
                    break;
                }
            }
        }
        else
        {
            List <Piece> possiblePieceToMove = gameState.ScanForAllPiecePossibleToMove();
            while ((possiblePieceToMove.Count > 0) && stillPlaying)
            {
                pos       = r.Next(possiblePieceToMove.Count - 1);
                startDrag = gameState.UpdateDrag(possiblePieceToMove[pos]);
                List <Vector2> possiblePositionsToMoveTo = possiblePieceToMove[pos].possiblePositionToMoveTo;
                move    = r.Next(possiblePositionsToMoveTo.Count - 1);
                endDrag = possiblePositionsToMoveTo[move];

                tn.ChangeMovingInState((int)startDrag.x, (int)startDrag.y, (int)endDrag.x, (int)endDrag.y);

                switch (rollGS.CheckVictory(state))
                {
                case -9:     // 1 won - ai
                    stillPlaying = false;
                    if (!rollGS.whoseMove())
                    {
                        rc = 1.0;
                    }
                    break;

                default:     /* keep playing */
                    possiblePieceToMove = rollGS.ScanForAllForcedPiece();
                    break;
                }
            }
        }


        return(rc);
    }