示例#1
0
    private void Normalization(ref List <PossibleCourse> course)
    {
        float sum = 0;

        for (int i = 0; i < course.Count; i++)
        {
            sum += course[i].possible;
        }

        for (int i = 0; i < course.Count; i++)
        {
            PossibleCourse posC = course[i];
            posC.possible /= sum;
            course[i]      = posC;
        }
    }
示例#2
0
    private List <PossibleCourse> ReturnCourse(Board board, string color)
    {
        List <PossibleCourse> course     = new List <PossibleCourse>();
        List <Position>       listFigure = board.ListCoordinatesFigures(color);

        for (int i = 0; i < listFigure.Count; i++)
        {
            List <Position> move = board.ListCoordinatesMoves(listFigure[i]);
            for (int j = 0; j < move.Count; j++)
            {
                PossibleCourse buf = new PossibleCourse();
                buf.position    = listFigure[i];
                buf.newPosition = move[j];
                buf.possible    = 0.0f;
                course.Add(buf);
            }
        }
        return(course);
    }
示例#3
0
    private void Calculation(Board board, ref Position positionFigure, ref Position newPosition, ref float possible, int amount)
    {
        if (board.findKing(myColor) == null)
        {
            possible = -1;
            return;
        }
        if (board.findKing(colorEnemy) == null)
        {
            possible = 1;
            return;
        }

        List <PossibleCourse> course = ReturnCourse(board, myColor);

        for (int i = 0; i < course.Count; i++)
        {
            PossibleCourse buf = course[i];

            buf.possible = p.Probability(board, course[i].position, course[i].newPosition);

            /*string bufName = "";
             * string bufColor = "";
             * if (board.AreFigure(course[i].newPosition, ref bufName, ref bufColor))
             * {
             * if (bufName == "King")
             *     buf.possible += 0.6f;
             * else
             *     buf.possible += 0.4f;
             * }
             * else
             * buf.possible += 0.2f;*/
            course[i] = buf;
        }

        if (amount > 1)
        {
            if (board.findKing(colorEnemy) == null)
            {
                possible = 1;
                return;
            }

            for (int i = 0; i < course.Count; i++)
            {
                Board board1 = new Board(board);
                board1.Move(course[i].position, course[i].newPosition);
                if (board.findKing(colorEnemy) == null)
                {
                    possible = 1;
                    return;
                }
                List <PossibleCourse> courseEnemy = ReturnCourse(board1, colorEnemy);
                for (int j = 0; j < courseEnemy.Count; j++)
                {
                    Board board2 = new Board(board1);
                    board2.Move(courseEnemy[j].position, courseEnemy[j].newPosition);
                    //
                    Position p    = new Position();
                    Position newP = new Position();
                    float    pos  = 0;
                    //
                    if (board.findKing(myColor) != null)
                    {
                        Calculation(board2, ref p, ref newP, ref pos, amount - 1);
                    }
                    else
                    {
                        pos = -1;
                    }
                    PossibleCourse pc1 = new PossibleCourse();
                    pc1.position    = courseEnemy[j].position;
                    pc1.newPosition = courseEnemy[j].newPosition;
                    pc1.possible    = pos;
                    courseEnemy[j]  = pc1;
                }
                //Normalization(ref courseEnemy);
                if (courseEnemy.Count != 0)
                {
                    courseEnemy.Sort((a, b) => a.possible.CompareTo(b.possible));

                    List <PossibleCourse> rezult = new List <PossibleCourse>();
                    rezult.Add(courseEnemy[courseEnemy.Count - 1]);
                    for (int j = courseEnemy.Count - 2; j >= 0; j--)
                    {
                        if (course[i].possible == courseEnemy[courseEnemy.Count - 1].possible)
                        {
                            rezult.Add(course[i]);
                        }
                        else
                        {
                            break;
                        }
                    }

                    Random r = new Random();

                    PossibleCourse pc = course[i];
                    pc.possible += rezult[r.Next(0, rezult.Count)].possible;
                    course[i]    = pc;
                }
            }
        }
        // Normalization(ref course);
        if (amount == amountIterations)
        {
            ReturnFigure(course, ref positionFigure, ref newPosition);
        }
    }