예제 #1
0
        public void TestIsDarkSquare()
        {
            GameObject      o          = new GameObject();
            BoardPreparator preparator = o.AddComponent <BoardPreparator>();
            int             i          = 0;
            int             j          = 0;
            bool            result     = preparator.IsDarkSquare(0, 0);

            Assert.AreEqual(true, result);

            result = preparator.IsDarkSquare(0, 1);
            Assert.AreEqual(false, result);
            result = preparator.IsDarkSquare(1, 0);
            Assert.AreEqual(false, result);
            result = preparator.IsDarkSquare(1, 1);
            Assert.AreEqual(true, result);
        }
예제 #2
0
    public void EmptySpaceClicked(int xWorldPos, int yWorldPos)
    {
        bool attacked    = false;
        bool attackAgain = false;

        Debug.Log("Empty Space Clicked");
        if (currentPiece == null)
        {
            Debug.Log("There is no piece selected");
        }
        else
        {
            if (currentPiece.GetPlayerNumber() == currentPlayerNumber)
            {
                Piece targetPiece = PieceToAttackFromPosition(currentPiece, xWorldPos, yWorldPos);
                if (targetPiece && boardPreparator.IsDarkSquare(xWorldPos, yWorldPos))
                {
                    Debug.Log("Can attack!");
                    ExecuteAttack(currentPiece, targetPiece);
                    ExecuteMove(currentPiece.GetXPosition(), currentPiece.GetYPosition(), xWorldPos, yWorldPos);
                    attacked    = true;
                    attackAgain = CanAttackAgain(currentPiece.GetXPosition(), currentPiece.GetYPosition());
                    EndCurrentPlayerTurn(attackAgain);
                }
                else if (CanMoveToSpace(currentPiece, xWorldPos, yWorldPos))
                {
                    Debug.Log(xWorldPos.ToString() + " AND " + yWorldPos.ToString());
                    ExecuteMove(currentPiece.GetXPosition(), currentPiece.GetYPosition(), xWorldPos, yWorldPos);
                    EndCurrentPlayerTurn(attackAgain);
                }
            }
            else
            {
                Debug.Log("That's not your turn funny boy...");
            }
        }

        CheckBoardState(attacked);
    }
예제 #3
0
    void BotAction()
    {
        //If CountBlackPieces == 0, o player ganhou
        Piece p;
        bool  atk         = false;
        bool  move        = false;
        bool  attackAgain = false;

        for (int i = 0; i < 10; i++)
        {
            for (int j = 0; j < 10; j++)
            {
                if (((i + j) % 2) == 0)
                {
                    int[] pos;
                    pos = null;
                    p   = boardState[i][j];
                    if (p != null && p.CompareTag("P2 Piece"))
                    {
                        pos = BotAttacker(p, i, j);
                    }
                    if (p && pos != null && atk == false) // p.CompareTag("P2 Piece") serve pra escolher só peça da IA
                    {
                        Piece targetPiece = PieceToAttackFromPosition(p, pos[0], pos[1]);
                        if (targetPiece && boardPreparator.IsDarkSquare(pos[0], pos[1]))
                        {
                            currentPiece = p;
                            Debug.Log("Can attack!");
                            ExecuteAttack(p, targetPiece);
                            ExecuteMove(p.GetXPosition(), p.GetYPosition(), pos[0], pos[1]);

                            attackAgain = CanAttackAgain(pos[0], pos[1]);
                            EndCurrentPlayerTurn(attackAgain);
                            atk = true;
                        }
                    }
                }
            }
        }
        if (atk == false)
        {
            //Botar um seed, mas funciona
            List <Piece> possibleMoves = new List <Piece>();
            for (int i = 0; i < 10; i++)
            {
                for (int j = 0; j < 10; j++)
                {
                    p = boardState[i][j];
                    if (p != null && move == false && p.CompareTag("P2 Piece"))
                    {
                        /*if (IsPositionInsideBoard(i + 1, j - 1) && boardState[i + 1][j - 1] == null && boardPreparator.IsDarkSquare(i+1, j-1))
                         * {
                         *  // aqui estava currentPiece que é a peça selecionada atualmente, só que a peça atual não era p.
                         *  currentPiece = p;
                         *  ExecuteMove(p.GetXPosition(), p.GetYPosition(), i+1, j-1);
                         *  EndCurrentPlayerTurn(attackAgain);
                         *  move = true;
                         * }
                         * else if (IsPositionInsideBoard(i - 1, j - 1) && boardState[i - 1][j - 1] == null && boardPreparator.IsDarkSquare(i - 1, j - 1))
                         * {
                         *  currentPiece = p;
                         *  ExecuteMove(p.GetXPosition(), p.GetYPosition(), i - 1, j - 1);
                         *  EndCurrentPlayerTurn(attackAgain);
                         *  move = true;
                         * }
                         *
                         * Implementando o aleatorio a partir daqui, o codigo em cima funfa mas n aleatorio */
                        if (CanBlackMove(p))
                        {
                            possibleMoves.Add(p);                 //Faz uma lista de possiveis pecas a serem mexidas
                        }
                    }
                }
            }
            int size = possibleMoves.Count;
            var rand = new System.Random();
            p            = possibleMoves[rand.Next(size)]; //Escolhe uma peca aleatoriamente do que foi selecionado
            currentPiece = p;
            int direction = rand.Next(2);

            /*Se direction for true ele tenta ir pela direita. Se nao conseguir, ele vai pela esquerda, ja q teoricamente ele tem q conseguir ir pra algum lugar.
             * Se direction for false ele comeca pela esquerda e dps vai pra direita.*/
            if (direction == 1)
            {
                int i = p.GetXPosition(), j = p.GetYPosition();
                if (IsPositionInsideBoard(i + 1, j - 1) && boardState[i + 1][j - 1] == null)
                {
                    ExecuteMove(p.GetXPosition(), p.GetYPosition(), i + 1, j - 1);
                    EndCurrentPlayerTurn(attackAgain);
                    move = true;
                }
                else
                {
                    ExecuteMove(p.GetXPosition(), p.GetYPosition(), i - 1, j - 1);
                    EndCurrentPlayerTurn(attackAgain);
                    move = true;
                }
            }
            else
            {
                int i = p.GetXPosition(), j = p.GetYPosition();
                if (IsPositionInsideBoard(i - 1, j - 1) && boardState[i - 1][j - 1] == null)
                {
                    ExecuteMove(p.GetXPosition(), p.GetYPosition(), i - 1, j - 1);
                    EndCurrentPlayerTurn(attackAgain);
                    move = true;
                }
                else
                {
                    ExecuteMove(p.GetXPosition(), p.GetYPosition(), i + 1, j - 1);
                    EndCurrentPlayerTurn(attackAgain);
                    move = true;
                }
            }
        }
        //If(move == 0), o player ganhou. Significa q ele n conseguiu nem comer ngm nem fazer nenhum movimento
    }