private void PlayDoubleTurn(int[] diceRes) { int movesRemain = 4; var moveArgs = new int[2]; do { GetNextMove?.Invoke(this, new MoveEventArgs(moveArgs, diceRes)); var src = moveArgs[0]; var steps = moveArgs[1]; try { PlayTurn(steps, src, ref movesRemain); if (movesRemain > 0) { Message?.Invoke(this, $"Turn number {4-movesRemain} Complete"); RefreshDisplay?.Invoke(this, null); } } catch (MissMatchException e) { Message?.Invoke(this, e.Message); RefreshDisplay?.Invoke(this, new DiceEventArgs(diceRes)); } catch (StuckException e) { Message?.Invoke(this, e.Message); movesRemain = 0; } } while (movesRemain > 0 && !IsGameOver); }
public NextMove GetNextMoveForAutomatedPlayer(GetNextMove getNextMove) { List <NextMove> results = FindMove.FindAvailableMoves(getNextMove.Board, getNextMove.Player); List <NextMove> takeMoves = results.Where(m => m.Takes != null).ToList(); Random random = new Random(); if (takeMoves.Count > 0) { return(takeMoves[random.Next(0, takeMoves.Count)]); } else if (results.Count > 0) { return(results[random.Next(0, results.Count)]); } else { return(new NextMove { CurrentHeight = -1, CurrentWidth = -1, NextHeight = -1, NextWidth = -1, }); } }
public NextMove GetNextMoveForAutomatedPlayer(GetNextMove getNextMove) { MinimaxOutcome result = minimax(getNextMove.Board, getNextMove.Depth, true); return(new NextMove { CurrentHeight = result.PotentialNextMove.CurrentHeight, CurrentWidth = result.PotentialNextMove.CurrentWidth, NextHeight = result.PotentialNextMove.NextHeight, NextWidth = result.PotentialNextMove.NextWidth, Takes = result.PotentialNextMove.Takes }); }
private void PlayRegularTurn(int[] diceRes) { var movesRemain = 2; var moveArgs = new int[2]; do { GetNextMove?.Invoke(this, new MoveEventArgs(moveArgs, diceRes)); var src = moveArgs[0]; var steps = moveArgs[1]; try { PlayTurn(steps, src, ref movesRemain); if (steps == diceRes[0]) { diceRes[0] = 0; } else { diceRes[1] = 0; } if (!(diceRes[0] == 0 && diceRes[1] == 0)) { Message?.Invoke(this, "First turn Complete"); RefreshDisplay?.Invoke(this, new DiceEventArgs(diceRes)); } } catch (MissMatchException e) { Message?.Invoke(this, e.Message); RefreshDisplay?.Invoke(this, new DiceEventArgs(diceRes)); } catch (StuckException e) { Message?.Invoke(this, e.Message); movesRemain--; if (steps == diceRes[0]) { diceRes[0] = 0; } else { diceRes[1] = 0; } } } while (movesRemain > 0 && !IsGameOver); }
public ActionResult Post(GetNextMove getNextMove) { int version = getNextMove.Version; IAutomatedPlayerService service; switch (version) { case 1: service = new AutomatedPlayerServiceV1(); break; case 2: service = new AutomatedPlayerServiceV2(); break; case 3: service = new AutomatedPlayerServiceV3(); break; default: service = null; break; } if (service == null) { return(BadRequest( new Response { Successful = false } )); } NextMove nextmove = service.GetNextMoveForAutomatedPlayer(getNextMove); return(Ok( new Response { Successful = true, NextMove = nextmove } )); }
public NextMove GetNextMoveForAutomatedPlayer(GetNextMove getNextMove) { List <NextMove> results = FindMove.FindAvailableMoves(getNextMove.Board, getNextMove.Player); List <NextMove> takeMoves = results.Where(m => m.Takes.Count > 0).ToList(); Random random = new Random(); if (takeMoves.Count > 0) { return(takeMoves[random.Next(0, takeMoves.Count)]); } else if (results.Count > 0) { return(results[random.Next(0, results.Count)]); } else { throw new Exception($"Board contains no moves for player {getNextMove.Player}"); } }
public static async Task <IActionResult> Run([HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = null)] HttpRequest req, ILogger log) { try { String requestBody = await new StreamReader(req.Body).ReadToEndAsync(); GetNextMove getNextMove = JObject.Parse(requestBody).ToObject <GetNextMove>(); Int64 version = getNextMove.Version; IAutomatedPlayerService service = version switch { 1 => new AutomatedPlayerServiceV1(), 2 => new AutomatedPlayerServiceV2(), 3 => new AutomatedPlayerServiceV3(), _ => throw new ArgumentException("No version in body of request") }; NextMove nextmove = service.GetNextMoveForAutomatedPlayer(getNextMove); return(new OkObjectResult( new AutomatedPlayerResponse { Successful = true, NextMove = nextmove } )); } catch (Exception ex) { return(new BadRequestObjectResult( new AutomatedPlayerResponse { Successful = false, ErrorMessage = ex.Message } )); } }