예제 #1
0
 public MyInput(Coup coup, Deplacement deplacement)
 {
     this.coup        = coup;
     this.deplacement = deplacement;
     this.id          = 0;
     SetId();
 }
예제 #2
0
 public void AddCoup(Coup coup)
 {
     timeSinceLastUpdate = 0;
     actualCombo.Add(coup);
     if (coup != Coup.LightPass && coup != Coup.HeavyPass)
     {
         ResetCombo();
     }
     else
     {
         UpdateCombo();
     }
 }
예제 #3
0
 public void Reset()
 {
     this.coup        = Coup.NOTHING;
     this.deplacement = Deplacement.NOTHING;
     SetId();
 }
예제 #4
0
 public void SetCoup(Coup coup)
 {
     this.coup = coup;
     SetId();
 }
예제 #5
0
파일: Main.cs 프로젝트: lpeter68/codinggame
    /// <summary>
    ///
    /// </summary>
    /// <param name="plateau"></param>
    /// <param name="joueurs"> la liste des joueurs dans l'ordre du tour en commencant par moi</param>
    /// <param name="profondeur"></param>
    /// <param name="profondeurMax"></param>
    /// <returns></returns>
    public static MinMaxTrace MinMax(Plateau plateau, int profondeur, int profondeurMax, int alpha, int beta, out Coup meilleurCoup, out int result)
    {
        int currentJoueurIndex = profondeur % plateau.Joueurs.Count(); //id du joueurs de la liste dont c'est le tour (0 c'est moi)
        var trace = new MinMaxTrace(profondeur, currentJoueurIndex == 0, profondeur != profondeurMax);

        if (profondeur < profondeurMax)
        {
            List <Coup> coups = new List <Coup>();
            coups.Add(new Coup(Direction.DROITE));
            coups.Add(new Coup(Direction.GAUCHE));
            coups.Add(new Coup(Direction.HAUT));
            coups.Add(new Coup(Direction.BAS));

            // pour tout les murs
            if (plateau.Joueurs[currentJoueurIndex].MurRestant > 0)
            {
                foreach (var mur in Player.AvailableMur)
                {
                    coups.Add(new Coup(mur));
                }
            }

            int  bestEval = currentJoueurIndex == 0 ? int.MinValue : int.MaxValue;
            Coup bestCoup = null;
            foreach (var coup in coups)
            {
                //Console.Error.WriteLine(profondeur + " " + coup.ToString());
                if (coup.Mur != null)
                {
                    var mur = coup.Mur;
                    if (plateau.AddMur(mur))
                    {
                        try
                        {
                            int eval;
                            trace.Childrens.Add(MinMax(plateau, profondeur + 1, profondeurMax, alpha, beta, out meilleurCoup, out eval));
                            //Console.Error.WriteLine("eval " + eval);
                            if (currentJoueurIndex == 0 && eval > bestEval) //MAX
                            {
                                bestEval = eval;
                                bestCoup = coup;
                                alpha    = Math.Max(alpha, bestEval);
                                if (beta <= bestEval)
                                {
                                    meilleurCoup = bestCoup;
                                    result       = bestEval;
                                    return(trace);
                                }
                            }
                            else if (currentJoueurIndex != 0 && eval < bestEval) //MIN
                            {
                                bestEval = eval;
                                bestCoup = coup;
                                beta     = Math.Min(alpha, bestEval);
                                if (bestEval <= alpha)
                                {
                                    meilleurCoup = bestCoup;
                                    result       = bestEval;
                                    return(trace);
                                }
                            }
                        }
                        catch (NoPathException)
                        {
                            Console.Error.WriteLine("invalid no issue " + coup.Mur + " " + coup.Dir);
                        }
                        finally
                        {
                            plateau.RemoveMur(mur);
                        }
                    }
                    else if (profondeur == 0 && AvailableMur.Contains(mur))
                    {
                        AvailableMur.Remove(mur);
                    }
                }
                else
                {
                    Direction direction = (Direction)coup.Dir;
                    var       oldPos    = plateau.Joueurs[currentJoueurIndex].Pos;
                    var       newPos    = oldPos.GetPositionInDirection(direction);
                    var       test      = plateau.GetCase(oldPos).Voisines.Contains(plateau.GetCase(newPos));
                    if (newPos != null && test)
                    {
                        try
                        {
                            plateau.Joueurs[currentJoueurIndex].Pos = newPos;
                            int eval;
                            trace.Childrens.Add(MinMax(plateau, profondeur + 1, profondeurMax, beta, alpha, out meilleurCoup, out eval));
                            //Console.Error.WriteLine("eval " + eval);
                            if (currentJoueurIndex == 0 && eval > bestEval) //MAX
                            {
                                bestEval = eval;
                                bestCoup = coup;
                                alpha    = Math.Max(alpha, bestEval);
                                if (beta <= bestEval) //coupe beta
                                {
                                    meilleurCoup = bestCoup;
                                    result       = bestEval;
                                    return(trace);
                                }
                            }
                            else if (currentJoueurIndex != 0 && eval < bestEval) //MIN
                            {
                                bestEval = eval;
                                bestCoup = coup;
                                beta     = Math.Min(beta, bestEval);
                                if (bestEval <= alpha)  //coupe alpha
                                {
                                    meilleurCoup = bestCoup;
                                    result       = bestEval;
                                    return(trace);
                                }
                            }
                        }
                        catch (Exception e)
                        {
                            Console.Error.WriteLine("invalid no issue " + coup.Mur + " " + coup.Dir);
                        }
                        finally
                        {
                            plateau.Joueurs[currentJoueurIndex].Pos = oldPos;
                        }
                    }
                }
            }
            meilleurCoup = bestCoup;
            trace.Choix  = bestCoup;
            trace.Eval   = bestEval;
            result       = bestEval;
            return(trace);
        }
        else
        {
            meilleurCoup = null;
            var eval = plateau.Evaluation();
            trace.Max  = null;
            trace.Eval = eval;
            result     = eval;
            return(trace);
        }
    }