由于偶尔观测到抛竿时“摇摆”行为的出现,设计了一种单元测试来为修改算法做准备。此commit中,改新添加的单元测试是通过不了的。

This commit is contained in:
FishmanTheMurloc
2025-03-08 23:28:04 +08:00
parent b575474cb1
commit 5bb0144c30
2 changed files with 52 additions and 6 deletions

View File

@@ -197,6 +197,7 @@ namespace BetterGenshinImpact.GameTask.AutoFishing
{
noPlacementTimes = 0;
noTargetFishTimes = 0;
prevTargetFishRect = Rect.Empty;
input.Mouse.LeftButtonDown();
blackboard.pitchReset = true;
@@ -213,7 +214,12 @@ namespace BetterGenshinImpact.GameTask.AutoFishing
drawContent.RemoveRect("PrevFish");
}
Rect prevTargetFishRect = Rect.Empty; // 记录上一个目标鱼的位置
Rect prevTargetFishRect; // 记录上一个目标鱼的位置
/// <summary>
/// 当前鱼
/// </summary>
public OneFish? currentFish { get; private set; }
protected override BehaviourStatus Update(ImageRegion imageRegion)
{
@@ -228,6 +234,7 @@ namespace BetterGenshinImpact.GameTask.AutoFishing
var result = blackboard.predictor.Detect(memoryStream);
Debug.WriteLine($"YOLOv8识别: {result.Speed}");
var fishpond = new Fishpond(result, includeTarget: timeProvider.GetLocalNow() <= ignoreObtainedEndTime);
blackboard.fishpond = fishpond;
Random _rd = new();
if (fishpond.TargetRect == null || fishpond.TargetRect == Rect.Empty)
{
@@ -261,7 +268,7 @@ namespace BetterGenshinImpact.GameTask.AutoFishing
Rect fishpondTargetRect = (Rect)fishpond.TargetRect;
// 找到落点最近的鱼
OneFish? currentFish = null;
currentFish = null;
if (prevTargetFishRect == Rect.Empty)
{
var list = fishpond.FilterByBaitName(blackboard.selectedBaitName);

View File

@@ -36,8 +36,7 @@ namespace BetterGenshinImpact.UnitTest.GameTaskTests.AutoFishingTests
selectedBaitName = selectedBaitName
};
DateTimeOffset dateTime = new DateTimeOffset(2025, 2, 26, 16, 13, 54, 285, TimeSpan.FromHours(8));
FakeTimeProvider fakeTimeProvider = new FakeTimeProvider(dateTime);
FakeTimeProvider fakeTimeProvider = new FakeTimeProvider();
//
ThrowRod sut = new ThrowRod("-", blackboard, new FakeLogger(), false, new FakeInputSimulator(), fakeTimeProvider, drawContent: new FakeDrawContent());
@@ -68,8 +67,7 @@ namespace BetterGenshinImpact.UnitTest.GameTaskTests.AutoFishingTests
selectedBaitName = selectedBaitName
};
DateTimeOffset dateTime = new DateTimeOffset(2025, 2, 26, 16, 13, 54, 285, TimeSpan.FromHours(8));
FakeTimeProvider fakeTimeProvider = new FakeTimeProvider(dateTime);
FakeTimeProvider fakeTimeProvider = new FakeTimeProvider();
//
ThrowRod sut = new ThrowRod("-", blackboard, new FakeLogger(), false, new FakeInputSimulator(), fakeTimeProvider, drawContent: new FakeDrawContent());
@@ -79,5 +77,46 @@ namespace BetterGenshinImpact.UnitTest.GameTaskTests.AutoFishingTests
Assert.False(blackboard.noTargetFish);
Assert.Equal(BehaviourStatus.Running, actual);
}
/// <summary>
/// 抛竿时,给定三条炮鲀鱼,并且确定算法能将下杆点从鱼的左侧移动到最左侧的炮鲀鱼上,此时希望“当前鱼”能始终锁定在最左侧的鱼上
/// 由于偶尔观测到“摇摆”行为的出现,故设计此测试
/// </summary>
[Fact]
public void ThrowRodTest_Target_ShouldBeTheLeftOne()
{
//
Bitmap bitmap = new Bitmap(@$"..\..\..\Assets\AutoFishing\202503082114541115.png");
var imageRegion = new GameCaptureRegion(bitmap, 0, 0, new DesktopRegion(new FakeMouseSimulator()), converter: new ScaleConverter(1d), drawContent: new FakeDrawContent());
var predictor = YoloV8Builder.CreateDefaultBuilder().UseOnnxModel(Global.Absolute(@"Assets\Model\Fish\bgi_fish.onnx")).Build();
var blackboard = new Blackboard(predictor, sleep: i => { })
{
selectedBaitName = "fake fly bait"
};
//
ThrowRod sut = new ThrowRod("-", blackboard, new FakeLogger(), false, new FakeInputSimulator(), new FakeTimeProvider(), drawContent: new FakeDrawContent());
sut.Tick(imageRegion);
var actual = sut.currentFish;
//
Assert.True(blackboard.fishpond.TargetRect != null && blackboard.fishpond.TargetRect.Value != OpenCvSharp.Rect.Empty);
Assert.Equal(3, blackboard.fishpond.Fishes.Count(f => f.FishType.Name == "pufferfish"));
Assert.Equal(blackboard.fishpond.Fishes.OrderBy(f => f.Rect.X).First(), actual);
//
bitmap = new Bitmap(@$"..\..\..\Assets\AutoFishing\202503082114560489.png");
imageRegion = new GameCaptureRegion(bitmap, 0, 0, new DesktopRegion(new FakeMouseSimulator()), converter: new ScaleConverter(1d), drawContent: new FakeDrawContent());
//
sut.Tick(imageRegion);
actual = sut.currentFish;
//
Assert.Equal(3, blackboard.fishpond.Fishes.Count(f => f.FishType.Name == "pufferfish"));
Assert.Equal(blackboard.fishpond.Fishes.OrderBy(f => f.Rect.X).First(), actual);
}
}
}