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