RuleEngine 核心类: - MahjongTile.cs — int编码 (1-29万条筒, 31-37字, 41-48花, 50-59宝牌) - MeldsSolver.cs — 标准回溯 + wildcard缺口填充 + 七对/十三幺/全不靠 - PhaseMachine.cs — 回合机(摸打碰杠胡 + 优先级仲裁) - ScoreEngine.cs — 番型计分 + 互斥图 - DslLoader.cs — YAML DSL加载 + 能力检查 4个DSL: 四川血战/广东鸡平胡/国标麻将/武汉麻将 控制台Demo: 交互模式 + 自动模式(--auto) 测试: 33个测试用例, 32个通过
45 lines
1.2 KiB
C#
45 lines
1.2 KiB
C#
namespace RuleEngine.Core;
|
|
|
|
public class MahjongDeck
|
|
{
|
|
public List<int> Tiles { get; private set; } = new();
|
|
|
|
public MahjongDeck(bool includeHonors = false, bool includeFlowers = false, int wildcardCount = 0)
|
|
{
|
|
var allTiles = MahjongTile.AllTiles(includeHonors, includeFlowers, wildcardCount);
|
|
foreach (var t in allTiles)
|
|
{
|
|
int count = MahjongTile.IsFlower(t) ? 1 : 4;
|
|
// Wildcards are handled by AllTiles already
|
|
if (MahjongTile.IsWildcard(t)) continue;
|
|
for (int i = 0; i < count; i++)
|
|
Tiles.Add(t);
|
|
}
|
|
// Add wildcards separately
|
|
for (int i = 0; i < wildcardCount; i++)
|
|
Tiles.Add(MahjongTile.WildcardBase + i);
|
|
}
|
|
|
|
public void Shuffle(Random? rng = null)
|
|
{
|
|
rng ??= Random.Shared;
|
|
int n = Tiles.Count;
|
|
while (n > 1)
|
|
{
|
|
int k = rng.Next(n--);
|
|
(Tiles[n], Tiles[k]) = (Tiles[k], Tiles[n]);
|
|
}
|
|
}
|
|
|
|
public int Draw()
|
|
{
|
|
if (Tiles.Count == 0)
|
|
throw new InvalidOperationException("Deck is empty");
|
|
int last = Tiles[^1];
|
|
Tiles.RemoveAt(Tiles.Count - 1);
|
|
return last;
|
|
}
|
|
|
|
public int Count => Tiles.Count;
|
|
}
|