public int Analyze(FieldContext context, Player.Index player) { var min = 99; var max = -99; for (var column = FieldContextConfig.OneLineBitCount - FieldContextConfig.VerticalLineLength; column < FieldContextConfig.OneLineBitCount; column++) { var exists = false; for (var unit = FieldContextConfig.MaxHiddenUnitIndex + 1; unit < FieldContextConfig.FieldUnitCount; unit++) { for (var line = 0; line < FieldContextConfig.FieldUnitLineCount; line++) { exists = FieldContextHelper.ExistsSlime(context, player, unit, column + (line * FieldContextConfig.OneLineBitCount)); if (exists) { var top = (unit - FieldContextConfig.MaxHiddenUnitIndex + 1) * FieldContextConfig.FieldUnitLineCount + line; min = Math.Min(top, min); max = Math.Max(top, max); break; } } if (exists) { break; } } } min = min == 99 ? 0 : min; max = max == -99 ? 0 : max; return(max - min); }
/// <summary> /// 結果の評価を実施します。 /// </summary> /// <returns>評価値</returns> /// <param name="param">パラメータ</param> public override double Evaluate(Param param) { var win = FieldContextHelper.GetWinPlayer(param.LastContext, param.Context); Debug.Assert(win != null, "勝敗が決まっていません"); var score = (win == Player.Index.First) ? BaseScore : BaseScore * -1; LogWriter.WirteLog($"value:{score}"); var scoreDiff = param.Context.Score[Player.Index.First.ToInt()] - param.Context.Score[Player.Index.Second.ToInt()]; LogWriter.WirteLog($"win:{win}"); LogWriter.WirteLog($"score:{param.Context.Score[Player.Index.First.ToInt()]} | {param.Context.Score[Player.Index.Second.ToInt()]}"); LogWriter.WirteLog($"scoreDiff:{scoreDiff}"); if (win == Player.Index.First && scoreDiff > 0) { score += scoreDiff * BonusRate; } else if (win == Player.Index.Second && scoreDiff < 0) { score += scoreDiff * BonusRate; } LogWriter.WirteLog($"correction value:{score}"); return(score); }
/// <summary> /// コンストラクタ /// </summary> /// <param name="pattern">パターン</param> /// <param name="patternDigit">2進数で表現されたパターン文字列のリスト</param> /// <param name="width">横幅</param> /// <param name="height">縦幅</param> public PatternDefinition(Pattern pattern, IEnumerable <string> patternDigit, int width, int height) { this.Pattern = pattern; this.PatternDigit = FieldContextHelper.ConvertDigitStrsToUnit(patternDigit); this.Width = width; this.Height = height; this.IndexDic = this.ReadIndex(); this.MaxIndex = this.IndexDic.Values.Max(); }
public void MergedFieldsGeneratorのGetNextテスト() { var units = new List <uint>(); var unitStr = new List <string>(); unitStr.Add("10000000"); unitStr.Add("01000000"); unitStr.Add("00100000"); unitStr.Add("00010000"); units.Add(FieldContextHelper.ConvertDigitStrsToUnit(unitStr)); unitStr = new List <string>(); unitStr.Add("00001000"); unitStr.Add("00000100"); unitStr.Add("00000010"); unitStr.Add("00000001"); units.Add(FieldContextHelper.ConvertDigitStrsToUnit(unitStr)); var expected = new List <uint>(); expected.Add(units.First()); unitStr = new List <string>(); unitStr.Add("01000000"); unitStr.Add("00100000"); unitStr.Add("00010000"); unitStr.Add("00001000"); expected.Add(FieldContextHelper.ConvertDigitStrsToUnit(unitStr)); unitStr = new List <string>(); unitStr.Add("00100000"); unitStr.Add("00010000"); unitStr.Add("00001000"); unitStr.Add("00000100"); expected.Add(FieldContextHelper.ConvertDigitStrsToUnit(unitStr)); unitStr = new List <string>(); unitStr.Add("00010000"); unitStr.Add("00001000"); unitStr.Add("00000100"); unitStr.Add("00000010"); expected.Add(FieldContextHelper.ConvertDigitStrsToUnit(unitStr)); unitStr = new List <string>(); unitStr.Add("00001000"); unitStr.Add("00000100"); unitStr.Add("00000010"); unitStr.Add("00000001"); expected.Add(FieldContextHelper.ConvertDigitStrsToUnit(unitStr)); var actual = this.Generator.GetNext(units.ToArray()).ToList(); CollectionAssert.AreEqual(expected, actual); }
/// <summary> /// 死活監視評価を実行します。 /// </summary> /// <param name="context">フィールド状態</param> /// <returns>評価値</returns> public double Evaluate(FieldContext context) { Debug.Assert(this.HasInjected, "依存性の注入が完了していません"); var dangerCount = new int[Player.Length]; Player.ForEach(player => { foreach (var u in this.MyConfig.DangerUnits) { foreach (var i in this.MyConfig.DangerIndexes) { dangerCount[player.ToInt()] += FieldContextHelper.ExistsSlime(context, player, FieldContextConfig.MaxHiddenUnitIndex + u, i) ? 1 : 0; } } }); var difCount = dangerCount[Player.Index.First.ToInt()] - dangerCount[Player.Index.Second.ToInt()]; return(difCount * this.MyConfig.DangerEval); }
public void PatternGeneratorのGetNextテスト() { EnvConfig.Unity = false; var patterns = new List <PatternDefinition>(); var stairsOneLeft = new PatternProvider().Get(Pattern.StairsOneLeft); var stairsTwoRight = new PatternProvider().Get(Pattern.StairsTwoRight); patterns.Add(stairsOneLeft); patterns.Add(stairsTwoRight); this.Generator.Inject(new PatternGenerator.Config() { Patterns = patterns, }); var stairsOneLeftColors1P = new Dictionary <int, double>(); var stairsOneLeftObs1P = new Dictionary <int, double>(); var stairsOneLeftColors2P = new Dictionary <int, double>(); var stairsOneLeftObs2P = new Dictionary <int, double>(); // 1P-紫-StairsOneLeft var unitStr = new List <string>(); unitStr.Add("10000000"); unitStr.Add("00000000"); unitStr.Add("00000000"); unitStr.Add("00000000"); var key = stairsOneLeft.GetIndex(FieldContextHelper.ConvertDigitStrsToUnit(unitStr)); this.AddCount(stairsOneLeftColors1P, key); // 1P-赤-StairsOneLeft unitStr = new List <string>(); unitStr.Add("10000000"); unitStr.Add("00000000"); unitStr.Add("00000000"); unitStr.Add("00000000"); key = stairsOneLeft.GetIndex(FieldContextHelper.ConvertDigitStrsToUnit(unitStr)); this.AddCount(stairsOneLeftColors1P, key); this.AddCount(stairsOneLeftColors1P, key); unitStr = new List <string>(); unitStr.Add("00000000"); unitStr.Add("01000000"); unitStr.Add("00000000"); unitStr.Add("01000000"); key = stairsOneLeft.GetIndex(FieldContextHelper.ConvertDigitStrsToUnit(unitStr)); this.AddCount(stairsOneLeftColors1P, key); unitStr = new List <string>(); unitStr.Add("00000000"); unitStr.Add("00000000"); unitStr.Add("01000000"); unitStr.Add("00000000"); key = stairsOneLeft.GetIndex(FieldContextHelper.ConvertDigitStrsToUnit(unitStr)); this.AddCount(stairsOneLeftColors1P, key); unitStr = new List <string>(); unitStr.Add("00000000"); unitStr.Add("01000000"); unitStr.Add("00000000"); unitStr.Add("00000000"); key = stairsOneLeft.GetIndex(FieldContextHelper.ConvertDigitStrsToUnit(unitStr)); this.AddCount(stairsOneLeftColors1P, key); // 1P-おじゃま-StairsOneLeft unitStr = new List <string>(); unitStr.Add("10000000"); unitStr.Add("00000000"); unitStr.Add("00000000"); unitStr.Add("00000000"); key = stairsOneLeft.GetIndex(FieldContextHelper.ConvertDigitStrsToUnit(unitStr)); this.AddCount(stairsOneLeftObs1P, key); unitStr = new List <string>(); unitStr.Add("00000000"); unitStr.Add("01000000"); unitStr.Add("00000000"); unitStr.Add("00000000"); key = stairsOneLeft.GetIndex(FieldContextHelper.ConvertDigitStrsToUnit(unitStr)); this.AddCount(stairsOneLeftObs1P, key); unitStr = new List <string>(); unitStr.Add("00000000"); unitStr.Add("00000000"); unitStr.Add("01000000"); unitStr.Add("00000000"); key = stairsOneLeft.GetIndex(FieldContextHelper.ConvertDigitStrsToUnit(unitStr)); this.AddCount(stairsOneLeftObs1P, key); unitStr = new List <string>(); unitStr.Add("00000000"); unitStr.Add("00000000"); unitStr.Add("00000000"); unitStr.Add("01000000"); key = stairsOneLeft.GetIndex(FieldContextHelper.ConvertDigitStrsToUnit(unitStr)); this.AddCount(stairsOneLeftObs1P, key); // 2P-青-StairsOneLeft unitStr = new List <string>(); unitStr.Add("00000000"); unitStr.Add("01000000"); unitStr.Add("00000000"); unitStr.Add("00000000"); key = stairsOneLeft.GetIndex(FieldContextHelper.ConvertDigitStrsToUnit(unitStr)); this.AddCount(stairsOneLeftColors2P, key); unitStr = new List <string>(); unitStr.Add("00000000"); unitStr.Add("00000000"); unitStr.Add("01000000"); unitStr.Add("00000000"); key = stairsOneLeft.GetIndex(FieldContextHelper.ConvertDigitStrsToUnit(unitStr)); this.AddCount(stairsOneLeftColors2P, key); unitStr = new List <string>(); unitStr.Add("00000000"); unitStr.Add("00000000"); unitStr.Add("00000000"); unitStr.Add("01000000"); key = stairsOneLeft.GetIndex(FieldContextHelper.ConvertDigitStrsToUnit(unitStr)); this.AddCount(stairsOneLeftColors2P, key); // 2P-紫-StairsOneLeft unitStr = new List <string>(); unitStr.Add("00000000"); unitStr.Add("01000000"); unitStr.Add("00000000"); unitStr.Add("00000000"); key = stairsOneLeft.GetIndex(FieldContextHelper.ConvertDigitStrsToUnit(unitStr)); this.AddCount(stairsOneLeftColors2P, key); unitStr = new List <string>(); unitStr.Add("00000000"); unitStr.Add("00000000"); unitStr.Add("01000000"); unitStr.Add("00000000"); key = stairsOneLeft.GetIndex(FieldContextHelper.ConvertDigitStrsToUnit(unitStr)); this.AddCount(stairsOneLeftColors2P, key); unitStr = new List <string>(); unitStr.Add("00000000"); unitStr.Add("00000000"); unitStr.Add("00000000"); unitStr.Add("01000000"); key = stairsOneLeft.GetIndex(FieldContextHelper.ConvertDigitStrsToUnit(unitStr)); this.AddCount(stairsOneLeftColors2P, key); // 2P-赤-StairsOneLeft unitStr = new List <string>(); unitStr.Add("00000000"); unitStr.Add("00000000"); unitStr.Add("01000000"); unitStr.Add("00000000"); key = stairsOneLeft.GetIndex(FieldContextHelper.ConvertDigitStrsToUnit(unitStr)); this.AddCount(stairsOneLeftColors2P, key); unitStr = new List <string>(); unitStr.Add("00000000"); unitStr.Add("00000000"); unitStr.Add("00000000"); unitStr.Add("01000000"); key = stairsOneLeft.GetIndex(FieldContextHelper.ConvertDigitStrsToUnit(unitStr)); this.AddCount(stairsOneLeftColors2P, key); // 2P-おじゃま-StairsOneLeft unitStr = new List <string>(); unitStr.Add("00000000"); unitStr.Add("00000000"); unitStr.Add("00000000"); unitStr.Add("01000000"); key = stairsOneLeft.GetIndex(FieldContextHelper.ConvertDigitStrsToUnit(unitStr)); this.AddCount(stairsOneLeftObs2P, key); var stairsTwoRightColors1P = new Dictionary <int, double>(); var stairsTwoRightObs1P = new Dictionary <int, double>(); var stairsTwoRightColors2P = new Dictionary <int, double>(); var stairsTwoRightObs2P = new Dictionary <int, double>(); // 1P-紫-StairsTwoRight unitStr = new List <string>(); unitStr.Add("01000000"); unitStr.Add("00000000"); unitStr.Add("00000000"); unitStr.Add("00000000"); key = stairsTwoRight.GetIndex(FieldContextHelper.ConvertDigitStrsToUnit(unitStr)); this.AddCount(stairsTwoRightColors1P, key); // 1P-赤-StairsTwoRight unitStr = new List <string>(); unitStr.Add("00000000"); unitStr.Add("01000000"); unitStr.Add("00000000"); unitStr.Add("00000000"); key = stairsTwoRight.GetIndex(FieldContextHelper.ConvertDigitStrsToUnit(unitStr)); this.AddCount(stairsTwoRightColors1P, key); this.AddCount(stairsTwoRightColors1P, key); unitStr = new List <string>(); unitStr.Add("01000000"); unitStr.Add("00000000"); unitStr.Add("00000000"); unitStr.Add("00000000"); key = stairsTwoRight.GetIndex(FieldContextHelper.ConvertDigitStrsToUnit(unitStr)); this.AddCount(stairsTwoRightColors1P, key); this.AddCount(stairsTwoRightColors1P, key); unitStr = new List <string>(); unitStr.Add("00000000"); unitStr.Add("00000000"); unitStr.Add("10000000"); unitStr.Add("00000000"); key = stairsTwoRight.GetIndex(FieldContextHelper.ConvertDigitStrsToUnit(unitStr)); this.AddCount(stairsTwoRightColors1P, key); unitStr = new List <string>(); unitStr.Add("00000000"); unitStr.Add("00000000"); unitStr.Add("00000000"); unitStr.Add("10000000"); key = stairsTwoRight.GetIndex(FieldContextHelper.ConvertDigitStrsToUnit(unitStr)); this.AddCount(stairsTwoRightColors1P, key); // 1P-おじゃま-StairsTwoRight unitStr = new List <string>(); unitStr.Add("01000000"); unitStr.Add("00000000"); unitStr.Add("00000000"); unitStr.Add("00000000"); key = stairsTwoRight.GetIndex(FieldContextHelper.ConvertDigitStrsToUnit(unitStr)); this.AddCount(stairsTwoRightObs1P, key); unitStr = new List <string>(); unitStr.Add("00000000"); unitStr.Add("01000000"); unitStr.Add("00000000"); unitStr.Add("00000000"); key = stairsTwoRight.GetIndex(FieldContextHelper.ConvertDigitStrsToUnit(unitStr)); this.AddCount(stairsTwoRightObs1P, key); unitStr = new List <string>(); unitStr.Add("00000000"); unitStr.Add("00000000"); unitStr.Add("10000000"); unitStr.Add("00000000"); key = stairsTwoRight.GetIndex(FieldContextHelper.ConvertDigitStrsToUnit(unitStr)); this.AddCount(stairsTwoRightObs1P, key); unitStr = new List <string>(); unitStr.Add("00000000"); unitStr.Add("00000000"); unitStr.Add("00000000"); unitStr.Add("10000000"); key = stairsTwoRight.GetIndex(FieldContextHelper.ConvertDigitStrsToUnit(unitStr)); this.AddCount(stairsTwoRightObs1P, key); // 2P-青-StairsTwoRight unitStr = new List <string>(); unitStr.Add("01000000"); unitStr.Add("00000000"); unitStr.Add("00000000"); unitStr.Add("00000000"); key = stairsTwoRight.GetIndex(FieldContextHelper.ConvertDigitStrsToUnit(unitStr)); this.AddCount(stairsTwoRightColors2P, key); unitStr = new List <string>(); unitStr.Add("00000000"); unitStr.Add("01000000"); unitStr.Add("00000000"); unitStr.Add("00000000"); key = stairsTwoRight.GetIndex(FieldContextHelper.ConvertDigitStrsToUnit(unitStr)); this.AddCount(stairsTwoRightColors2P, key); // 2P-紫-StairsTwoRight unitStr = new List <string>(); unitStr.Add("01000000"); unitStr.Add("00000000"); unitStr.Add("00000000"); unitStr.Add("00000000"); key = stairsTwoRight.GetIndex(FieldContextHelper.ConvertDigitStrsToUnit(unitStr)); this.AddCount(stairsTwoRightColors2P, key); unitStr = new List <string>(); unitStr.Add("00000000"); unitStr.Add("01000000"); unitStr.Add("00000000"); unitStr.Add("00000000"); key = stairsTwoRight.GetIndex(FieldContextHelper.ConvertDigitStrsToUnit(unitStr)); this.AddCount(stairsTwoRightColors2P, key); var context = TestHelper.Receiver.Receive("../../resources/generators/patterngenerator/test-field-in-001-001.txt"); var actual = this.Generator.GetNext(context); Assert.AreEqual(RaisedIndex * 8, actual.Length); var raisedIndex = 0; // 1P-StairsOneLeft-color foreach (var kv in stairsOneLeftColors1P) { Assert.AreEqual(kv.Value, actual[kv.Key + raisedIndex], 0.0d, DebugHelper.ConvertUintToFieldUnit(stairsOneLeft.GetIndexKey(kv.Key))); } raisedIndex += RaisedIndex; // 1P-StairsOneLeft-obs foreach (var kv in stairsOneLeftObs1P) { Assert.AreEqual(kv.Value, actual[kv.Key + raisedIndex], 0.0d, DebugHelper.ConvertUintToFieldUnit(stairsOneLeft.GetIndexKey(kv.Key))); } raisedIndex += RaisedIndex; // 1P-StairsTwoRight-color foreach (var kv in stairsTwoRightColors1P) { Assert.AreEqual(kv.Value, actual[kv.Key + raisedIndex], 0.0d, DebugHelper.ConvertUintToFieldUnit(stairsTwoRight.GetIndexKey(kv.Key))); } raisedIndex += RaisedIndex; // 1P-StairsTwoRight-obs foreach (var kv in stairsTwoRightObs1P) { Assert.AreEqual(kv.Value, actual[kv.Key + raisedIndex], 0.0d, DebugHelper.ConvertUintToFieldUnit(stairsTwoRight.GetIndexKey(kv.Key))); } raisedIndex += RaisedIndex; // 2P-StairsOneLeft-color foreach (var kv in stairsOneLeftColors2P) { FileHelper.WriteLine($"key:{kv.Key} value:{kv.Value}"); Assert.AreEqual(kv.Value, actual[kv.Key + raisedIndex], 0.0d, DebugHelper.ConvertUintToFieldUnit(stairsOneLeft.GetIndexKey(kv.Key))); } raisedIndex += RaisedIndex; // 2P-StairsOneLeft-obs foreach (var kv in stairsOneLeftObs2P) { Assert.AreEqual(kv.Value, actual[kv.Key + raisedIndex], 0.0d, DebugHelper.ConvertUintToFieldUnit(stairsOneLeft.GetIndexKey(kv.Key))); } raisedIndex += RaisedIndex; // 2P-StairsTwoRight-color foreach (var kv in stairsTwoRightColors2P) { Assert.AreEqual(kv.Value, actual[kv.Key + raisedIndex], 0.0d, DebugHelper.ConvertUintToFieldUnit(stairsTwoRight.GetIndexKey(kv.Key))); } raisedIndex += RaisedIndex; // 2P-StairsTwoRight-obs foreach (var kv in stairsTwoRightObs2P) { Assert.AreEqual(kv.Value, actual[kv.Key + raisedIndex], 0.0d, DebugHelper.ConvertUintToFieldUnit(stairsTwoRight.GetIndexKey(kv.Key))); } }
/// <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); }