コード例 #1
0
        public void 親があがって場の更新ができる()
        {
            var request = DiProvider.GetContainer().GetInstance <UpdateGameProgressRequest>();
            var room    = DiProvider.GetContainer().GetInstance <Room>();

            room.Round      = Wind.Index.East;
            room.Parent     = Wind.Index.East;
            room.GameCount  = 2;
            room.HomeCount  = 2;
            room.DrawCount  = 10;
            room.Turn       = Wind.Index.East;
            room.State      = RoomState.Dealted;
            request.Room    = room;
            request.WinWind = Wind.Index.East;
            var expected = DiProvider.GetContainer().GetInstance <Room>();

            expected.Round     = Wind.Index.East;
            expected.Parent    = Wind.Index.East;
            expected.GameCount = 2;
            expected.HomeCount = 3;
            expected.DrawCount = 0;
            expected.Turn      = Wind.Index.East;
            expected.State     = RoomState.SingleGameFinish;
            var actual = this.Target.Receive(request).Room;

            Assert.AreEqual(expected, actual);
        }
コード例 #2
0
        public void 親以外があがって荘が終わる()
        {
            var context = this.LoadFieldContext(1, 1, ResourceType.In);

            var request = DiProvider.GetContainer().GetInstance <UpdateGameProgressRequest>();
            var room    = DiProvider.GetContainer().GetInstance <Room>();

            room.Round      = Wind.Index.South;
            room.Parent     = Wind.Index.North;
            room.GameCount  = 4;
            room.HomeCount  = 0;
            room.DrawCount  = 30;
            room.Turn       = Wind.Index.East;
            room.State      = RoomState.Dealted;
            room.Context    = context;
            request.Room    = room;
            request.WinWind = Wind.Index.East;
            var expected = DiProvider.GetContainer().GetInstance <Room>();

            expected.Round     = Wind.Index.South;
            expected.Parent    = Wind.Index.East;
            expected.GameCount = 4;
            expected.HomeCount = 0;
            expected.DrawCount = 0;
            expected.Turn      = Wind.Index.East;
            expected.State     = RoomState.AllGameFinish;
            var actual = this.Target.Receive(request).Room;

            Assert.AreEqual(expected, actual);
        }
コード例 #3
0
        /// <summary>
        /// 平和(ピンフ)分析要求の受信処理を実行します。
        /// </summary>
        /// <returns>平和(ピンフ)分析応答</returns>
        /// <param name="request">平和(ピンフ)分析要求</param>
        public AnalyzeYakuResponse Receive(AnalyzeYakuRequest request)
        {
            var response = DiProvider.GetContainer().GetInstance <AnalyzeYakuResponse>();
            var room     = request.Room;

            response.Yaku = Yaku.AllSequenceHand;
            var context = request.WinHandsContext;

            // 4面子が順子(連番で揃えた面子)
            if (!(context.Chows.Count() >= 4 && context.PungsAndKongs.Count() <= 0))
            {
                return(response);
            }

            // 頭は役牌(三元牌、場風牌、自風牌)以外
            var windKind = context.Head.GetKind();

            if (Tile.IsDragons(context.Head) ||
                EqualsWind(windKind, room.Round) ||
                EqualsWind(windKind, request.WinWind))
            {
                return(response);
            }

            // 和了牌の待ち方は両面待ち
            var win         = request.WinTile;
            var isBothSides = context.Chows.Any(chow => chow.GetKind() == win.GetKind() && (chow.GetNumber() + 1) == win.GetNumber());

            if (!isBothSides)
            {
                return(response);
            }
            response.HasCompleted = true;
            return(response);
        }
