public void 全部消しで削除可能性スライムの分析結果が正しく得られる() { // 001:削除対象有り var param = new ErasedPotentialSlimeAnalyzer.Param(); param.TargetSlime = Slime.Red; var context = TestHelper.Receiver.Receive("../../resources/analyzers/erasedpotentialslimeanalyzer/test-field-in-001-001.txt"); var actual = this.Analyzer.Analyze(context, context.OperationPlayer, param); Assert.AreEqual(9, actual); // 002:削除対象無し param = new ErasedPotentialSlimeAnalyzer.Param(); param.TargetSlime = Slime.Red; context = TestHelper.Receiver.Receive("../../resources/analyzers/erasedpotentialslimeanalyzer/test-field-in-001-002.txt"); actual = this.Analyzer.Analyze(context, context.OperationPlayer, param); Assert.AreEqual(0, actual); }
/// <summary> /// フィールドの特徴を生成します。 /// </summary> /// <param name="context"></param> /// <returns>フィールドの特徴</returns> public SparseVector <double> GetNext(FieldContext context) { var vector = new SparseVector <double>(0.0d); var param = new ErasedPotentialSlimeAnalyzer.Param(); param.ErasedSlimes = context.UsingSlimes; var players = new[] { Player.Index.First, Player.Index.Second }; foreach (var player in players) { if (!this.OwnConfig.BothPlayer && player != context.OperationPlayer) { continue; } var erasedPotentialCount = 0; var slimeCount = 0; foreach (var slime in context.UsingSlimes) { param.TargetSlime = slime; if (this.OwnConfig.TargetFeatue[Feature.ErasedPotentialCount]) { // 他の色を消すと消える個数 erasedPotentialCount += ErasedPotentialSlimeAnalyzer.Analyze(context, player, param); } if (this.OwnConfig.TargetFeatue[Feature.SlimeCount]) { // フィールドのスライム数 slimeCount += SlimeCountHelper.GetSlimeCount(context, player, slime); } } if (this.OwnConfig.TargetFeatue[Feature.ErasedPotentialCount]) { vector.Add(erasedPotentialCount); } if (this.OwnConfig.TargetFeatue[Feature.SlimeCount]) { vector.Add(slimeCount); } if (this.OwnConfig.TargetFeatue[Feature.ObstructionCount]) { // フィールドのおじゃまスライム数 var obstructionCount = SlimeCountHelper.GetSlimeCount(context, player, Slime.Obstruction); vector.Add(obstructionCount); } if (this.OwnConfig.TargetFeatue[Feature.NoticeObstruction]) { // 予告おじゃまスライム数 var noticeObstruction = ObstructionSlimeHelper.ObstructionsToCount(context.ObstructionSlimes[(int)player]); vector.Add(noticeObstruction); } if (this.OwnConfig.TargetFeatue[Feature.HeightDiff]) { // 高低差 var hDiff = DifferenceHeightAnalyzer.Analyze(context, player); vector.Add(hDiff); } if (this.OwnConfig.TargetFeatue[Feature.UpperCount]) { // 上部スライム数 var upperCount = 0; foreach (var u in UpperUnits) { foreach (var i in UpperIndexes) { upperCount += FieldContextHelper.ExistsSlime(context, player, FieldContextConfig.MaxHiddenUnitIndex + u, i) ? 1 : 0; } } vector.Add(upperCount); } if (this.OwnConfig.TargetFeatue[Feature.DangerCount]) { // 左から3番目のスライム数 var dangerCount = 0; foreach (var u in DangerUnits) { foreach (var i in DangerIndexes) { dangerCount += FieldContextHelper.ExistsSlime(context, player, FieldContextConfig.MaxHiddenUnitIndex + u, i) ? 1 : 0; } } vector.Add(dangerCount); } if (this.OwnConfig.TargetFeatue[Feature.Chain]) { // 起こりうる最大連鎖数 var chain = 0; if (player == context.OperationPlayer) { chain = this.ChainAnalyzer.Analyze(context, player); } vector.Add(chain); } } ; return(vector); }