Exemple #1
0
        private void buttonSave_Click(object sender, EventArgs e)
        {
            StringBuilder sb = new StringBuilder();

            foreach (GameStateResignAction gsra in resigns)
            {
                sb.AppendLine(GameStateResignAction.Serialize(gsra));
            }
            File.AppendAllText("resigns.txt", sb.ToString());

            sb = new StringBuilder();

            foreach (GameStateDoubleAction gsda in doubles)
            {
                sb.AppendLine(GameStateDoubleAction.Serialize(gsda));
            }
            File.AppendAllText("doubles.txt", sb.ToString());

            sb = new StringBuilder();
            foreach (GameStateTurnAction gsta in turns)
            {
                sb.AppendLine(GameStateTurnAction.Serialize(gsta));
            }
            File.AppendAllText("turns.txt", sb.ToString());

            sb = new StringBuilder();
            foreach (GameStateMoveAction gsma in moves)
            {
                sb.AppendLine(GameStateMoveAction.Serialize(gsma));
            }
            File.AppendAllText("moves.txt", sb.ToString());
        }
Exemple #2
0
        public Form1()
        {
            List <GameStateDoubleAction> doubles = new List <GameStateDoubleAction>();
            List <GameStateTurnAction>   turns   = new List <GameStateTurnAction>();
            List <GameStateMoveAction>   moves   = new List <GameStateMoveAction>();

            foreach (string line in File.ReadAllLines("doubles.txt"))
            {
                string s = line.Replace(Environment.NewLine, "");
                GameStateDoubleAction a = (GameStateDoubleAction)GameStateDoubleAction.Deserialize(s);
                doubles.Add(a);
                Console.WriteLine(a.GameState.ToString() + " " + a.Time);
            }

            foreach (string line in File.ReadAllLines("turns.txt"))
            {
                string s = line.Replace(Environment.NewLine, "");
                GameStateTurnAction a = (GameStateTurnAction)GameStateTurnAction.Deserialize(s);
                turns.Add(a);
            }

            foreach (string line in File.ReadAllLines("moves.txt"))
            {
                string s = line.Replace(Environment.NewLine, "");
                GameStateMoveAction a = (GameStateMoveAction)GameStateMoveAction.Deserialize(s);
                moves.Add(a);
                Console.WriteLine(GameStateMoveAction.Serialize(a));
            }

            thinker = new NeuralThinker(moves, doubles, new GameStateResignAction[] { }, turns);


            InitializeComponent();

            this.MouseClick       += new MouseEventHandler(Form1_MouseClick);
            this.MouseDoubleClick += new MouseEventHandler(Form1_MouseDoubleClick);

            labelLeftName.Text  = "Player";
            labelRightName.Text = "Computer";
            labelLeftPips.Text  = "Pips: 0";
            labelRightPips.Text = "Pips: 0";

            gnubg.Initialize();

            random.Next();

            StartNew();
        }
Exemple #3
0
        private void HandleAI()
        {
            if (currentGameState.PlayerOnTurn == 1)
            {
                if (currentGameState.HasOffer)
                {
                }
                else
                {
                    if (currentGameState.DiceRolled)
                    {
                        Thread.Sleep(thinker.TimeOnDiceRolled(currentGameState));

                        List <PlayHint> hints = gnubg.PlayHint(currentGameState, 500);

                        if (hints != null)
                        {
                            TimedPlay play = thinker.TimedPlayOnRoll(currentGameState, hints, GR.Gambling.Backgammon.Venue.VenueUndoMethod.UndoLast);

                            Stack <Move> oppMadeMoves = new Stack <Move>();
                            //currentGameState.Board.MakePlay(1, hints[0].Play);
                            foreach (TimedMove move in play)
                            {
                                Thread.Sleep(move.WaitBefore);

                                if (move.IsUndo)
                                {
                                    Move m = oppMadeMoves.Pop();
                                    currentGameState.Board.UndoMove(1, m);
                                }
                                else
                                {
                                    oppMadeMoves.Push(move);
                                    currentGameState.Board.MakeMove(1, move);
                                }

                                Render();
                                this.Refresh();

                                //this.Invalidate();

                                Thread.Sleep(move.WaitAfter);
                            }
                        }

                        if (hints == null)
                        {
                            Thread.Sleep(1000);
                        }

                        Thread.Sleep(500);

                        currentGameState.ChangeTurn();
                    }
                    else
                    {
                        DoubleHint doubleHint = gnubg.DoubleHint(currentGameState);
                        Thread.Sleep(thinker.TimeOnTurnChanged(currentGameState, doubleHint, null));

                        if (currentGameState.CanDouble())
                        {
                            if (doubleHint.Action == DoubleAction.Double)
                            {
                                watch = Stopwatch.StartNew();

                                DialogResult res = MessageBox.Show("Your opponent doubles..", "Double offer", MessageBoxButtons.YesNo);

                                watch.Stop();

                                GameState gs = currentGameState.Clone();
                                gs.Double();
                                GameStateDoubleAction gsda = new GameStateDoubleAction(gs, watch.ElapsedMilliseconds, (res == DialogResult.Yes) ? DoubleResponse.Take : DoubleResponse.Pass);
                                doubles.Add(gsda);

                                textBoxLog.Text          += "Double response added " + gs.OfferType.ToString() + " " + watch.ElapsedMilliseconds + "ms." + Environment.NewLine;
                                textBoxLog.SelectionStart = textBoxLog.Text.Length;
                                textBoxLog.ScrollToCaret();

                                if (res == DialogResult.Yes)
                                {
                                    currentGameState.SetCube(currentGameState.Cube.Value * 2, 0);

                                    Render();
                                    this.Refresh();
                                }
                                else
                                {
                                    status = GameStatus.GameOver;
                                }

                                UpdateControls();

                                return;
                            }
                        }

                        if (!resignOfferMade)
                        {
                            ResignHint resignHint = gnubg.ResignHint(currentGameState, false);
                            if (resignHint.Value != ResignValue.None)
                            {
                                watch = Stopwatch.StartNew();
                                DialogResult res = MessageBox.Show("Your opponent wants to resign for " + resignHint.Value.ToString(), "Resign offer", MessageBoxButtons.YesNo);
                                watch.Stop();

                                GameState gs = currentGameState.Clone();
                                gs.Resign(resignHint.Value);
                                GameStateResignAction gsra = new GameStateResignAction(gs, watch.ElapsedMilliseconds, (res == DialogResult.Yes) ? ResignResponse.Accept : ResignResponse.Reject);
                                resigns.Add(gsra);

                                textBoxLog.Text          += "Resign response added " + gs.OfferType.ToString() + " " + watch.ElapsedMilliseconds + "ms." + Environment.NewLine;
                                textBoxLog.SelectionStart = textBoxLog.Text.Length;
                                textBoxLog.ScrollToCaret();

                                if (res == DialogResult.Yes)
                                {
                                    status = GameStatus.GameOver;

                                    Render();
                                    this.Refresh();
                                }
                                else
                                {
                                    resignOfferMade = true;
                                }

                                UpdateControls();

                                return;
                            }
                        }

                        // Roll
                        currentGameState.SetDice(random.Next(1, 7), random.Next(1, 7));
                    }
                }

                UpdateControls();
            }
        }