コード例 #1
0
        /// <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);
        }
コード例 #2
0
ファイル: Board.cs プロジェクト: AustinJGreen/MarbleBoardGame
        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);
        }
コード例 #3
0
        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);
        }
コード例 #4
0
        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);
        }