Beispiel #1
0
        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,
                });
            }
        }
Beispiel #3
0
        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
            });
        }
Beispiel #4
0
        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
            }
                       ));
        }
Beispiel #6
0
        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}");
            }
        }
Beispiel #7
0
        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
                }
                           ));
            }
        }