コード例 #4
0
ファイル: DiscardReceiverTest.cs プロジェクト: tknemuru/Lyman
        public void 捨牌ができる()
        {
            // 001:東/ツモ牌
            var request = DiProvider.GetContainer().GetInstance <DiscardRequest>();

            request.Context = this.LoadFieldContext(1, 1, ResourceType.In);
            request.Wind    = Wind.Index.East;
            request.Tile    = Tile.BuildTile("1萬");
            var expected = DiProvider.GetContainer().GetInstance <DiscardResponse>();

            expected.Wind    = Wind.Index.East;
            expected.Tile    = Tile.BuildTile("1萬");
            expected.Context = this.LoadFieldContext(1, 1, ResourceType.Out);
            var actual = this.Target.Receive(request);

            this.AssertAreEqual(expected, actual);

            // 002:北/非ツモ牌
            request          = DiProvider.GetContainer().GetInstance <DiscardRequest>();
            request.Context  = this.LoadFieldContext(1, 2, ResourceType.In);
            request.Wind     = Wind.Index.North;
            request.Tile     = Tile.BuildTile("発");
            expected         = DiProvider.GetContainer().GetInstance <DiscardResponse>();
            expected.Wind    = Wind.Index.North;
            expected.Tile    = Tile.BuildTile("発");
            expected.Context = this.LoadFieldContext(1, 2, ResourceType.Out);
            actual           = this.Target.Receive(request);
            this.AssertAreEqual(expected, actual);
        }
コード例 #5
0
 /// <summary>
 /// 場の状態をクリアします。
 /// </summary>
 public void ClearHomeContext()
 {
     this.DrawCount           = 0;
     this.Context             = DiProvider.GetContainer().GetInstance <FieldContext>();
     this.NextPosition        = DiProvider.GetContainer().GetInstance <WallPosition>();
     this.LastDiscardPosition = DiProvider.GetContainer().GetInstance <RiverPosition>();
 }
コード例 #6
0
        /// <summary>
        /// タンヤオ分析要求の受信処理を実行します。
        /// </summary>
        /// <returns>タンヤオ分析応答</returns>
        /// <param name="request">タンヤオ分析要求</param>
        public AnalyzeYakuResponse Receive(AnalyzeYakuRequest request)
        {
            var response = DiProvider.GetContainer().GetInstance <AnalyzeYakuResponse>();

            response.Yaku = Yaku.AllSimples;
            var context = request.WinHandsContext;

            // 雀頭
            if (!IsAllSimpleRange(context.Head.GetNumber()))
            {
                return(response);
            }
            // 順子(シュンツ)
            if (context.Chows.Count() > 0)
            {
                var isValidChows = context.Chows
                                   .All(t => IsAllSimpleRangeForChows(t.GetNumber()));
                if (!isValidChows)
                {
                    return(response);
                }
            }
            // 刻子(コーツ)と槓子(カンツ)
            if (context.PungsAndKongs.Count() > 0)
            {
                var isValidPungs = context.PungsAndKongs
                                   .All(t => IsAllSimpleRange(t.GetNumber()));
                if (!isValidPungs)
                {
                    return(response);
                }
            }
            response.HasCompleted = true;
            return(response);
        }
コード例 #7
0
 /// <summary>
 /// 依存関係がある機能を注入します。
 /// </summary>
 /// <param name="config">設定情報</param>
 public void Inject(Config config)
 {
     this.MyConfig = config;
     this.Game     = DiProvider.GetContainer().GetInstance <Game>();
     this.Game.Inject(config.UsingSlime);
     this.HasInjected = true;
 }
コード例 #8
0
        /// <summary>
        /// 一手を完全に読みきる探索を実行します。
        /// </summary>
        /// <param name="context">フィールド状態</param>
        /// <returns>最善手</returns>
        public IEnumerable <Direction> Search(FieldContext context)
        {
            Debug.Assert(this.HasInjected, "依存性の注入が完了していません");
#if DEBUG
            for (var i = 0; i < context.UsingSlimes.Length; i++)
            {
                Debug.Assert(context.UsingSlimes[i] == this.MyConfig.UsingSlime[i], "使用スライムが不正です");
            }
#endif
            var valueDic = new Dictionary <int, double>();
            var index    = 0;

            // 全移動パターンを取得
            var allPatterns = CompleteReadingHelper.GetAllMovePatterns().ToArray();

            foreach (var patterns in allPatterns)
            {
                // 移動実施
                var _context = this.Update(context, patterns);

                // 評価実施
                valueDic.Add(index, DiProvider.GetContainer().GetInstance <EvalProvider>().
                             GetEval(this.MyConfig.Version, _context));
                index++;
            }

            return(context.OperationPlayer == Player.Index.First ?
                   allPatterns[valueDic.OrderByDescending(kv => kv.Value).First().Key]
                : allPatterns[valueDic.OrderBy(kv => kv.Value).First().Key]);
        }
