The simulator has two bots: random (the floor) and greedy (goal progress first, then specials, then pieces cleared). There is nothing in between that answers how much of greedy's win rate comes from chasing goals?
Add SpecialHunterBot: like GreedyBot.Evaluate, but specials created weigh more than goal progress. Everything else — win bonus, loss penalty, one ply — stays.
Interface (packages/com.rizgarozan.match3lab.core/Runtime/Simulation/IBot.cs):
public interface IBot
{
string Name { get; }
Move Choose(Game game, List<Move> legalMoves, Pcg32 rng);
}
Rules: deterministic (only the given rng), try moves on game.CloneWithUnknownFuture(seed) never game.Clone(), no UnityEngine. See CONTRIBUTING.md → Adding a bot.
Done when
SpecialHunterBot lives next to GreedyBot, name special
--bot special works in tools/Match3Lab.Cli/Program.cs
BotTests.cs has a test that the bot is deterministic for a seed and only returns legal moves
- the PR pastes
curve levels --bot special --runs 1000
The simulator has two bots:
random(the floor) andgreedy(goal progress first, then specials, then pieces cleared). There is nothing in between that answers how much of greedy's win rate comes from chasing goals?Add
SpecialHunterBot: likeGreedyBot.Evaluate, but specials created weigh more than goal progress. Everything else — win bonus, loss penalty, one ply — stays.Interface (
packages/com.rizgarozan.match3lab.core/Runtime/Simulation/IBot.cs):Rules: deterministic (only the given
rng), try moves ongame.CloneWithUnknownFuture(seed)nevergame.Clone(), noUnityEngine. See CONTRIBUTING.md → Adding a bot.Done when
SpecialHunterBotlives next toGreedyBot, namespecial--bot specialworks intools/Match3Lab.Cli/Program.csBotTests.cshas a test that the bot is deterministic for a seed and only returns legal movescurve levels --bot special --runs 1000