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()); }
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)](); }
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; } } } }