コード例 #9
0
ファイル: InputDataProvider.cs プロジェクト: tknemuru/Hermann
        /// <summary>
        /// ベクトル生成機能群を組み立てます。
        /// </summary>
        /// <returns>ベクトル生成機能群</returns>
        private Dictionary <AiPlayer.Version, IEnumerable <IGeneratable <FieldContext, SparseVector <double> > > > BuildVectorGens()
        {
            var gens = new Dictionary <AiPlayer.Version, IEnumerable <IGeneratable <FieldContext, SparseVector <double> > > >();

            // V1.0
            var patternGen    = DiProvider.GetContainer().GetInstance <PatternGenerator>();
            var patternConfig = DiProvider.GetContainer().GetInstance <PatternGenerator.Config>();

            patternConfig.Patterns = new[] {
                DiProvider.GetContainer().GetInstance <PatternProvider>().Get(Pattern.FloatFarLeft),
                DiProvider.GetContainer().GetInstance <PatternProvider>().Get(Pattern.FloatLeft),
                DiProvider.GetContainer().GetInstance <PatternProvider>().Get(Pattern.InterposeLowerLeft),
                DiProvider.GetContainer().GetInstance <PatternProvider>().Get(Pattern.StairsOneLeft),
                DiProvider.GetContainer().GetInstance <PatternProvider>().Get(Pattern.StairsTwoLeft),
            };
            patternGen.Inject(patternConfig);
            var featureGen    = DiProvider.GetContainer().GetInstance <FieldFeatureGenerator>();
            var featureConfig = DiProvider.GetContainer().GetInstance <FieldFeatureGenerator.Config>();

            featureConfig.TargetFeatue[FieldFeatureGenerator.Feature.NoticeObstruction] = true;
            featureGen.Injection(featureConfig);
            gens.Add(AiPlayer.Version.V1_0, new IGeneratable <FieldContext, SparseVector <double> >[] {
                patternGen,
                featureGen
            });

            // V2.0
            patternGen             = DiProvider.GetContainer().GetInstance <PatternGenerator>();
            patternConfig          = DiProvider.GetContainer().GetInstance <PatternGenerator.Config>();
            patternConfig.Patterns = new[] {
                DiProvider.GetContainer().GetInstance <PatternProvider>().Get(Pattern.FloatFarLeft),
                //AiDiProvider.GetContainer().GetInstance<PatternProvider>().Get(Pattern.FloatFarRight),
                DiProvider.GetContainer().GetInstance <PatternProvider>().Get(Pattern.FloatLeft),
                //AiDiProvider.GetContainer().GetInstance<PatternProvider>().Get(Pattern.FloatRight),
                DiProvider.GetContainer().GetInstance <PatternProvider>().Get(Pattern.InterposeLowerLeft),
                //AiDiProvider.GetContainer().GetInstance<PatternProvider>().Get(Pattern.InterposeLowerRight),
                //AiDiProvider.GetContainer().GetInstance<PatternProvider>().Get(Pattern.InterposeUpperLeft),
                //AiDiProvider.GetContainer().GetInstance<PatternProvider>().Get(Pattern.InterposeUpperRight),
                DiProvider.GetContainer().GetInstance <PatternProvider>().Get(Pattern.StairsOneLeft),
                //AiDiProvider.GetContainer().GetInstance<PatternProvider>().Get(Pattern.StairsOneRight),
                DiProvider.GetContainer().GetInstance <PatternProvider>().Get(Pattern.StairsTwoLeft),
                //AiDiProvider.GetContainer().GetInstance<PatternProvider>().Get(Pattern.StairsTwoRight),
            };
            //patternConfig.SparseValue = -1.0d;
            patternConfig.BothPlayer = false;
            //patternConfig.ContainsObstructionSlime = false;
            patternGen.Inject(patternConfig);
            featureGen    = DiProvider.GetContainer().GetInstance <FieldFeatureGenerator>();
            featureConfig = DiProvider.GetContainer().GetInstance <FieldFeatureGenerator.Config>();
            featureConfig.TargetFeatue[FieldFeatureGenerator.Feature.NoticeObstruction] = true;
            featureConfig.TargetFeatue[FieldFeatureGenerator.Feature.Chain]             = true;
            //featureConfig.TargetFeatue[FieldFeatureGenerator.Feature.ErasedPotentialCount] = true;
            featureConfig.BothPlayer = false;
            featureGen.Injection(featureConfig);
            gens.Add(AiPlayer.Version.V2_0, new IGeneratable <FieldContext, SparseVector <double> >[] {
                patternGen,
                featureGen
            });
            return(gens);
        }
