Example #1
0
    public EchecThreat PieceEchec(Case [,] board, Simulation sim, ChessMan Target, bool OneShotSimulation = false)
    {
        sim.Simulate();

        EchecThreat threat = new EchecThreat(sim.targetCase.currPiece);

        foreach (ChessMan chess in m_sCase.Pieces)
        {
            if (sim.deletedBackup != null && sim.deletedBackup == chess)
            {
                continue;
            }

            if (chess.color != Target.color)
            {
                List <Case> moves = chess.GetPossibleMovement(board, false);
                foreach (Case c in moves)
                {
                    //here it means if we have a possible movement case non null with the target on it
                    if (c.currPiece != null && c.currPiece == Target)
                    {
                        threat.Add(chess);
                    }
                }
            }
        }

        threat.SortThreats();
        if (OneShotSimulation)
        {
            sim.Delete();
        }

        return(threat.threater.Count > 0 ? threat : null);
    }
Example #2
0
    public EchecThreat PieceEchec(Case [,] board, ChessMan Target, ChessMan deleted = null)
    {
        if (Target == null)
        {
            return(null);
        }
        EchecThreat threat = new EchecThreat(Target);

        foreach (ChessMan chess in m_sCase.Pieces)
        {
            if (deleted != null && deleted == chess)
            {
                continue;
            }

            if (chess.color != Target.color)
            {
                List <Case> moves = chess.GetPossibleMovement(board, false);
                foreach (Case c in moves)
                {
                    //here it means if we have a possible movement case non null with the ennemy king on it
                    if (c.currPiece != null && c.currPiece == Target)
                    {
                        threat.Add(chess);
                    }
                }
            }
        }

        threat.SortThreats();

        return(threat.threater.Count > 0 ? threat : null);
    }
Example #3
0
    public Decision Evaluate(ChessMan chess, Case [,] board)
    {
        int x = chess.position.x;
        int y = chess.position.y;

        List <Case> possibleCase = chess.GetPossibleMovement(board);

        List <underDecision> underDecs = new List <underDecision>();
        int initialsMoves = GetListOfPossibleMove(chess.color).Count;

        EchecThreat isThreatened = PieceEchec(board, chess);

        foreach (Case c in possibleCase)
        {
            underDecision d = new underDecision(0, c);

            //here we found out that we can get a special piece with a priority, but take care, it might put us in a bad situation
            if (c.currPiece != null && c.currPiece.color != chess.color)
            {
                d.value += c.currPiece.Priority; d.SetReason("getting piece with priority : " + c.currPiece.Priority);
            }
            //that's a bad decision and even more, an unaceptable move since its our own piece, dont even listen to this
            else if (c.currPiece != null)
            {
                continue;
            }


            //create a simulation that we will simulate later on
            Simulation s = new Simulation(board[x, y], c);

            //i am already in echec

            if (isThreatened != null)
            {
                //simulate, so we can check if i can find some good situations
                //this move can send me out of echec, we should consider it
                if (PieceEchec(board, s) == null)
                {
                    d.value += chess.Priority; d.SetReason("getting out of echec add : " + chess.Priority); Debug.Log(chess.ToString() + " not getting out of echec ??" + d.value);
                }
                //this move cant get me ouf of echec, we delete some priority to it, but it might be usefull on a certain sutaiton
                else
                {
                    d.value -= chess.Priority; d.SetReason("cant get out, del : " + chess.Priority);
                }
            }
            else
            {
                //i was not in an echec move but im going into it? remove some value to this move
                if (PieceEchec(board, s) != null)
                {
                    d.value -= chess.Priority; d.SetReason("going in echec intentionnaly del : " + chess.Priority);
                }
            }

            //get all of the move that come from our team after the simulation
            List <Case> moves   = GetListOfPossibleMove(chess.color);
            bool        covered = false;

            foreach (Case cover in moves)
            {
                if (cover == c)
                {
                    covered = true;
                }
            }
            // calculate how many moves we opened up by doing this (because it means we have more possible movements out of this
            int difference = (moves.Count - initialsMoves) / 2;
            d.value += difference; d.SetReason("add some cases to play" + difference);

            if (StaticClass.m_sTools.GetPossibleMove(!chess.color) <= 0)
            {
                d.value += 1000; d.SetReason("put ennemy in mat");
            }


            //now found out if we can put ennemy pieces in echec out of this move
            List <Case> SimulatedMove = chess.GetPossibleMovement(m_sCase.setupBoard.board, false);

            foreach (Case simulatedCase in SimulatedMove)
            {
                EchecThreat simulatedThreat = PieceEchec(board, simulatedCase.currPiece);
                if (simulatedCase.currPiece != null && simulatedCase.currPiece.color != chess.color)
                {
                    //we can actually put a piece in echec out of this, that's pretty good, even more if we are covered by another piece
                    d.value += simulatedCase.currPiece.Priority / (covered == true ? 2 : 10);
                    d.SetReason("put an piece in echec : " + (simulatedCase.currPiece.Priority / (covered == true ? 2 : 10)));
                }

                //if we can cover an ally piece that is in echec do it
                else if (simulatedCase.currPiece != null && simulatedThreat != null)
                {
                    d.value += simulatedCase.currPiece.Priority / 2;
                    d.SetReason("helped a piece in echec : " + simulatedCase.currPiece.Priority / 2);
                }
            }

            s.Delete();
            underDecs.Add(d);
        }

        underDecision bestUdec = null;

        foreach (underDecision d in underDecs)
        {
            if (bestUdec == null)
            {
                bestUdec = d;
            }
            else if (bestUdec.value < d.value)
            {
                bestUdec = d;
            }
            else if (bestUdec.value == d.value)
            {
                if (Random.Range(0, 2) == 1)
                {
                    bestUdec = d;
                }
            }
        }

        return(new Decision(bestUdec, chess));
    }