/// <summary> /// Checks if the roll is invalid /// </summary> /// <returns></returns> public bool IsInvalidDoubles() { if (currentRoll.IsDoubles()) { doublesCount++; if (doublesCount >= 3) { doublesCount = 0; board.RemoveFrontMarble(currentPlayer.Team); PutBackMarble(currentPlayer.Team); NextPlayer(); SetReadyForRoll(); return(true); } } return(false); }
public MoveCollection ThinkAll(Algorithm algorithm, DiceRoll roll, sbyte team, int ms, out Vector4[] scores) { MoveCollection collection = GetMoves(roll, team); if (collection.Count == 0) { scores = null; return(null); } else if (collection.Count == 1) { scores = new Vector4[1] { algorithm.Eval(this.GetPosition(), roll.IsDoubles() ? team : Board.NO_PLAYER) }; return(collection); } if (ms < 0) { throw new ArgumentException(); } PositionNode[] nodes = new PositionNode[collection.Count]; for (int i = 0; i < collection.Count; i++) { Position node = new Position(this.quadrants); PerformMove(node, collection[i]); nodes[i] = new PositionNode(node, collection[i], roll); } algorithm.Player = team; Vector4[] evaluations = new Vector4[nodes.Length]; for (int j = 0; j < nodes.Length; j++) { PositionNode currentRootMoveNode = nodes[j]; algorithm.Root = currentRootMoveNode; Vector4 moveEval = algorithm.Go(ms / collection.Count); evaluations[j] = moveEval; } SortDecreasing(evaluations, collection, team); scores = evaluations; return(collection); }
private double Iterate(Position pos, sbyte us, sbyte evaluating_team, int time) { Stopwatch sw = Stopwatch.StartNew(); double wins = 0; double losses = 0; Board board = new Board(); sbyte team = NextTeam(us); int doublesCount = 0; sbyte lastTeam = 0; int turns = 0; do { //Reset board board.SetPosition(pos); //Pick random nodes and play out game while (!board.IsGameOver()) { lastTeam = team; DiceRoll roll = board.GetRandomRoll(); MoveCollection moves = board.GetMoves(roll, team); if (moves.Count != 0) { Move m = moves[Board.Next(moves.Count)]; if (m != null) { board.PerformMove(m); } } if (roll.IsDoubles()) { doublesCount++; if (doublesCount >= 3) { board.RemoveFrontMarble(team); doublesCount = 0; team = board.NextPlayer(team); turns++; } } else { doublesCount = 0; team = board.NextPlayer(team); turns++; } } if (lastTeam == evaluating_team) { wins++; } else { losses++; } }while (sw.ElapsedMilliseconds < time); return(wins / losses); }
public static sbyte SimulateGame() { Board board = new Board(); Algorithm mpMix = new MPMix(board, 1, 0.5); Algorithm maxN = new MaxN(board); Algorithm paranoid = new Paranoid(board); Algorithm offensive = new Offensive(board); Algorithm mcts = new MCTS(board); int doublesCount = 0; sbyte lastTeam = 0; sbyte team = 0; int turns = 0; while (!board.IsGameOver()) { Console.Title = turns.ToString(); lastTeam = team; DiceRoll roll = board.GetRandomRoll(); Move m = null; switch (team) { case 0: m = board.ThinkBest(mcts, roll, team, 0); break; case 1: m = board.ThinkBest(maxN, roll, team, 0); break; case 2: m = board.ThinkBest(mcts, roll, team, 0); break; case 3: m = board.ThinkBest(mcts, roll, team, 0); break; } if (m != null) { board.PerformMove(m); } if (roll.IsDoubles()) { doublesCount++; if (doublesCount >= 3) { board.RemoveFrontMarble(team); doublesCount = 0; team = board.NextPlayer(team); turns++; } } else { doublesCount = 0; team = board.NextPlayer(team); turns++; } } Console.WriteLine("{0} won ({1} turns)", GetName(lastTeam), turns); return(lastTeam); }