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