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); }
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); }
/// <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); }
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); }
/// <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>(); }
/// <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); }
/// <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; }
/// <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]); }
/// <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); }
/// <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; } } } } }
/// <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; }
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); }
/// <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); }
/// <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); }
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; } }
/// <summary> /// 役分析機能のリストを組み立てます。 /// </summary> /// <returns>役分析機能のリスト</returns> private static List <IYakuAnalyzable> BuildYakuAnalyzers() { var analyzers = new List <IYakuAnalyzable>(); analyzers.Add(DiProvider.GetContainer().GetInstance <AnalyzeAllSimplesReceiver>()); return(analyzers); }
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); }
/// <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); }
/// <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); }
public IActionResult Post([FromBody] UpdateConnectionIdRequest request) { request.Attach(); var response = DiProvider.GetContainer().GetInstance <UpdateConnectionIdReceiver>().Receive(request); response.Detach(request.RoomKey); return(Ok(response)); }
/// <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); }
/// <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); }
/// <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); }
/// <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()); }
/// <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); }
/// <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())); }
/// <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]); }
/// <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); }
/// <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); }
/// <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); }