Beispiel #1
0
        // -------------------------------------------------------------------------------------
        // Public Funtion
        public override IObservable <Position> MakeDicision(GameStage _stage, GameTime _gameTime)
        {
            return(Observable.Create <Position>
                   (
                       _observer =>
            {
                var gameTime = Observable
                               .Timer(TimeSpan.FromSeconds((int)_gameTime))
                               .Subscribe(_ =>
                {
                    _observer.OnNext(_stage.RandomPosition());
                    _observer.OnCompleted();
                });

                var dicision = _UIBoard
                               .OnClickBoardAsObservable()
                               .Where(_pos => _stage.CheckPosibleDecision(_pos))
                               .Subscribe(_position =>
                {
                    _observer.OnNext(_position);
                    _observer.OnCompleted();
                });

                return Disposable.Create(() =>
                {
                    gameTime?.Dispose();
                    dicision?.Dispose();
                });
            }
                   ));
        }
Beispiel #2
0
        // -------------------------------------------------------------------------------------
        // Private Funtion
        private Position FindBestSolution(GameStage _stage)
        {
            var isMinimax = _stage.Players[0] != _stage.CurrentTurn;
            var bestList  = new List <Position>();

            bestList.Add(_stage.RandomPosition());
            var bestValue = isMinimax ? MAX_VALUE : MIN_VALUE;
            var bestPos   = _stage.RandomPosition();

            for (int i = 0; i < _stage.PosiblePosition.Count; i++)
            {
                var nextStage = _stage.Clone();
                nextStage.SelectPosition(_stage.PosiblePosition[i]);
                nextStage.SetNextPlayer();

                var value = Minimax(3, 0, false, nextStage, MIN_VALUE, MAX_VALUE, _stage.CurrentTurn);
                if (isMinimax)
                {
                    if (bestValue > value)
                    {
                        bestList  = new List <Position>();
                        bestValue = value;
                        bestPos   = _stage.PosiblePosition[i];
                        bestList.Add(_stage.PosiblePosition[i]);
                    }
                    else if (bestValue == value)
                    {
                        bestList.Add(_stage.PosiblePosition[i]);
                    }
                }
                else
                {
                    if (bestValue < value)
                    {
                        bestList  = new List <Position>();
                        bestValue = value;
                        bestPos   = _stage.PosiblePosition[i];
                        bestList.Add(_stage.PosiblePosition[i]);
                    }
                    else if (bestValue == value)
                    {
                        bestList.Add(_stage.PosiblePosition[i]);
                    }
                }
            }
            return(bestList[UnityEngine.Random.Range(0, bestList.Count)]);
        }