コード例 #10
0
ファイル: PatternGenerator.cs プロジェクト: tknemuru/Hermann
        /// <summary>
        /// パターンの出現回数を辞書に追加します。
        /// </summary>
        /// <param name="fields">フィールドのスライム配置状態</param>
        /// <param name="pattern">パターン</param>
        /// <param name="maxIndex">インデックスの最大値</param>
        /// <param name="dic">パターン出現回数記録辞書</param>
        private void AddPatternCount(uint[] fields, PatternDefinition pattern, int maxIndex, Dictionary <int, double> dic)
        {
            // 1行ずつずらしたユニットを作成
            var mergedField = DiProvider.GetContainer().GetInstance <MergedFieldsGenerator>().GetNext(fields);

            foreach (var field in mergedField)
            {
                for (var w = 0; w <= FieldContextConfig.VerticalLineLength - pattern.Width; w++)
                {
                    for (var h = 0; h <= FieldContextConfig.FieldUnitLineCount - pattern.Height; h++)
                    {
                        var shiftedPattern = ((pattern.PatternDigit >> (1 * w)) << (FieldContextConfig.OneLineBitCount * h));
                        var key            = ((field & shiftedPattern) >> (FieldContextConfig.OneLineBitCount * h)) << (1 * w);
                        var index          = pattern.GetIndex(key);

                        index += maxIndex;
                        if (dic.ContainsKey(index))
                        {
                            dic[index]++;
                        }
                        else
                        {
                            dic[index] = 1d;
                        }
                    }
                }
            }
        }
コード例 #11
0
 /// <summary>
 /// 依存する情報を注入します。
 /// </summary>
 /// <param name="usingSlimes">Using slimes.</param>
 public void Inject(Slime[] usingSlimes)
 {
     this.UsingSlimes = usingSlimes;
     this.Game        = DiProvider.GetContainer().GetInstance <Game>();
     this.Game.Inject(usingSlimes);
     this.HasInjected = true;
 }
コード例 #12
0
        public void 部屋の状態を入室中に更新できる()
        {
            // 001:0人
            var request = DiProvider.GetContainer().GetInstance <UpdateRoomStatusRequest>();
            var room    = DiProvider.GetContainer().GetInstance <Room>();

            request.Room = room;
            var expected = DiProvider.GetContainer().GetInstance <Room>();

            expected.State = RoomState.Entering;
            var actual = this.Target.Receive(request).Room;

            Assert.AreEqual(expected.State, actual.State);

            // 001:3人
            request = DiProvider.GetContainer().GetInstance <UpdateRoomStatusRequest>();
            room    = DiProvider.GetContainer().GetInstance <Room>();
            room.Players.Add(Wind.Index.East, DiProvider.GetContainer().GetInstance <Player>());
            room.Players.Add(Wind.Index.North, DiProvider.GetContainer().GetInstance <Player>());
            room.Players.Add(Wind.Index.South, DiProvider.GetContainer().GetInstance <Player>());
            request.Room   = room;
            expected       = DiProvider.GetContainer().GetInstance <Room>();
            expected.State = RoomState.Entering;
            actual         = this.Target.Receive(request).Room;
            Assert.AreEqual(expected.State, actual.State);
        }
