|
|
54d9f3add3
|
compat: switch expression → ternary for .NET 4.8 双兼容
IsmctsBot.cs:539: C#8 switch expression → C#7.3 ternary
num switch {1=>14,2=>16,_=>num} → num==1?14:num==2?16:num
bot代码(.NET 4.8)兼容性清单:
✅ LINQ (GroupBy/OrderBy/SelectMany) — 原生
✅ string 插值 $"..." — C#6
✅ ?./?? — C#6
✅ ValueTuple — 需 NuGet System.ValueTuple (net48)
✅ 已移除 switch expression — 唯一 C#8 特性
net48 项目集成只需3步:
1. 复制 PdkBot.cs + IsmctsBot.cs → PdkFriendServer/Logic/
2. csproj: <PackageReference Include="System.ValueTuple" Version="4.5.0"/>
3. WaitWanJiaShuRu 加入 BotMode 分支(同 net10.0 逻辑)
|
2026-07-07 14:36:13 +08:00 |
|
|
|
d520534b5b
|
fix: InferType — ISMCTS模拟Type不再为None,所有牌型正确推演
根因: MakePlay/AddCandidate设Type=None,导致SimulateOneGame中
myPlay.Type=None, GetTipCard不匹配任何case→对手全员pass→评估失真
修复:
- 新增 InferType(): 根据牌数和面值分布推断牌型
1张→DanZhang 2张→DuiZi 4同→ZhaDan 4+2→SiDai2
4+3→SiDai3 3+2→SanDai2 ≥5→顺子/连对
- AddCandidate+MakePlay 均使用 InferType 替代 CardType1.None
- ISMCTS模拟中对手能正确识别我的出牌类型并跟牌
10局验证: FeiJi首次出现(2次), 全牌型:
DanZhang 72 | DuiZi 47 | ShunZi 11 | SanDai2 10 | LianDui 5 | FeiJi 2 | ZhaDan 1
多牌比例: 51%
|
2026-07-07 14:32:13 +08:00 |
|
|
|
6299e4e580
|
feat: AddMultiCardLeads 补全 — 连对/飞机/飞机带对
新增枚举:
- 连对(LianDui): 提取对子 → 排序 → 找≥3连续段(如334455)
- 飞机(FeiJi): 提取三张 → 排序 → 找≥2连续段(如333444)
- 飞机带对(FeijiDai2): 连续三张 + 每组附带1对子
辅助方法: SortByGameNum/AddConsecutiveGroups/GetConsecutiveRuns
10局验证: LianDui 5次出现
完整牌型: DanZhang 76 | DuiZi 37 | ShunZi 17 | SanDai2 7 | LianDui 5 | SiDai3 1
(飞机需≥2连续三张,16张牌罕见但逻辑已就位)
|
2026-07-07 14:28:49 +08:00 |
|
|
|
2dd0bc3f78
|
feat: AddMultiCardLeads 补全 — 三带二/四带二/四带三
引擎支持(GetOutCard已验证): DanZhang/DuiZi/SanDai2/ShunZi/LianDui/
FeiJi/ZhaDan/SiDai2/SiDai3/FeijiDai2
AddMultiCardLeads 新增:
- 三带二: 三张相同 + 附带手牌最小的2张
- 四带二: 四张相同 + 附带2张 (优先四带三)
10局验证: DuiZi 54 | DanZhang 53 | ShunZi 16 | SanDai2 13 | SiDai 2
单张比例: 100% → 38%
|
2026-07-07 14:22:48 +08:00 |
|
|
|
5547f75b5a
|
fix: 多牌先手枚举 — 根除只出单张问题
根因: GetTipCard 在 GameNum≤0(新轮次)时只返回单张候选,
不包含对子/三张/顺子/炸弹等多牌先手方案。
修复:
- 新增 AddMultiCardLeads(): 新轮次枚举全部多牌先手
- 对子 (GetMultiGroups:2) 三张 (3) 顺子(PokerLogic.GetShunZi) 炸弹(PokerLogic.GetPlayZhaDans)
- GetMultiGroups(): 统计同面值牌数,生成多牌候选
- 两阶段选择: 多牌候选优先,按牌数多少×胜率排序
- GetOutCard集成: 确保引擎收到正确牌型(DuiZi/ShunZi而非假DanZhang)
10局验证: DanZhang 59 | DuiZi 33 | ShunZi 16 | ZhaDan 1
多牌比例: 46% (之前0%)
|
2026-07-07 14:19:38 +08:00 |
|
|
|
3ef9d7f29e
|
fix: GetOutCard 集成 — bot 出牌类型不再硬编码 DanZhang
根因: MakePlay 永远设 Type=DanZhang,bot 路径跳过 GetOutCard 校验,
导致多牌组合(对子/顺子等)被错误标为单张。
修复:
- MakePlay: Type=DanZhang → Type=None(占位,等引擎赋值)
- WaitWanJiaShuRu case4: bot 有Ids时通过 GetOutCard 获取正确牌型
- payCard.Pos 补设(GetOutCard 输出 Pos 默认为0)
- ISMCTS 日志: 按 Ids 为空判断 pass,而非 Type
现在游戏日志正确显示: type:DanZhang/type:None/type:DuiZi 等
|
2026-07-07 14:07:35 +08:00 |
|
|
|
4c21e5d8b5
|
fix: ISMCTS v2 — 包庄阈值校准 + 多牌组合Rollout + 防死循环
P0修复: 包庄严重高估
- 阈值 45%→60%(1000局数据校准)
- Rollout 对手从「最小单张」改为 PickBestTip(最大+多牌优先)
- 模拟对手更强 → P(win) 估计更准确
P2修复: 只出单张不组合
- 新增 PickBestTip(): 优先多牌组合(对子/顺子 > 单张)
- 同数量选最大的牌
- Rollout 模拟中所有玩家均受益
P1确认(虚警): 75 moves 异常局实为碾压局(高牌玩家清16张)
- 加 pass streak 检测:连续 2 pass 则强制最大出牌
|
2026-07-07 13:59:49 +08:00 |
|
|
|
4a3fbec057
|
test: 1000轮 ISMCTS 压测 + 完整分析报告
新增:
- hjha-console/Program.cs: --stress N 压测模式
- 每局独立日志 stress_logs/round_NNNNN.txt
- 每 50 局进度汇报 + 异常捕获
- docs/stress-test-report.md: 完整分析报告
- P0: 包庄严重高估(5.2%成功) → 需校准阈值
- P1: 75 moves 异常局 → 疑似死循环
- P2: 只出单张不组合 → rollout 优化
- P3: 性能瓶颈分析
- .gitignore: stress_logs/, analyze_stress.py
压测结果: 12.8min, 0 crashes, 1000/1000通过
|
2026-07-07 13:53:46 +08:00 |
|
|
|
61948049b7
|
docs: 统一文档 pdk-bot.md + 清理冗余
合并 3 个分散文档为单一 docs/pdk-bot.md:
1. 概述与架构 — 外挂设计/信息隔离/策略可插拔
2. 算法说明 — PdkBot启发式 + IsmctsBot蒙特卡洛 + C路径展望
3. 引擎整合 — 对 PdkGameMain 的 8 处最小改动清单
4. 未来优化 — 短期/中期/长期路线图
删除旧文件: bot-architecture.md bot-algorithms.md ismcts-design.md
清理运行时产物: output.txt gamepack/
|
2026-07-07 13:34:08 +08:00 |
|
|
|
d23e0b7616
|
fix: ISMCTS包庄决策——600次模拟估算P(win), 阈值45%
替换占位逻辑(大牌≥6张)为真正的蒙特卡洛评估:
- EstimateWinProbability(): 模拟N局完整对局, 统计我第一个出完的概率
- 阈值45%: 包庄收益翻倍, 略微倾斜于有利局势
- 日志: [ISMCTS posX] 包庄评估: P(win)=XX% → 包庄/不包
原理: 包庄不改变牌局流程(不像斗地主叫地主), 只翻倍输赢。
因此决策简化为 P(win|我的手牌) ≥ 阈值 → 包庄。
|
2026-07-07 13:29:36 +08:00 |
|
|
|
a75733e4ae
|
feat: ISMCTS bot + full documentation
新增:
- PdkFriendServer/Logic/IsmctsBot.cs: ISMCTS蒙特卡洛搜索机器人
- 800次模拟/决策,对手手牌从未知牌池随机采样
- 包庄决策:大牌(≥J/Q/K/A/2)数量 ≥6 则包庄
- winRate日志输出,决策透明
- docs/bot-architecture.md: 系统架构文档
- docs/bot-algorithms.md: A/B/C三条算法路径完整分析
- docs/ismcts-design.md: ISMCTS实现设计详案
切换:
- PdkGameMain.InitBots: PdkBot → IsmctsBot(默认ISMCTS)
验证:
- dotnet build 0 errors
- 多人对局完整运行:包庄→出牌→结算→test over
|
2026-07-07 13:27:00 +08:00 |
|
|
|
ec87d921a3
|
feat: PdkBot — 外挂式自动出牌机器人
架构:
- IPdkBot 接口:外挂接入点,与核心逻辑解耦
- PdkBotView:只传自己手牌+公开信息(MaxPlayCard/ShenYuCard/Rule)
不暴露其他玩家手牌——模拟真人视角
- PdkBot:score-based 最优策略
评分维度:直接获胜>>对手威胁>>牌效率>>炸弹保留>>先手权>>黑桃3
对接:
- PdkGameMain.BotMode=true 启用
- WaitWanJiaShuRu中BuildBotView→bot.DecidePlay/DecideBaoZhuang
- GameBaoZhuang解除WhoPlay=GetNextPos注释以支持逐人轮询
- SetFalseOperation加DeskGameDo null守卫
文件:
- PdkFriendServer/Logic/PdkBot.cs(核心机器人)
- PdkFriendServer/Logic/PdkGameMain.cs(BotMode+对接)
- hjha-console/Program.cs(main.BotMode=true启动)
|
2026-07-07 13:11:13 +08:00 |
|
|
|
418b5db27f
|
chore: exclude gamepack/ runtime artifacts
|
2026-07-07 12:56:48 +08:00 |
|
|
|
025b8fc1e2
|
fix: Windows paths → ./gamepack/, empty Console.ReadLine guard
- SendPack(): C:\Users\Administrator\Desktop\temp\ → ./gamepack/
(Path.Combine + Directory.CreateDirectory for cross-platform)
- WaitWanJiaShuRu(): add IsNullOrWhiteSpace + ss.Length checks
before accessing ss[0]/ss[1] to prevent IndexOutOfRange on empty input
- .gitignore: add gamepack/ exclusion
|
2026-07-07 12:56:39 +08:00 |
|
|
|
49cc0f0df4
|
chore: exclude build artifacts (exe/, output.txt)
|
2026-07-07 12:48:46 +08:00 |
|
|
|
7b6c031d44
|
feat: net10.0 Linux Console mode — zero Mono, 0 compile errors
Migrated from net48 (.NET Framework) to net10.0 (cross-platform):
- All 14 csproj: net48 → net10.0, WindowsDesktop SDK → Microsoft.NET.Sdk
- Excluded WinForms files (Form/**, DebugControl, GameControl, etc.)
- Excluded DB modules (GameDAL db/Sql/**, MrWu DB files)
- Excluded server runtime files (GameBase, GlobalSever managers, GameNetModule stubs)
- Added minimal stubs (GameDoStub.cs, NamespaceStubs.cs, ServerCoreStubs.cs)
- Created hjha-console entry project
- Fixed hardcoded Windows path → ./test/ directory
- Updated global.json to SDK 10.0.109
Console test mode: PdkGameMain(null).Test() → 发牌→包庄→打牌→结算
Verified: dotnet build 0 errors, dotnet run outputs game state machine
|
2026-07-07 12:47:59 +08:00 |
|
|
|
e9616125ce
|
feat: initial commit - HJHA game server full source
6 major server modules (PdkFriendServer/GlobalSever/ServerCore/GameModule/GameNetModule) +
game logic (GameFix/GameDAL/ServerData) +
network layer (NetWorkMessage) +
data layer (ObjectModel) +
utilities (MrWu/Core/Config/CloudAPI/dll) +
adapters (zyxAdapter/base)
.NET 8.0 C# solution, 16 projects, 958 source files
|
2026-07-07 12:02:15 +08:00 |
|