Exemplo n.º 1
0
 public void MiniMax()
 {
     FirstPlayer = -1;
     // FirstPlayer = -1;
     var s = new State(FirstPlayer);
     for (int i = 0; i < 9; i++)
     {
         Console.WriteLine(s.CreateScreen());
         Console.WriteLine("Turn = {0}", s.NextPlayer == 1 ? '<' : '>');
         int bestCard, bestY, bestX;
         if (i % 2 == 0)
         {
             SearchCount = 0;
             int score = alphaBeta(s, 9, int.MinValue, int.MaxValue, out bestCard, out bestY, out bestX);
             Console.WriteLine("score = {0}, search = {1}", score, SearchCount);
         }
         else
         {
             randomNextState(s);
             bestCard = MoveCard;
             bestY = MoveY;
             bestX = MoveX;
         }
         s = s.SetCardCopy(bestY, bestX, bestCard);
         Rule.Apply(s, bestY, bestX);
         s.FlipTurn();
     }
     Console.WriteLine(s.CreateScreen());
 }
Exemplo n.º 2
0
 private State randomNextState(State state)
 {
     bool[] used;
     if (state.NextPlayer == 1) used = state.MyUsed;
     else used = state.EnUsed;
     var ret = new List<Func<State>>();
     for (int card = 0; card < 5; card++)
     {
         if (used[card]) continue;
         for (int y = 0; y < 3; y++)
         {
             for (int x = 0; x < 3; x++)
             {
                 if (state.StagePlayer[y, x] != 0) continue;
                 var next = state.SetCardCopy(y, x, card);
                 Rule.Apply(next, y, x);
                 next.FlipTurn();
                 int tmpCard = card;
                 int tmpY = y;
                 int tmpX = x;
                 ret.Add(() =>
                 {
                     MoveCard = tmpCard;
                     MoveY = tmpY;
                     MoveX = tmpX;
                     return next;
                 });
             }
         }
     }
     return ret[rnd.Next(ret.Count)]();
 }
Exemplo n.º 3
0
 private IEnumerable<State> nextState(State state)
 {
     bool[] used;
     if (state.NextPlayer == 1) used = state.MyUsed;
     else used = state.EnUsed;
     for (int card = 0; card < 5; card++)
     {
         if (used[card]) continue;
         for (int y = 0; y < 3; y++)
         {
             for (int x = 0; x < 3; x++)
             {
                 if (state.StagePlayer[y, x] != 0) continue;
                 var next = state.SetCardCopy(y, x, card);
                 Rule.Apply(next, y, x);
                 next.FlipTurn();
                 MoveCard = card;
                 MoveY = y;
                 MoveX = x;
                 yield return next;
             }
         }
     }
 }