コード例 #13
0
        /// <summary>
        /// ツモ可能性分析要求の受信処理を実行します。
        /// </summary>
        /// <returns>ロンできるかどうか</returns>
        /// <param name="request">ロン可能性分析要求</param>
        public DrawWinnableAnalyzeResponse Receive(DrawWinnableAnalyzeRequest request)
        {
            var response = DiProvider.GetContainer().GetInstance <DrawWinnableAnalyzeResponse>();

            response.YakuCandidates = new List <Yaku>();
            var hand = request.Context.Hands[request.Wind.ToInt()]
                       .Select(h => h).ToList();
            // 手牌にツモ牌を追加する
            var drawTile = request.DrawTile;

            if (drawTile == 0)
            {
                response.DrawWinnable = false;
                return(response);
            }
            hand.Add(drawTile);
            //var ableYakus = DiProvider.GetContainer().GetInstance<YakuAnalyzerProvider>()
            //    .GetYakuAnalyzers()
            //    .Select(analy => analy.Receive(hand).HasCompleted)
            //    .Where(result => result.Value)
            //    .Select(result => result.Key)
            //    .ToList();
            //response.YakuCandidates = ableYakus;
            //response.DrawWinnable = ableYakus.Count > 0;
            return(response);
        }
コード例 #14
0
ファイル: DiscardReceiver.cs プロジェクト: tknemuru/Lyman
        /// <summary>
        /// 捨牌要求の受信処理を行います。
        /// </summary>
        /// <returns>捨牌応答</returns>
        /// <param name="request">捨牌要求</param>
        public DiscardResponse Receive(DiscardRequest request)
        {
            var response = DiProvider.GetContainer().GetInstance <DiscardResponse>();
            var context  = request.Context;

            // 捨牌を河に追加
            context.Rivers[request.Wind.ToInt()].Add(request.Tile);

            // 最後の捨牌位置を記録
            var lastPosition = DiProvider.GetContainer().GetInstance <RiverPosition>();

            lastPosition.Wind  = request.Wind;
            lastPosition.Index = context.Rivers[request.Wind.ToInt()].Count() - 1;
            var room = RoomManager.GetOrDefault(request.RoomKey);

            room.LastDiscardPosition = lastPosition;

            // 手牌から牌を削除
            var index = context.Hands[request.Wind.ToInt()].LastIndexOf(request.Tile);

            context.Hands[request.Wind.ToInt()].RemoveAt(index);
            context.Hands[request.Wind.ToInt()] = Tile.Order(context.Hands[request.Wind.ToInt()]).ToList();

            response.Context = context;
            response.Wind    = request.Wind;
            response.Tile    = request.Tile;
            return(response);
        }
コード例 #15
0
        public IActionResult Post([FromBody] DrawRequest request)
        {
            try
            {
                // ツモ
                request.Attach();
                request.Position = RoomManager.Get(request.RoomKey).NextPosition;
                var response = DiProvider.GetContainer().GetInstance <DrawReceiver>().Receive(request);

                // ツモで上がれるかの判定
                var analyzeRequest = DiProvider.GetContainer().GetInstance <DrawWinnableAnalyzeRequest>();
                analyzeRequest.ShallowImport(request);
                analyzeRequest.DrawTile = response.Tile;
                analyzeRequest.Attach();
                var drawWinnableInfo = DiProvider.GetContainer().GetInstance <DrawWinnableAnalyzeReceiver>().Receive(analyzeRequest);
                response.DrawWinnableInfo = drawWinnableInfo;

                RoomManager.Get(request.RoomKey).NextPosition = response.NextPosition;
                response.Detach(request.RoomKey);

                // 通知
                this.NotifyRoomContext(request.RoomKey);

                return(Ok(response));
            }
            catch (Exception ex)
            {
                FileHelper.WriteLine(ex.ToString());
                throw ex;
            }
        }
