示例#1
0
 public Move_new GetMove()
 {
     _board   = Board_new.Instance;
     bestMove = _CreateMove(_board.GetTileFromBoard(new Vector2(0, 0)), _board.GetTileFromBoard(new Vector2(0, 0)));
     AB(maxDepth, -100000000, 1000000000, true);
     return(bestMove);
 }
示例#2
0
    List <Move_new> _GetMoves(Piece_new.playerColor color)
    {
        List <Move_new> turnMove = new List <Move_new>();
        List <Tile_new> pieces   = new List <Tile_new>();

        if (color == Piece_new.playerColor.BLACK)
        {
            pieces = _blackPieces;
        }
        else
        {
            pieces = _whitePieces;
        }

        foreach (Tile_new tile in pieces)
        {
            MoveFactory     factory    = new MoveFactory(_board);
            List <Move_new> pieceMoves = factory.GetMoves(tile.CurrentPiece, tile.Position);

            foreach (Move_new move in pieceMoves)
            {
                Move_new newMove = _CreateMove(move.firstPosition, move.secondPosition);
                turnMove.Add(newMove);
            }
        }
        return(turnMove);
    }
    public void SwapPieces(Move_new move)
    {
        GameObject[] objects = GameObject.FindGameObjectsWithTag("Highlight");
        foreach (GameObject o in objects)
        {
            Destroy(o);
        }

        Tile_new firstTile  = move.firstPosition;
        Tile_new secondTile = move.secondPosition;

        firstTile.CurrentPiece.MovePiece(new Vector3(-move.secondPosition.Position.x, 0, move.secondPosition.Position.y));

        if (secondTile.CurrentPiece != null)
        {
            if (secondTile.CurrentPiece.Type == Piece_new.pieceType.KING)
            {
                _kingDead = true;
            }
            Destroy(secondTile.CurrentPiece.gameObject);
        }


        secondTile.CurrentPiece          = move.pieceMoved;
        firstTile.CurrentPiece           = null;
        secondTile.CurrentPiece.position = secondTile.Position;
        secondTile.CurrentPiece.HasMoved = true;

        playerTurn = !playerTurn;
    }
示例#4
0
    Move_new _CreateMove(Tile_new tile, Tile_new move)
    {
        Move_new tempMove = new Move_new();

        tempMove.firstPosition  = tile;
        tempMove.pieceMoved     = tile.CurrentPiece;
        tempMove.secondPosition = move;

        if (move.CurrentPiece != null)
        {
            tempMove.pieceKilled = move.CurrentPiece;
        }

        return(tempMove);
    }
    void _DoAIMove(Move_new move)
    {
        Tile_new firstPosition  = move.firstPosition;
        Tile_new secondPosition = move.secondPosition;

        if (secondPosition.CurrentPiece && secondPosition.CurrentPiece.Type == Piece_new.pieceType.KING)
        {
            SwapPieces(move);
            _kingDead = true;
        }
        else
        {
            SwapPieces(move);
        }
    }
示例#6
0
    void _CheckAndStoreMove(Vector2 move)
    {
        if (_IsOnBoard(move) && (!_ContainsPiece(_board.GetTileFromBoard(move)) || _IsEnemy(_board.GetTileFromBoard(move))))
        {
            Move_new m = new Move_new();
            m.firstPosition  = _board.GetTileFromBoard(_position);
            m.pieceMoved     = _piece;
            m.secondPosition = _board.GetTileFromBoard(move);

            if (m.secondPosition != null)
            {
                m.pieceKilled = m.secondPosition.CurrentPiece;
            }

            moves.Add(m);
        }
    }
    void Update()
    {
        if (_kingDead)
        {
            Debug.Log("WINNER!");
            //UnityEditor.EditorApplication.isPlaying = false;
            Application.Quit();
        }

        if (!playerTurn)
        {
            Move_new move = ab.GetMove();
            //Debug.Log(move.secondPosition.Position.x);
            //Debug.Log(move.secondPosition.Position.y);
            _DoAIMove(move);
        }
    }
示例#8
0
    void _UndoFakeMove()
    {
        Move_new  tempMove    = moveStack.Pop();
        Tile_new  movedTo     = tempMove.secondPosition;
        Tile_new  movedFrom   = tempMove.firstPosition;
        Piece_new pieceKilled = tempMove.pieceKilled;
        Piece_new pieceMoved  = tempMove.pieceMoved;

        movedFrom.CurrentPiece = movedTo.CurrentPiece;

        if (pieceKilled != null)
        {
            movedTo.CurrentPiece = pieceKilled;
        }
        else
        {
            movedTo.CurrentPiece = null;
        }
    }
示例#9
0
    int AB(int depth, int alpha, int beta, bool max)
    {
        _GetBoard_newState();

        if (depth == 0)
        {
            return(_Evaluate());
        }
        if (max)
        {
            int             score    = -10000000;
            List <Move_new> allMoves = _GetMoves(Piece_new.playerColor.BLACK);
            foreach (Move_new move in allMoves)
            {
                moveStack.Push(move);

                _DoFakeMove(move.firstPosition, move.secondPosition);

                score = AB(depth - 1, alpha, beta, false);

                _UndoFakeMove();

                if (score > alpha)
                {
                    move.score = score;
                    if (move.score > bestMove.score && depth == maxDepth)
                    {
                        bestMove = move;
                    }
                    alpha = score;
                }
                if (score >= beta)
                {
                    break;
                }
            }
            return(alpha);
        }
        else
        {
            int             score    = 10000000;
            List <Move_new> allMoves = _GetMoves(Piece_new.playerColor.WHITE);
            foreach (Move_new move in allMoves)
            {
                moveStack.Push(move);

                _DoFakeMove(move.firstPosition, move.secondPosition);

                score = AB(depth - 1, alpha, beta, true);

                _UndoFakeMove();

                if (score < beta)
                {
                    move.score = score;
                    beta       = score;
                }
                if (score <= alpha)
                {
                    break;
                }
            }
            return(beta);
        }
    }