コード例 #16
0
        /// <summary>
        /// 役分析機能のリストを組み立てます。
        /// </summary>
        /// <returns>役分析機能のリスト</returns>
        private static List <IYakuAnalyzable> BuildYakuAnalyzers()
        {
            var analyzers = new List <IYakuAnalyzable>();

            analyzers.Add(DiProvider.GetContainer().GetInstance <AnalyzeAllSimplesReceiver>());
            return(analyzers);
        }
コード例 #17
0
        public void 次の位置に移動できる()
        {
            // 001:同じ風/同じインデックス
            var actual = DiProvider.GetContainer().GetInstance <WallPosition>();

            actual.Wind  = Wind.Index.East;
            actual.Rank  = Wall.Rank.Upper;
            actual.Index = 16;
            actual.Next();
            var expected = DiProvider.GetContainer().GetInstance <WallPosition>();

            expected.Wind  = Wind.Index.East;
            expected.Rank  = Wall.Rank.Lower;
            expected.Index = 16;
            Assert.AreEqual(expected, actual);

            // 002:同じ風/異なるインデックス
            actual.Next();
            expected.Rank  = Wall.Rank.Upper;
            expected.Index = 15;
            Assert.AreEqual(expected, actual);

            // 003:異なる風
            actual.Rank  = Wall.Rank.Lower;
            actual.Index = 0;
            actual.Next();
            expected.Wind  = Wind.Index.South;
            expected.Rank  = Wall.Rank.Upper;
            expected.Index = 16;
            Assert.AreEqual(expected, actual);
        }
コード例 #18
0
        /// <summary>
        /// ロン可能性分析要求の受信処理を実行します。
        /// </summary>
        /// <returns>ロン可能性分析結果</returns>
        /// <param name="request">ロン可能性分析要求</param>
        public RonableAnalyzeResponse Receive(FieldAttachedRequest request)
        {
            var response = DiProvider.GetContainer().GetInstance <RonableAnalyzeResponse>();

            response.YakuCandidates = new List <Yaku>();
            var hand = request.Context.Hands[request.Wind.ToInt()]
                       .Select(h => h).ToList();
            // 手牌に最後の捨牌を追加する
            var room         = RoomManager.Get(request.RoomKey);
            var lastPosition = room.LastDiscardPosition;

            if (lastPosition == null)
            {
                response.Ronable = false;
                return(response);
            }
            hand.Add(request.Context.GetRiverTile(lastPosition));
            //var ableYakus = DiProvider.GetContainer().GetInstance<YakuAnalyzerProvider>()
            //    .GetYakuAnalyzers()
            //    .Select(analy => analy.Receive(hand).HasCompleted)
            //    .Where(result => result.Value)
            //    .Select(result => result.Key)
            //    .ToList();
            //response.YakuCandidates = ableYakus;
            //response.Ronable = ableYakus.Count > 0;
            return(response);
        }
コード例 #19
0
        /// <summary>
        /// プレイヤ取得要求の受信処理を実行します。
        /// </summary>
        /// <returns>プレイヤ取得要求</returns>
        /// <param name="request">プレイヤ取得応答</param>
        public SelectPlayerResponse Receive(SelectPlayerRequest request)
        {
            var room     = RoomManager.Get(request.RoomKey);
            var response = DiProvider.GetContainer().GetInstance <SelectPlayerResponse>();

            response.Players = room.Players.Select(p => p.Value.Name);
            return(response);
        }
コード例 #20
0
        public IActionResult Post([FromBody] UpdateConnectionIdRequest request)
        {
            request.Attach();
            var response = DiProvider.GetContainer().GetInstance <UpdateConnectionIdReceiver>().Receive(request);

            response.Detach(request.RoomKey);
            return(Ok(response));
        }
コード例 #21
0
        /// <summary>
        /// 点数計算要求の受信処理を実行します。
        /// </summary>
        /// <returns>点数計算応答</returns>
        /// <param name="request">点数計算要求</param>
        public CalcScoreResponse Receive(CalcScoreRequest request)
        {
            var response = DiProvider.GetContainer().GetInstance <CalcScoreResponse>();
            var room     = request.Room;

            response.Room = room;
            return(response);
        }
コード例 #22
0
ファイル: SearchRoomReceiver.cs プロジェクト: tknemuru/Lyman
        /// <summary>
        /// 部屋検索応答の応答情報を作成します。
        /// </summary>
        /// <returns>部屋検索応答の応答情報</returns>
        /// <param name="key">部屋のキー</param>
        /// <param name="name">部屋名</param>
        private static SearchRoomResponse CreateResponse(Guid key, string name)
        {
            var response = DiProvider.GetContainer().GetInstance <SearchRoomResponse>();

            response.Key  = key;
            response.Name = name;
            return(response);
        }
コード例 #23
0
        /// <summary>
        /// 起こりうる最大連鎖回数を分析します
        /// </summary>
        /// <returns>起こりうる最大連鎖回数</returns>
        /// <param name="context">フィールド状態</param>
        /// <param name="player">プレイヤ</param>
        public int Analyze(FieldContext context, Player.Index player)
        {
            int maxChain = 0;

            // 移動可能パターンを取得
            var movePatterns = CompleteReadingHelper.GetAllMovePatterns();

            // 分析対象の移動可能スライムを生成
            var usingSlimes   = context.UsingSlimes;
            var slimePatterns = new List <Slime[]>();

            slimePatterns.Add(new[] { usingSlimes[0], usingSlimes[1] });
            slimePatterns.Add(new[] { usingSlimes[2], usingSlimes[3] });

            // 自動移動機能を生成
            var updater = DiProvider.GetContainer().GetInstance <AutoMoveAndDropUpdater>();

            updater.Inject(context.UsingSlimes);

            // 各移動可能スライムの全パターンを試していく
            foreach (var slimePattern in slimePatterns)
            {
                var _context = context.DeepCopy();
                // 移動可能スライムを書き換える
                for (var movable = 0; movable < MovableSlime.Length; movable++)
                {
                    var org   = _context.MovableSlimes[player.ToInt()][(int)movable];
                    var valid = (org.Index == FieldContextConfig.MaxHiddenUnitIndex &&
                                 org.Position == FieldContextConfig.MovableSlimeInitialShiftAfterDroped + (FieldContextConfig.OneLineBitCount * (int)movable));
                    if (!valid)
                    {
                        return(0);
                    }

                    // 元の移動可能スライムを消す
                    _context.SlimeFields[player.ToInt()][org.Slime][org.Index] &= ~(1u << org.Position);

                    // 色を書き換える
                    org.Slime = slimePattern[(int)movable];
                }

                // 自動移動を実行
                foreach (var movePattern in movePatterns)
                {
                    var _movedContext = _context.DeepCopy();
                    var param         = new AutoMoveAndDropUpdater.Param()
                    {
                        Pattern = movePattern,
                    };

                    updater.Update(_movedContext, player, param);
                    maxChain = Math.Max(maxChain, param.Chain);
                }
            }

            // 試行内の最大連鎖数を返却
            return(maxChain);
        }
コード例 #24
0
ファイル: ApiDiRegister.cs プロジェクト: tknemuru/Hermann
 /// <summary>
 /// 依存性の登録を行います。
 /// </summary>
 public static void Register()
 {
     DiProvider.GetContainer().Register <NativeCommandReceiver>(() => new NativeCommandReceiver(), Lifestyle.Singleton);
     DiProvider.GetContainer().Register <SimpleTextReceiver>(() => new SimpleTextReceiver(), Lifestyle.Singleton);
     DiProvider.GetContainer().Register <SimpleTextSender>(() => new SimpleTextSender(), Lifestyle.Singleton);
     DiProvider.GetContainer().Register <NativeCommand>(() => new NativeCommand());
     DiProvider.GetContainer().Register <UiDecorationContainer>(() => new UiDecorationContainer());
     DiProvider.GetContainer().Register <UiDecorationContainerReceiver>(() => new UiDecorationContainerReceiver());
 }
コード例 #25
0
ファイル: WallPosition.cs プロジェクト: tknemuru/Lyman
        /// <summary>
        /// オブジェクトのディープコピーを行います。
        /// </summary>
        /// <returns>ディーピコピーされたオブジェクト</returns>
        public WallPosition DeepCopy()
        {
            var obj = DiProvider.GetContainer().GetInstance <WallPosition>();

            obj.Wind  = this.Wind;
            obj.Rank  = this.Rank;
            obj.Index = this.Index;
            return(obj);
        }
コード例 #26
0
        /// <summary>
        /// フィールド状態の評価を行います。
        /// </summary>
        /// <param name="context">フィールド状態</param>
        /// <returns>評価値</returns>
        public double Evaluate(FieldContext context)
        {
            Debug.Assert(this.HasInjected, "依存性の注入が完了していません");

            var input = DiProvider.GetContainer().GetInstance <InputDataProvider>().
                        GetVector(this.Version, context);

            return(this.Regression.Transform(input.ToArray()));
        }
コード例 #27
0
ファイル: RoomManager.cs プロジェクト: tknemuru/Lyman
 /// <summary>
 /// 部屋を取得します。
 /// </summary>
 /// <returns>部屋</returns>
 /// <param name="key">部屋のキー</param>
 public static Room GetOrDefault(Guid key)
 {
     if (!Rooms.ContainsKey(key))
     {
         // 存在しない場合はデフォルトの部屋を返す
         return(DiProvider.GetContainer().GetInstance <Room>());
     }
     return(Rooms[key]);
 }
コード例 #28
0
        /// <summary>
        /// コネクションID更新要求の受信処理を実行します。
        /// </summary>
        /// <returns>コネクションID更新応答</returns>
        /// <param name="request">コネクションID更新要求</param>
        public PlayerAttachedResponse Receive(UpdateConnectionIdRequest request)
        {
            var response = DiProvider.GetContainer().GetInstance <PlayerAttachedResponse>();
            var player   = request.Player;

            player.ConnectionId = request.ConnectionId;
            response.Player     = player;
            return(response);
        }
コード例 #29
0
ファイル: ReachReceiver.cs プロジェクト: tknemuru/Lyman
        /// <summary>
        /// リーチ要求の受信処理を実行します。
        /// </summary>
        /// <returns>リーチ応答</returns>
        /// <param name="request">リーチ要求</param>
        public PlayerAttachedResponse Receive(PlayerAttachedRequest request)
        {
            var response = DiProvider.GetContainer().GetInstance <PlayerAttachedResponse>();
            var player   = request.Player;

            player.Score   -= ReachChip;
            player.Reach    = true;
            response.Player = player;
            return(response);
        }
コード例 #30
0
        /// <summary>
        /// 分析を行います。
        /// </summary>
        /// <returns>分析結果</returns>
        private void Analyze(SelectRoomRequest request, SelectRoomResponse response)
        {
            var fieldAttachedRequest = DiProvider.GetContainer().GetInstance <FieldAttachedRequest>();

            fieldAttachedRequest.RoomKey   = request.RoomKey;
            fieldAttachedRequest.PlayerKey = request.PlayerKey;
            fieldAttachedRequest.Attach();
            response.ReachableInfo = DiProvider.GetContainer().GetInstance <ReachableAnalyzeReceiver>().Receive(fieldAttachedRequest);
            response.RonableInfo   = DiProvider.GetContainer().GetInstance <RonableAnalyzeReceiver>().Receive(fieldAttachedRequest);
        }