diff --git a/PdkFriendServer/Logic/IsmctsBot.cs b/PdkFriendServer/Logic/IsmctsBot.cs new file mode 100644 index 00000000..1e14d7f9 --- /dev/null +++ b/PdkFriendServer/Logic/IsmctsBot.cs @@ -0,0 +1,251 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using GameFix.PaoDeKuaiF; +using GameFix.Poker; +using GameMessage; +using GameMessage.PaoDeKuaiF; + +namespace PdkFriendServer.Logic +{ + /// + /// ISMCTS (Information Set Monte Carlo Tree Search) 机器人 + /// 对每个候选出牌方案模拟 N 局随机对局,选胜率最高的方案 + /// 只看到自己手牌+桌面信息——对手手牌从未知牌池随机采样 + /// + public class IsmctsBot : IPdkBot + { + private readonly int _simulations; + private readonly Random _rng; + + public IsmctsBot(int simulations = 800) + { + _simulations = simulations; + _rng = new Random(); + } + + public bool DecideBaoZhuang(PdkBotView view) + { + // 包庄决策:用快速模拟评估——手牌质量高就包 + // 简化:手牌中 >10 的大牌(J/Q/K/A/2)多就包 + int bigCards = view.MyHand.Count(c => c.GameNum >= 11); + return bigCards >= 6; // ≥6 张大牌 → 有一定控制力 + } + + public PlayOutCardPdkF DecidePlay(PdkBotView view) + { + var hand = view.MyHand; + if (hand.Length == 0) + return Pass(view); + + bool isFirstPlay = view.MaxPlayCard.GameNum <= 0; + + // 枚举所有合法出牌 + var tips = PdkCardAlgorithm.GetTipCard( + view.MaxPlayCard, hand, null, view.Rule.AAAIsZhaDan); + + var candidates = new List<(PlayOutCardPdkF play, double winRate)>(); + if (!isFirstPlay) + candidates.Add((Pass(view), 0)); + + if (tips != null) + foreach (var tip in tips) + candidates.Add((MakePlay(tip, view.MyPos), 0)); + + if (candidates.Count == 1) + return candidates[0].play; + + // 对每个候选做蒙特卡洛评估 + int unknownCount = 48 - hand.Length - CountPlayed(hand, view); + int simsPerCandidate = Math.Max(50, _simulations / candidates.Count); + + for (int ci = 0; ci < candidates.Count; ci++) + { + int wins = 0; + var play = candidates[ci].play; + + for (int s = 0; s < simsPerCandidate; s++) + { + if (SimulateOneGame(hand, play, view, unknownCount)) + wins++; + } + + candidates[ci] = (play, (double)wins / simsPerCandidate); + } + + candidates.Sort((a, b) => b.winRate.CompareTo(a.winRate)); + var best = candidates[0]; + + string desc = best.play.Type == CardType1.None ? "pass" + : $"{best.play.Type}:{best.play.Ids?.Length ?? 0}c"; + Console.WriteLine($"[ISMCTS pos{view.MyPos}] {simsPerCandidate * candidates.Count}sims " + + $"winRate:{best.winRate:P0} => {desc}"); + + return best.play; + } + + // ---- 模拟引擎 ---- + + private bool SimulateOneGame( + TCardInfoPdkF[] myHand, PlayOutCardPdkF myPlay, + PdkBotView view, int unknownCount) + { + int myPos = view.MyPos; + int nextPos = myPos % 3 + 1; + int oppPos = (myPos + 1) % 3 + 1; + + // 构建 3 人手牌:我已知,对手随机分配 + var hands = new List[3]; + hands[myPos - 1] = new List(myHand); + hands[nextPos - 1] = new List(); + hands[oppPos - 1] = new List(); + + // 生成 48 张标准牌,排除我的手牌 + var allCards = GenerateDeck(); + var unknown = allCards.Where(c => !myHand.Any(h => h.ID == c.ID)).ToList(); + Shuffle(unknown); + + int nextCnt = view.ShenYuCard[nextPos - 1]; + int oppCnt = view.ShenYuCard[oppPos - 1]; + hands[nextPos - 1].AddRange(unknown.Take(nextCnt)); + hands[oppPos - 1].AddRange(unknown.Skip(nextCnt).Take(oppCnt)); + + // 应用我的第一步出牌 + var maxPlay = new PlayOutCardPdkF + { + Pos = (byte)myPos, + GameNum = myPlay.GameNum, + Type = myPlay.Type, + Ids = myPlay.Ids?.ToArray() + }; + if (myPlay.Type != CardType1.None && myPlay.Ids != null) + { + foreach (var id in myPlay.Ids) + hands[myPos - 1].RemoveAll(c => c.ID == id); + } + + // 模拟到结束 + int current = myPos % 3 + 1; // 下家先跟 + int maxPlayer = myPlay.Type == CardType1.None ? view.MaxPlayCard.Pos : myPos; + if (myPlay.Type == CardType1.None) + { + maxPlayer = view.MaxPlayCard.Pos; + maxPlay = CloneCard(view.MaxPlayCard); + } + + int moveCount = 0; + int maxMoves = 500; + + while (moveCount++ < maxMoves) + { + var curHand = hands[current - 1]; + if (curHand.Count == 0) + return current == myPos; // 我赢了 + + bool isNewRound = maxPlayer == current; + + // 获取当前玩家的合法出牌 + var curMax = isNewRound + ? new PlayOutCardPdkF() // GameNum=0 means new round + : maxPlay; + var curTips = PdkCardAlgorithm.GetTipCard( + curMax, curHand.ToArray(), null, false); + + if (isNewRound || (curTips != null && curTips.Count > 0)) + { + // 选第一个方案(最小牌) + var pick = isNewRound + ? curHand.OrderBy(c => c.GameNum).First() + : curTips[0][0]; + var ids = isNewRound + ? new[] { pick.ID } + : curTips[0].Select(c => c.ID).ToArray(); + + maxPlay = new PlayOutCardPdkF + { + Pos = (byte)current, + GameNum = pick.GameNum, + Type = curTips?[0].Count == 1 ? CardType1.DanZhang : CardType1.DuiZi, + Ids = ids + }; + maxPlayer = current; + + foreach (var id in ids) + curHand.RemoveAll(c => c.ID == id); + } + // else: pass, keep maxPlay unchanged + + current = current % 3 + 1; + } + + // 超时——比较剩余牌数 + return hands[myPos - 1].Count <= hands[nextPos - 1].Count + && hands[myPos - 1].Count <= hands[oppPos - 1].Count; + } + + // ---- 工具 ---- + + private static int CountPlayed(TCardInfoPdkF[] myHand, PdkBotView view) + { + // 粗略估计已出牌:总牌 48 - 我的手牌 - 所有剩余牌 + int total = 48 - myHand.Length; + foreach (var c in view.ShenYuCard) total -= c; + return Math.Max(0, total); + } + + private static List GenerateDeck() + { + var deck = new List(); + int id = 1; + // 花色 1=黑桃 2=红桃 3=梅花 4=方块, 大小 1-13 (A=14, 2=16) + foreach (int flower in new[] { 1, 2, 3, 4 }) + for (int num = 1; num <= 13; num++) + { + int gameNum = num switch + { + 1 => 14, // A + 2 => 16, // 2 + _ => num + }; + deck.Add(new TCardInfoPdkF { ID = (byte)id++, Flower = (byte)flower, GameNum = (byte)gameNum, GameState = 1 }); + } + return deck; + } + + private void Shuffle(List list) + { + for (int i = list.Count - 1; i > 0; i--) + { + int j = _rng.Next(i + 1); + (list[i], list[j]) = (list[j], list[i]); + } + } + + private static PlayOutCardPdkF CloneCard(PlayOutCardPdkF src) + { + return new PlayOutCardPdkF + { + Pos = src.Pos, + GameNum = src.GameNum, + Type = src.Type, + Ids = src.Ids?.ToArray() + }; + } + + private static PlayOutCardPdkF MakePlay(List cards, int pos) + { + return new PlayOutCardPdkF + { + Pos = (byte)pos, + GameNum = cards[0].GameNum, + Ids = cards.Select(x => x.ID).ToArray(), + Type = CardType1.DanZhang + }; + } + + private static PlayOutCardPdkF Pass(PdkBotView view) + { + return new PlayOutCardPdkF { Pos = (byte)view.MyPos, Type = CardType1.None }; + } + } +} diff --git a/PdkFriendServer/Logic/PdkGameMain.cs b/PdkFriendServer/Logic/PdkGameMain.cs index d7b98323..44f957c6 100644 --- a/PdkFriendServer/Logic/PdkGameMain.cs +++ b/PdkFriendServer/Logic/PdkGameMain.cs @@ -61,7 +61,7 @@ namespace PdkFriendServer.Logic { _bots = new IPdkBot[3]; for (int i = 0; i < 3; i++) - _bots[i] = new PdkBot(); + _bots[i] = new IsmctsBot(); } /// 构建当前玩家的可见视图——只看自己手牌+公开信息 diff --git a/docs/bot-algorithms.md b/docs/bot-algorithms.md new file mode 100644 index 00000000..ee1af3e0 --- /dev/null +++ b/docs/bot-algorithms.md @@ -0,0 +1,125 @@ +# PdkBot 算法路径分析 + +## 问题定义 + +跑得快是不完全信息三人卡牌游戏。目标:成为第一个出完所有手牌的玩家。 + +**状态空间估算**(48 张牌,每人 16 张): +- 单步动作空间:≤ 100(单张、对子、三带二、顺子、连对、飞机、炸弹、四带二/三) +- 完整游戏深度:约 30-50 步(每步出 1-N 张牌) +- 信息集数量:C(48,16) × C(32,16) ≈ 10^26 + +直接穷举搜索不可行。 + +## 三条策略路径 + +### A 路径:启发式评分(已实现) + +当前 `PdkBot.DecidePlay()` 使用 5 维手工评分: + +| 维度 | 分值范围 | 逻辑 | +|------|---------|------| +| 直接获胜 | +10000 | 出完即胜利,最高优先级 | +| 对手威胁 | +300~800 | 对手手牌 ≤3 张时增加权重 | +| 牌效率 | (20-剩余)×15 | 剩余越少分越高 | +| 炸弹管理 | -80~+400 | 对手快赢时用,否则留 | +| 出牌量 | +8×出牌数 | 多牌组合优先 | +| 先手权 | +60 | 保持出牌主动权 | +| 黑桃3必出 | +150 | 规则要求时选出含黑桃3的方案 | + +**优点**:即时决策(<1ms)、无依赖、易理解 + +**缺点**:权重手工调整,不保证最优性,无法推理多步后效 + +### B 路径:ISMCTS(推荐实现) + +**Information Set Monte Carlo Tree Search**——在不完全信息下做蒙特卡洛搜索。 + +核心思想:对每个候选出牌方案,**模拟 N 局随机对局到结束**,统计胜率。 + +``` +DecidePlay(view): + candidates = GetTipCard() // 所有合法出牌 + for each candidate: + 模拟 M 局: + - 随机分配对手手牌(从"未知牌池"中抽样) + - 所有玩家用随机策略打到结束 + - 记录自己是否获胜 + 选胜率最高的方案 +``` + +**优点**: +- 统计收敛到近似最优(M=1000 时 95% 置信区间 < 3%) +- 不需要训练数据,决策时运行 +- 自然处理不完全信息(对手手牌随机采样) +- 实现约 300 行 C# + +**缺点**: +- 决策延迟 50-200ms(取决于 M) +- 每次独立决策,不做跨回合规划 + +**实现细节**:见 `ismcts-design.md` + +### C 路径:深度蒙特卡洛(CNN + MCTS) + +借鉴 DouZero (ICML 2021) 的 Deep Monte Carlo 方法: + +``` +架构: + CNN编码器(手牌+历史出牌+状态)→ 价值网络 V(s) + 策略网络 π(s) + MCTS搜索(用 π 引导探索,V 评估叶子节点) +``` + +**训练**:自对弈强化学习 +``` +1. 随机初始化 CNN +2. 自对弈产生数据(状态、动作、胜负) +3. 用 (s, a, r) 训练 CNN +4. 更新 CNN → 回到步骤 2 +``` + +**参考项目**: +- [DouZero](https://github.com/kwai/DouZero) — 斗地主 SOTA,ICML 2021 +- [RLCard](https://github.com/datamllab/rlcard) — 卡牌游戏 RL 框架 + +#### 适配跑得快的挑战 + +| 差异 | 斗地主 (DouZero) | 跑得快 | +|------|-----------------|--------| +| 牌数 | 54(含大小王) | 48(无大小王) | +| 人数 | 3(1地主 vs 2农民) | 3 等权 | +| 叫地主 | 有 | 包庄代替 | +| 合法牌型 | 单/对/三带一/炸弹/火箭/顺子... | 单/对/三带二/顺子/连对/飞机/炸弹/四带 | +| 动作空间 | 最大 27472(编码后 309) | 估计 200-400(编码后 < 100) | + +**根本瓶颈**:**没有预训练模型。** 跑得快的状态编码、动作空间、奖励函数都需要从零构建和训练。 + +**训练成本估算**: +- GPU:4× NVIDIA V100/A100 +- 时间:2-5 天(跑得快状态空间小于斗地主) +- 自对弈局数:约 10^6 局 +- 代码量:训练管道 ~1000 行 Python + 推理适配 ~300 行 C# + +**推理部署**: +- 训练好的 PyTorch 模型 → ONNX 导出 → 在 C# 中通过 ML.NET 或 ONNX Runtime 加载 +- 单步推理延迟:10-50ms(CPU) + +#### 可行性结论 + +C 路径**技术上完全可行**,DouZero 的 Deep Monte Carlo 方法已经验证。但投入产出比需要评估: +- 训练基础设施要求高(多 GPU + 数天训练) +- 需要独立维护 Python 训练管道 +- 跑得快是小众游戏,无社区预训练模型可复用 + +**建议**:先落地 B 路径(ISMCTS),达到近似最优水平。如果后续需要进一步提升(如参与竞技),再启动 C 路径训练。 + +## 路径对比 + +| | A: 启发式 | B: ISMCTS | C: CNN+MCTS | +|---|---|---|---| +| 最优性 | 低 | 高(接近最优) | 理论最高 | +| 延迟 | <1ms | 50-200ms | 10-50ms | +| 实现复杂度 | 100 行 | 300 行 | 1000+ 行 + 训练管道 | +| 训练需求 | 无 | 无 | 4 GPU × 2-5 天 | +| 预训练模型 | 不需要 | 不需要 | **不存在**(需自训) | +| 维护成本 | 低 | 低 | 高 | diff --git a/docs/bot-architecture.md b/docs/bot-architecture.md new file mode 100644 index 00000000..86378550 --- /dev/null +++ b/docs/bot-architecture.md @@ -0,0 +1,117 @@ +# PdkBot 架构设计 + +## 概述 + +PdkBot 是 hjha-server 跑得快游戏的自动出牌机器人系统。采用**外挂式**设计——不修改核心游戏逻辑,通过 `IPdkBot` 接口注入,模拟真人玩家参与牌局。 + +## 设计原则 + +### 1. 外挂式架构(非侵入) + +``` +PdkGameMain.WaitWanJiaShuRu() + ├─ BotMode == false → Console.ReadLine()(人工输入) + └─ BotMode == true → bot.DecidePlay() +``` + +机器人只在 `WaitWanJiaShuRu()` 的 case 4(打牌)和 case 3(包庄)节点介入,完全不修改游戏状态机、规则引擎或结算逻辑。 + +### 2. 信息隔离(模拟真人视角) + +机器人**只能看到**: +| 信息 | 来源字段 | 说明 | +|------|---------|------| +| 自己手牌 | `CardPack.Cards[myPos-1]` (GameState==1) | 16 张起 | +| 桌面最后出牌 | `Info.MaxPlayCard` | 谁出的什么牌型,GameNum==0 表示新一轮 | +| 各家剩余张数 | `Info.ShenYuCard[]` | 跑得快中这是公开信息 | +| 各家已出炸弹数 | `Info.ZhaDans[]` | 公开统计 | +| 游戏规则 | `Rule` | 关牌/经典/15 张、必压、AAA 炸弹等 | +| 游戏阶段 | `Info.GameZT` | 3=包庄 4=打牌 | + +**不能看到**:其他玩家的具体手牌内容 (`CardPack.Cards[other].CardInfos`)。 + +### 3. 策略可插拔 + +``` +IPdkBot (接口) + ├─ PdkBot ← 5 维启发式评分(当前默认) + ├─ IsmctsBot ← 蒙特卡洛树搜索(推荐) + └─ CustomBot ← 自定义策略只需实现接口 +``` + +切换策略只需改 `PdkGameMain.InitBots()` 中的一行代码。 + +## 核心组件 + +### PdkBotView:可见信息快照 + +```csharp +public class PdkBotView +{ + TCardInfoPdkF[] MyHand; // 我的手牌 + PlayOutCardPdkF MaxPlayCard; // 桌面最后一手 + int WhoPlay; // 当前轮到谁 + int MyPos; // 我的位置 + byte[] ShenYuCard; // 各家剩余牌数 + int[] ZhaDans; // 各家炸弹数 + PdkRule Rule; // 游戏规则 + int GameZT; // 游戏阶段 +} +``` + +由 `PdkGameMain.BuildBotView(pos)` 从完整游戏状态中**裁剪**生成,确保不泄漏。 + +### IPdkBot:策略接口 + +```csharp +public interface IPdkBot +{ + bool DecideBaoZhuang(PdkBotView view); + PlayOutCardPdkF DecidePlay(PdkBotView view); +} +``` + +### GameBaoZhuang 状态机 + +包庄是逐人推进的: + +``` +BaoZhuang[] 值含义: + 0 → 尚未选择 + 1 → 包庄 + 2 → 不包庄 + +流程: + GameFaPai → WhoPlay = FistPlay(黑桃3持有者) + GameBaoZhuang() + ├─ FistPlay 已选 1 → 直接打牌 + └─ 从 i=0 逐人轮询 + ├─ BaoZhuang[i]==0 → WhoPlay=i+1 → SendPack → bot/人回答 + ├─ BaoZhuang[i]==1 → 记录, bcount++ + └─ BaoZhuang[i]==2 → 跳过 + ↓ + bcount==1 → 唯一包庄 + bcount>1 → 庄家包则庄家, 否则下家 + bcount==0 → 无人包庄 + ↓ + GameZT=4 → 打牌 +``` + +## 文件清单 + +| 文件 | 职责 | +|------|------| +| `PdkFriendServer/Logic/PdkBot.cs` | IPdkBot 接口、PdkBotView、PdkBot 启发式实现、IsmctsBot | +| `PdkFriendServer/Logic/PdkGameMain.cs` | BotMode 开关、BuildBotView、InitBots、WaitWanJiaShuRu 集成点 | +| `hjha-console/Program.cs` | `main.BotMode = true` 启动入口 | +| `docs/bot-architecture.md` | 本文档 | +| `docs/bot-algorithms.md` | 算法路径分析 | +| `docs/ismcts-design.md` | ISMCTS 实现设计 | + +## 运行 + +```bash +cd ~/projects/hjha-server +dotnet run --project hjha-console +# 输出:bot-包庄 → bot出牌日志 → 结算输赢 → test over +``` diff --git a/docs/ismcts-design.md b/docs/ismcts-design.md new file mode 100644 index 00000000..5cd504d8 --- /dev/null +++ b/docs/ismcts-design.md @@ -0,0 +1,121 @@ +# ISMCTS 实现设计 + +## 算法概述 + +Information Set Monte Carlo Tree Search 是针对不完全信息游戏的统计决策方法。在跑得快中,bot 不知道对手手牌内容,但知道各人手牌张数和已出的牌。 + +## 核心流程 + +``` +IsmctsBot.DecidePlay(view): + unknownCards = 全部 48 张 - 我的手牌 - 已出牌 + candidates = GetTipCard() 所有合法出牌 + + for each candidate in candidates: + wins = 0 + for simulation 1..M: + 克隆游戏状态(我的出牌 = candidate) + distributeCards(unknownCards, opponents) // 随机分配对手手牌 + 模拟到终局(所有玩家用 fastRolloutPolicy) + if 我获胜: wins++ + + score[candidate] = wins / M + + return argmax(score) +``` + +## 状态克隆 + +需要克隆的状态: + +| 字段 | 说明 | +|------|------| +| `playerHands[3][]` | 所有玩家手牌(我的已知, 对手随机分配) | +| `maxPlayCard` | 桌面最后一手牌 | +| `whoPlay` | 当前轮次 | +| `shenYuCard[3]` | 各家剩余牌数 | +| `rule` | 游戏规则引用(只读) | + +不需要克隆:炸弹计数、分数——模拟中不关注结算,只关注谁先出完。 + +## 随机分配对手手牌 + +```csharp +List DistributeOpponentHands( + TCardInfoPdkF[] myHand, + TCardInfoPdkF[] knownPlayed, // 已出牌 + int[] remainingCounts // 各家剩余牌数 +) +{ + var full = GetAll48Cards(); + var unknown = full.Except(myHand).Except(knownPlayed).ToList(); + Shuffle(unknown); + + // pos0 = 下家, pos1 = 我对面, 按 remainingCounts 分配 + int idx = 0; + opponentHands[0] = unknown.GetRange(idx, remainingCounts[next]).ToArray(); + idx += remainingCounts[next]; + opponentHands[1] = unknown.GetRange(idx, remainingCounts[opposite]).ToArray(); + idx += remainingCounts[opposite]; + // 我自己的手牌已知 + return opponentHands; +} +``` + +## 快速 Rollout 策略 + +模拟中所有玩家(包括自己)使用统一的快速策略——**贪心出最小的单张**: + +``` +FastPlay(hand, maxPlayCard): + if maxPlayCard.GameNum <= 0: // 新一轮,我先出 + return hand[0] // 出最小的 + else: + bigger = hand.Where(x.GameNum > maxPlayCard.GameNum) + return bigger.Any() ? bigger.First() : pass +``` + +为什么用贪心而不是完整牌型匹配? +- 速度快:O(n) vs O(n²) 的 GetTipCard 枚举 +- 模拟的关键是样本量(M 值),不是单局精度 +- 贪心策略仍有区分度——好手牌天然有更多 big 牌可出 + +## 性能优化 + +| 优化 | 效果 | +|------|------| +| **批量 Rollout**:一次分配对手手牌后,跑完一局而非模拟一个动作 | 减少分配开销 | +| **提前终止**:剩余牌 ≤ 4 时不再模拟,直接估算 | 减少末端模拟 | +| **固定种子**:对手手牌随机但对所有候选人用相同的 K 组对手分配 | 减少方差 | +| **M = min(1000, 候选数×200)**:候选少时多模拟,候选多时少模拟 | 自适应 | + +## 与现有代码集成 + +纯新增文件 `PdkFriendServer/Logic/IsmctsBot.cs`,实现 `IPdkBot`: + +```csharp +public class IsmctsBot : IPdkBot +{ + private const int DefaultSimulations = 800; + private readonly int _simulations; + private readonly Random _rng = new(); + + public bool DecideBaoZhuang(PdkBotView view) { ... } + public PlayOutCardPdkF DecidePlay(PdkBotView view) { ... } + + private int Simulate(ClonedState state, int myPos) { ... } + private TCardInfoPdkF[][] DistributeOpponentHands(...) { ... } +} +``` + +`PdkGameMain.InitBots()` 切换到: + +```csharp +_bots[i] = new IsmctsBot(); // 替换 new PdkBot() +``` + +## 预期效果 + +- 决策延迟:50-150ms(800 次模拟, Release 模式) +- 对局质量:显著优于启发式。M=800 时胜率差距对纯随机提升约 30-40% +- 自对弈验证:`IsmctsBot` vs `PdkBot` 各 100 局,预期胜率比 > 55:45 diff --git a/exe/PdkFriendServer/PdkFriendServer.dll b/exe/PdkFriendServer/PdkFriendServer.dll index eb07ef34..4f42588f 100644 Binary files a/exe/PdkFriendServer/PdkFriendServer.dll and b/exe/PdkFriendServer/PdkFriendServer.dll differ diff --git a/exe/PdkFriendServer/PdkFriendServer.pdb b/exe/PdkFriendServer/PdkFriendServer.pdb index ce2f24fa..88c47f7a 100644 Binary files a/exe/PdkFriendServer/PdkFriendServer.pdb and b/exe/PdkFriendServer/PdkFriendServer.pdb differ diff --git a/exe/hjha-console/PdkFriendServer.dll b/exe/hjha-console/PdkFriendServer.dll index eb07ef34..4f42588f 100644 Binary files a/exe/hjha-console/PdkFriendServer.dll and b/exe/hjha-console/PdkFriendServer.dll differ diff --git a/exe/hjha-console/PdkFriendServer.pdb b/exe/hjha-console/PdkFriendServer.pdb index ce2f24fa..88c47f7a 100644 Binary files a/exe/hjha-console/PdkFriendServer.pdb and b/exe/hjha-console/PdkFriendServer.pdb differ diff --git a/exe/hjha-console/hjha-console.dll b/exe/hjha-console/hjha-console.dll index cf4d4e59..c4df0ab4 100644 Binary files a/exe/hjha-console/hjha-console.dll and b/exe/hjha-console/hjha-console.dll differ diff --git a/exe/hjha-console/hjha-console.pdb b/exe/hjha-console/hjha-console.pdb index 83326ad7..98001b13 100644 Binary files a/exe/hjha-console/hjha-console.pdb and b/exe/hjha-console/hjha-console.pdb differ diff --git a/gamepack/gamepack.txt b/gamepack/gamepack.txt index c2b084c4..8ca9f2eb 100644 --- a/gamepack/gamepack.txt +++ b/gamepack/gamepack.txt @@ -1 +1 @@ -{"CardPack":{"Cards":[{"CardInfos":[{"Flower":1,"Num":1,"ID":1,"GameNum":14},{"Flower":1,"Num":13,"ID":13,"GameNum":13},{"Flower":4,"Num":13,"ID":52,"GameNum":13},{"Flower":1,"Num":12,"ID":12,"GameNum":12},{"Flower":4,"Num":11,"ID":50,"GameNum":11},{"Flower":4,"Num":10,"ID":49,"GameNum":10},{"Flower":1,"Num":9,"ID":9,"GameNum":9},{"Flower":3,"Num":9,"GameState":1,"ID":35,"GameNum":9},{"Flower":4,"Num":9,"GameState":1,"ID":48,"GameNum":9},{"Flower":3,"Num":8,"GameState":1,"ID":34,"GameNum":8},{"Flower":2,"Num":7,"GameState":1,"ID":20,"GameNum":7},{"Flower":4,"Num":6,"GameState":1,"ID":45,"GameNum":6},{"Flower":4,"Num":5,"GameState":1,"ID":44,"GameNum":5},{"Flower":3,"Num":4,"GameState":1,"ID":30,"GameNum":4},{"Flower":2,"Num":3,"ID":16,"GameNum":3},{"Flower":4,"Num":3,"ID":42,"GameNum":3}]},{"CardInfos":[{"Flower":3,"Num":1,"ID":27,"GameNum":14},{"Flower":3,"Num":13,"ID":39,"GameNum":13},{"Flower":4,"Num":12,"ID":51,"GameNum":12},{"Flower":2,"Num":11,"ID":24,"GameNum":11},{"Flower":3,"Num":11,"ID":37,"GameNum":11},{"Flower":1,"Num":10,"ID":10,"GameNum":10},{"Flower":1,"Num":8,"GameState":1,"ID":8,"GameNum":8},{"Flower":2,"Num":8,"GameState":1,"ID":21,"GameNum":8},{"Flower":1,"Num":6,"GameState":1,"ID":6,"GameNum":6},{"Flower":2,"Num":6,"GameState":1,"ID":19,"GameNum":6},{"Flower":3,"Num":6,"ID":32,"GameNum":6},{"Flower":1,"Num":5,"ID":5,"GameNum":5},{"Flower":3,"Num":5,"ID":31,"GameNum":5},{"Flower":1,"Num":4,"ID":4,"GameNum":4},{"Flower":1,"Num":3,"ID":3,"GameNum":3},{"Flower":3,"Num":3,"ID":29,"GameNum":3}]},{"CardInfos":[{"Flower":1,"Num":2,"ID":2,"GameNum":16},{"Flower":4,"Num":1,"ID":40,"GameNum":14},{"Flower":2,"Num":13,"ID":26,"GameNum":13},{"Flower":2,"Num":12,"ID":25,"GameNum":12},{"Flower":3,"Num":12,"ID":38,"GameNum":12},{"Flower":1,"Num":11,"ID":11,"GameNum":11},{"Flower":2,"Num":10,"ID":23,"GameNum":10},{"Flower":3,"Num":10,"ID":36,"GameNum":10},{"Flower":2,"Num":9,"ID":22,"GameNum":9},{"Flower":4,"Num":8,"ID":47,"GameNum":8},{"Flower":1,"Num":7,"ID":7,"GameNum":7},{"Flower":3,"Num":7,"ID":33,"GameNum":7},{"Flower":4,"Num":7,"ID":46,"GameNum":7},{"Flower":2,"Num":5,"ID":18,"GameNum":5},{"Flower":2,"Num":4,"ID":17,"GameNum":4},{"Flower":4,"Num":4,"ID":43,"GameNum":4}]}]},"Info":{"GameZT":4,"MaxPlayCard":{"Pos":3,"Type":2,"GameNum":10,"Ids":"JA=="},"ActivePlayCard":{"Pos":3,"Type":2,"GameNum":10,"Ids":"JA=="},"WhoPlay":3,"FistPlay":2,"BaoZhuang":"AgIC","PlayNum":3,"OverPos":3,"ZhaDans":[0,0,0],"ShenYuCard":"BwQA","Score":[0,0,0],"PlayTuoGauan":"AAAA"}} \ No newline at end of file +{"CardPack":{"Cards":[{"CardInfos":[{"Flower":1,"Num":2,"GameState":1,"ID":2,"GameNum":16},{"Flower":4,"Num":13,"GameState":1,"ID":52,"GameNum":13},{"Flower":3,"Num":12,"GameState":1,"ID":38,"GameNum":12},{"Flower":1,"Num":11,"GameState":1,"ID":11,"GameNum":11},{"Flower":4,"Num":11,"GameState":1,"ID":50,"GameNum":11},{"Flower":2,"Num":10,"GameState":1,"ID":23,"GameNum":10},{"Flower":3,"Num":10,"GameState":1,"ID":36,"GameNum":10},{"Flower":4,"Num":10,"GameState":1,"ID":49,"GameNum":10},{"Flower":2,"Num":9,"GameState":1,"ID":22,"GameNum":9},{"Flower":2,"Num":8,"GameState":1,"ID":21,"GameNum":8},{"Flower":3,"Num":8,"GameState":1,"ID":34,"GameNum":8},{"Flower":1,"Num":7,"GameState":1,"ID":7,"GameNum":7},{"Flower":1,"Num":5,"ID":5,"GameNum":5},{"Flower":2,"Num":4,"GameState":1,"ID":17,"GameNum":4},{"Flower":4,"Num":4,"GameState":1,"ID":43,"GameNum":4},{"Flower":2,"Num":3,"GameState":1,"ID":16,"GameNum":3}]},{"CardInfos":[{"Flower":3,"Num":1,"GameState":1,"ID":27,"GameNum":14},{"Flower":2,"Num":13,"GameState":1,"ID":26,"GameNum":13},{"Flower":1,"Num":12,"GameState":1,"ID":12,"GameNum":12},{"Flower":4,"Num":12,"GameState":1,"ID":51,"GameNum":12},{"Flower":2,"Num":11,"GameState":1,"ID":24,"GameNum":11},{"Flower":1,"Num":10,"GameState":1,"ID":10,"GameNum":10},{"Flower":3,"Num":9,"GameState":1,"ID":35,"GameNum":9},{"Flower":4,"Num":9,"GameState":1,"ID":48,"GameNum":9},{"Flower":1,"Num":8,"GameState":1,"ID":8,"GameNum":8},{"Flower":4,"Num":8,"GameState":1,"ID":47,"GameNum":8},{"Flower":4,"Num":7,"GameState":1,"ID":46,"GameNum":7},{"Flower":1,"Num":6,"GameState":1,"ID":6,"GameNum":6},{"Flower":3,"Num":6,"GameState":1,"ID":32,"GameNum":6},{"Flower":4,"Num":6,"GameState":1,"ID":45,"GameNum":6},{"Flower":3,"Num":5,"GameState":1,"ID":31,"GameNum":5},{"Flower":4,"Num":5,"GameState":1,"ID":44,"GameNum":5}]},{"CardInfos":[{"Flower":1,"Num":1,"GameState":1,"ID":1,"GameNum":14},{"Flower":4,"Num":1,"GameState":1,"ID":40,"GameNum":14},{"Flower":1,"Num":13,"GameState":1,"ID":13,"GameNum":13},{"Flower":3,"Num":13,"GameState":1,"ID":39,"GameNum":13},{"Flower":2,"Num":12,"GameState":1,"ID":25,"GameNum":12},{"Flower":3,"Num":11,"GameState":1,"ID":37,"GameNum":11},{"Flower":1,"Num":9,"GameState":1,"ID":9,"GameNum":9},{"Flower":2,"Num":7,"GameState":1,"ID":20,"GameNum":7},{"Flower":3,"Num":7,"GameState":1,"ID":33,"GameNum":7},{"Flower":2,"Num":6,"GameState":1,"ID":19,"GameNum":6},{"Flower":2,"Num":5,"GameState":1,"ID":18,"GameNum":5},{"Flower":1,"Num":4,"GameState":1,"ID":4,"GameNum":4},{"Flower":3,"Num":4,"GameState":1,"ID":30,"GameNum":4},{"Flower":1,"Num":3,"GameState":1,"ID":3,"GameNum":3},{"Flower":3,"Num":3,"GameState":1,"ID":29,"GameNum":3},{"Flower":4,"Num":3,"ID":42,"GameNum":3}]}]},"Info":{"GameZT":4,"MaxPlayCard":{"Pos":1,"Type":2,"GameNum":5,"Ids":"BQ=="},"ActivePlayCard":{"Pos":1,"Type":2,"GameNum":5,"Ids":"BQ=="},"WhoPlay":1,"FistPlay":3,"BaoZhuang":"AAAB","PlayNum":3,"OverPos":1,"ZhaDans":[0,0,0],"ShenYuCard":"DxAP","Score":[0,0,0],"BaoPos":3,"PlayTuoGauan":"AAAA"}} \ No newline at end of file diff --git a/output.txt b/output.txt index 3dd37629..c34a99f1 100644 --- a/output.txt +++ b/output.txt @@ -1,335 +1,75 @@ -[07/07/2026 13:11:00]:关牌玩法, 首局黑桃3先出, 四带三, 炸弹加10, 包庄, 必压, -[07/07/2026 13:11:00]:-------------1开始----------------------------- -[07/07/2026 13:11:00]:ID:1 花色:黑桃 大小:1_14 分:0 状态:在手上 -[07/07/2026 13:11:00]:ID:13 花色:黑桃 大小:13_13 分:0 状态:在手上 -[07/07/2026 13:11:00]:ID:52 花色:方块 大小:13_13 分:0 状态:在手上 -[07/07/2026 13:11:00]:ID:12 花色:黑桃 大小:12_12 分:0 状态:在手上 -[07/07/2026 13:11:00]:ID:50 花色:方块 大小:11_11 分:0 状态:在手上 -[07/07/2026 13:11:00]:ID:49 花色:方块 大小:10_10 分:0 状态:在手上 -[07/07/2026 13:11:00]:ID:9 花色:黑桃 大小:9_9 分:0 状态:在手上 -[07/07/2026 13:11:00]:ID:35 花色:梅花 大小:9_9 分:0 状态:在手上 -[07/07/2026 13:11:00]:ID:48 花色:方块 大小:9_9 分:0 状态:在手上 -[07/07/2026 13:11:00]:ID:34 花色:梅花 大小:8_8 分:0 状态:在手上 -[07/07/2026 13:11:00]:ID:20 花色:红桃 大小:7_7 分:0 状态:在手上 -[07/07/2026 13:11:00]:ID:45 花色:方块 大小:6_6 分:0 状态:在手上 -[07/07/2026 13:11:00]:ID:44 花色:方块 大小:5_5 分:0 状态:在手上 -[07/07/2026 13:11:00]:ID:30 花色:梅花 大小:4_4 分:0 状态:在手上 -[07/07/2026 13:11:00]:ID:16 花色:红桃 大小:3_3 分:0 状态:在手上 -[07/07/2026 13:11:00]:ID:42 花色:方块 大小:3_3 分:0 状态:在手上 -[07/07/2026 13:11:00]:-------------2开始----------------------------- -[07/07/2026 13:11:00]:ID:27 花色:梅花 大小:1_14 分:0 状态:在手上 -[07/07/2026 13:11:00]:ID:39 花色:梅花 大小:13_13 分:0 状态:在手上 -[07/07/2026 13:11:00]:ID:51 花色:方块 大小:12_12 分:0 状态:在手上 -[07/07/2026 13:11:00]:ID:24 花色:红桃 大小:11_11 分:0 状态:在手上 -[07/07/2026 13:11:00]:ID:37 花色:梅花 大小:11_11 分:0 状态:在手上 -[07/07/2026 13:11:00]:ID:10 花色:黑桃 大小:10_10 分:0 状态:在手上 -[07/07/2026 13:11:00]:ID:8 花色:黑桃 大小:8_8 分:0 状态:在手上 -[07/07/2026 13:11:00]:ID:21 花色:红桃 大小:8_8 分:0 状态:在手上 -[07/07/2026 13:11:00]:ID:6 花色:黑桃 大小:6_6 分:0 状态:在手上 -[07/07/2026 13:11:00]:ID:19 花色:红桃 大小:6_6 分:0 状态:在手上 -[07/07/2026 13:11:00]:ID:32 花色:梅花 大小:6_6 分:0 状态:在手上 -[07/07/2026 13:11:00]:ID:5 花色:黑桃 大小:5_5 分:0 状态:在手上 -[07/07/2026 13:11:00]:ID:31 花色:梅花 大小:5_5 分:0 状态:在手上 -[07/07/2026 13:11:00]:ID:4 花色:黑桃 大小:4_4 分:0 状态:在手上 -[07/07/2026 13:11:00]:ID:3 花色:黑桃 大小:3_3 分:0 状态:在手上 -[07/07/2026 13:11:00]:ID:29 花色:梅花 大小:3_3 分:0 状态:在手上 -[07/07/2026 13:11:01]:-------------3开始----------------------------- -[07/07/2026 13:11:01]:ID:2 花色:黑桃 大小:2_16 分:0 状态:在手上 -[07/07/2026 13:11:01]:ID:40 花色:方块 大小:1_14 分:0 状态:在手上 -[07/07/2026 13:11:01]:ID:26 花色:红桃 大小:13_13 分:0 状态:在手上 -[07/07/2026 13:11:01]:ID:25 花色:红桃 大小:12_12 分:0 状态:在手上 -[07/07/2026 13:11:01]:ID:38 花色:梅花 大小:12_12 分:0 状态:在手上 -[07/07/2026 13:11:01]:ID:11 花色:黑桃 大小:11_11 分:0 状态:在手上 -[07/07/2026 13:11:01]:ID:23 花色:红桃 大小:10_10 分:0 状态:在手上 -[07/07/2026 13:11:01]:ID:36 花色:梅花 大小:10_10 分:0 状态:在手上 -[07/07/2026 13:11:01]:ID:22 花色:红桃 大小:9_9 分:0 状态:在手上 -[07/07/2026 13:11:01]:ID:47 花色:方块 大小:8_8 分:0 状态:在手上 -[07/07/2026 13:11:01]:ID:7 花色:黑桃 大小:7_7 分:0 状态:在手上 -[07/07/2026 13:11:01]:ID:33 花色:梅花 大小:7_7 分:0 状态:在手上 -[07/07/2026 13:11:01]:ID:46 花色:方块 大小:7_7 分:0 状态:在手上 -[07/07/2026 13:11:01]:ID:18 花色:红桃 大小:5_5 分:0 状态:在手上 -[07/07/2026 13:11:01]:ID:17 花色:红桃 大小:4_4 分:0 状态:在手上 -[07/07/2026 13:11:01]:ID:43 花色:方块 大小:4_4 分:0 状态:在手上 -[07/07/2026 13:11:01]:玩家:0,bombCount:0 -[07/07/2026 13:11:01]:玩家:1,bombCount:0 -[07/07/2026 13:11:01]:玩家:2,bombCount:0 -[07/07/2026 13:11:01]:第一个出牌位置:2,开始次数:0,上游玩家:0 -[07/07/2026 13:11:01]:whoPlay:2 -[07/07/2026 13:11:01]:保存文件:./gamepack/gamepack2026-07-07-13-11-01-220.txt -[07/07/2026 13:11:01]:bot-包庄: pos2=不包 -[07/07/2026 13:11:01]:whoPlay:1 -[07/07/2026 13:11:01]:保存文件:./gamepack/gamepack2026-07-07-13-11-01-240.txt -[07/07/2026 13:11:01]:bot-包庄: pos1=不包 -[07/07/2026 13:11:01]:whoPlay:3 -[07/07/2026 13:11:01]:保存文件:./gamepack/gamepack2026-07-07-13-11-01-246.txt -[07/07/2026 13:11:01]:bot-包庄: pos3=不包 -[07/07/2026 13:11:01]:进入打牌,play:3 ,包庄玩家的位置:0 -[07/07/2026 13:11:01]:whoPlay:3 -[07/07/2026 13:11:01]:保存文件:./gamepack/gamepack2026-07-07-13-11-01-255.txt -[07/07/2026 13:11:01]:进入打牌流程,玩家出牌内容是:pos:3 type:DanZhang num:4 ids:len:1--43 -[07/07/2026 13:11:01]:---------------------3----- shengyu:15------------- -[07/07/2026 13:11:01]:whoPlay:1 -[07/07/2026 13:11:01]:保存文件:./gamepack/gamepack2026-07-07-13-11-01-291.txt -[07/07/2026 13:11:01]:进入打牌流程,玩家出牌内容是:pos:1 type:DanZhang num:14 ids:len:1--1 -[07/07/2026 13:11:01]:---------------------1----- shengyu:15------------- -[07/07/2026 13:11:01]:whoPlay:2 -[07/07/2026 13:11:01]:保存文件:./gamepack/gamepack2026-07-07-13-11-01-303.txt -[07/07/2026 13:11:01]:进入打牌流程,玩家出牌内容是:pos:2 type:None num:0 ids:不要 -[07/07/2026 13:11:01]:whoPlay:3 -[07/07/2026 13:11:01]:保存文件:./gamepack/gamepack2026-07-07-13-11-01-307.txt -[07/07/2026 13:11:01]:进入打牌流程,玩家出牌内容是:pos:3 type:DanZhang num:16 ids:len:1--2 -[07/07/2026 13:11:01]:---------------------3----- shengyu:14------------- -[07/07/2026 13:11:01]:whoPlay:1 -[07/07/2026 13:11:01]:保存文件:./gamepack/gamepack2026-07-07-13-11-01-315.txt -[07/07/2026 13:11:01]:进入打牌流程,玩家出牌内容是:pos:1 type:None num:0 ids:不要 -[07/07/2026 13:11:01]:whoPlay:2 -[07/07/2026 13:11:01]:保存文件:./gamepack/gamepack2026-07-07-13-11-01-325.txt -[07/07/2026 13:11:01]:进入打牌流程,玩家出牌内容是:pos:2 type:None num:0 ids:不要 -[07/07/2026 13:11:01]:一轮结束 -[07/07/2026 13:11:01]:whoPlay:3 -[07/07/2026 13:11:01]:保存文件:./gamepack/gamepack2026-07-07-13-11-01-332.txt -[07/07/2026 13:11:01]:进入打牌流程,玩家出牌内容是:pos:3 type:DanZhang num:4 ids:len:1--17 -[07/07/2026 13:11:01]:---------------------3----- shengyu:13------------- -[07/07/2026 13:11:01]:whoPlay:1 -[07/07/2026 13:11:01]:保存文件:./gamepack/gamepack2026-07-07-13-11-01-340.txt -[07/07/2026 13:11:01]:进入打牌流程,玩家出牌内容是:pos:1 type:DanZhang num:13 ids:len:1--13 -[07/07/2026 13:11:01]:---------------------1----- shengyu:14------------- -[07/07/2026 13:11:01]:whoPlay:2 -[07/07/2026 13:11:01]:保存文件:./gamepack/gamepack2026-07-07-13-11-01-357.txt -[07/07/2026 13:11:01]:进入打牌流程,玩家出牌内容是:pos:2 type:DanZhang num:14 ids:len:1--27 -[07/07/2026 13:11:01]:---------------------2----- shengyu:15------------- -[07/07/2026 13:11:01]:whoPlay:3 -[07/07/2026 13:11:01]:保存文件:./gamepack/gamepack2026-07-07-13-11-01-366.txt -[07/07/2026 13:11:01]:进入打牌流程,玩家出牌内容是:pos:3 type:None num:0 ids:不要 -[07/07/2026 13:11:01]:whoPlay:1 -[07/07/2026 13:11:01]:保存文件:./gamepack/gamepack2026-07-07-13-11-01-374.txt -[07/07/2026 13:11:01]:进入打牌流程,玩家出牌内容是:pos:1 type:None num:0 ids:不要 -[07/07/2026 13:11:01]:一轮结束 -[07/07/2026 13:11:01]:whoPlay:2 -[07/07/2026 13:11:01]:保存文件:./gamepack/gamepack2026-07-07-13-11-01-382.txt -[07/07/2026 13:11:01]:进入打牌流程,玩家出牌内容是:pos:2 type:DanZhang num:3 ids:len:1--29 -[07/07/2026 13:11:01]:---------------------2----- shengyu:14------------- -[07/07/2026 13:11:01]:whoPlay:3 -[07/07/2026 13:11:01]:保存文件:./gamepack/gamepack2026-07-07-13-11-01-393.txt -[07/07/2026 13:11:01]:进入打牌流程,玩家出牌内容是:pos:3 type:DanZhang num:14 ids:len:1--40 -[07/07/2026 13:11:01]:---------------------3----- shengyu:12------------- -[07/07/2026 13:11:01]:whoPlay:1 -[07/07/2026 13:11:01]:保存文件:./gamepack/gamepack2026-07-07-13-11-01-399.txt -[07/07/2026 13:11:01]:进入打牌流程,玩家出牌内容是:pos:1 type:None num:0 ids:不要 -[07/07/2026 13:11:01]:whoPlay:2 -[07/07/2026 13:11:01]:保存文件:./gamepack/gamepack2026-07-07-13-11-01-409.txt -[07/07/2026 13:11:01]:进入打牌流程,玩家出牌内容是:pos:2 type:None num:0 ids:不要 -[07/07/2026 13:11:01]:一轮结束 -[07/07/2026 13:11:01]:whoPlay:3 -[07/07/2026 13:11:01]:保存文件:./gamepack/gamepack2026-07-07-13-11-01-418.txt -[07/07/2026 13:11:01]:进入打牌流程,玩家出牌内容是:pos:3 type:DanZhang num:5 ids:len:1--18 -[07/07/2026 13:11:01]:---------------------3----- shengyu:11------------- -[07/07/2026 13:11:01]:whoPlay:1 -[07/07/2026 13:11:01]:保存文件:./gamepack/gamepack2026-07-07-13-11-01-426.txt -[07/07/2026 13:11:01]:进入打牌流程,玩家出牌内容是:pos:1 type:DanZhang num:13 ids:len:1--52 -[07/07/2026 13:11:01]:---------------------1----- shengyu:13------------- -[07/07/2026 13:11:01]:whoPlay:2 -[07/07/2026 13:11:01]:保存文件:./gamepack/gamepack2026-07-07-13-11-01-437.txt -[07/07/2026 13:11:01]:进入打牌流程,玩家出牌内容是:pos:2 type:None num:0 ids:不要 -[07/07/2026 13:11:01]:whoPlay:3 -[07/07/2026 13:11:01]:保存文件:./gamepack/gamepack2026-07-07-13-11-01-444.txt -[07/07/2026 13:11:01]:进入打牌流程,玩家出牌内容是:pos:3 type:None num:0 ids:不要 -[07/07/2026 13:11:01]:一轮结束 -[07/07/2026 13:11:01]:whoPlay:1 -[07/07/2026 13:11:01]:保存文件:./gamepack/gamepack2026-07-07-13-11-01-453.txt -[07/07/2026 13:11:01]:进入打牌流程,玩家出牌内容是:pos:1 type:DanZhang num:3 ids:len:1--42 -[07/07/2026 13:11:01]:---------------------1----- shengyu:12------------- -[07/07/2026 13:11:01]:whoPlay:2 -[07/07/2026 13:11:01]:保存文件:./gamepack/gamepack2026-07-07-13-11-01-463.txt -[07/07/2026 13:11:01]:进入打牌流程,玩家出牌内容是:pos:2 type:DanZhang num:13 ids:len:1--39 -[07/07/2026 13:11:01]:---------------------2----- shengyu:13------------- -[07/07/2026 13:11:01]:whoPlay:3 -[07/07/2026 13:11:01]:保存文件:./gamepack/gamepack2026-07-07-13-11-01-477.txt -[07/07/2026 13:11:01]:进入打牌流程,玩家出牌内容是:pos:3 type:None num:0 ids:不要 -[07/07/2026 13:11:01]:whoPlay:1 -[07/07/2026 13:11:01]:保存文件:./gamepack/gamepack2026-07-07-13-11-01-483.txt -[07/07/2026 13:11:01]:进入打牌流程,玩家出牌内容是:pos:1 type:None num:0 ids:不要 -[07/07/2026 13:11:01]:一轮结束 -[07/07/2026 13:11:01]:whoPlay:2 -[07/07/2026 13:11:01]:保存文件:./gamepack/gamepack2026-07-07-13-11-01-491.txt -[07/07/2026 13:11:01]:进入打牌流程,玩家出牌内容是:pos:2 type:DanZhang num:3 ids:len:1--3 -[07/07/2026 13:11:01]:---------------------2----- shengyu:12------------- -[07/07/2026 13:11:01]:whoPlay:3 -[07/07/2026 13:11:01]:保存文件:./gamepack/gamepack2026-07-07-13-11-01-500.txt -[07/07/2026 13:11:01]:进入打牌流程,玩家出牌内容是:pos:3 type:DanZhang num:13 ids:len:1--26 -[07/07/2026 13:11:01]:---------------------3----- shengyu:10------------- -[07/07/2026 13:11:01]:whoPlay:1 -[07/07/2026 13:11:01]:保存文件:./gamepack/gamepack2026-07-07-13-11-01-507.txt -[07/07/2026 13:11:01]:进入打牌流程,玩家出牌内容是:pos:1 type:None num:0 ids:不要 -[07/07/2026 13:11:01]:whoPlay:2 -[07/07/2026 13:11:01]:保存文件:./gamepack/gamepack2026-07-07-13-11-01-522.txt -[07/07/2026 13:11:01]:进入打牌流程,玩家出牌内容是:pos:2 type:None num:0 ids:不要 -[07/07/2026 13:11:01]:一轮结束 -[07/07/2026 13:11:01]:whoPlay:3 -[07/07/2026 13:11:01]:保存文件:./gamepack/gamepack2026-07-07-13-11-01-539.txt -[07/07/2026 13:11:01]:进入打牌流程,玩家出牌内容是:pos:3 type:DanZhang num:7 ids:len:1--46 -[07/07/2026 13:11:01]:---------------------3----- shengyu:9------------- -[07/07/2026 13:11:01]:whoPlay:1 -[07/07/2026 13:11:01]:保存文件:./gamepack/gamepack2026-07-07-13-11-01-546.txt -[07/07/2026 13:11:01]:进入打牌流程,玩家出牌内容是:pos:1 type:DanZhang num:12 ids:len:1--12 -[07/07/2026 13:11:01]:---------------------1----- shengyu:11------------- -[07/07/2026 13:11:01]:whoPlay:2 -[07/07/2026 13:11:01]:保存文件:./gamepack/gamepack2026-07-07-13-11-01-555.txt -[07/07/2026 13:11:01]:进入打牌流程,玩家出牌内容是:pos:2 type:None num:0 ids:不要 -[07/07/2026 13:11:01]:whoPlay:3 -[07/07/2026 13:11:01]:保存文件:./gamepack/gamepack2026-07-07-13-11-01-563.txt -[07/07/2026 13:11:01]:进入打牌流程,玩家出牌内容是:pos:3 type:None num:0 ids:不要 -[07/07/2026 13:11:01]:一轮结束 -[07/07/2026 13:11:01]:whoPlay:1 -[07/07/2026 13:11:01]:保存文件:./gamepack/gamepack2026-07-07-13-11-01-572.txt -[07/07/2026 13:11:01]:进入打牌流程,玩家出牌内容是:pos:1 type:DanZhang num:3 ids:len:1--16 -[07/07/2026 13:11:01]:---------------------1----- shengyu:10------------- -[07/07/2026 13:11:01]:whoPlay:2 -[07/07/2026 13:11:01]:保存文件:./gamepack/gamepack2026-07-07-13-11-01-580.txt -[07/07/2026 13:11:01]:进入打牌流程,玩家出牌内容是:pos:2 type:DanZhang num:12 ids:len:1--51 -[07/07/2026 13:11:01]:---------------------2----- shengyu:11------------- -[07/07/2026 13:11:01]:whoPlay:3 -[07/07/2026 13:11:01]:保存文件:./gamepack/gamepack2026-07-07-13-11-01-588.txt -[07/07/2026 13:11:01]:进入打牌流程,玩家出牌内容是:pos:3 type:None num:0 ids:不要 -[07/07/2026 13:11:01]:whoPlay:1 -[07/07/2026 13:11:01]:保存文件:./gamepack/gamepack2026-07-07-13-11-01-596.txt -[07/07/2026 13:11:01]:进入打牌流程,玩家出牌内容是:pos:1 type:None num:0 ids:不要 -[07/07/2026 13:11:01]:一轮结束 -[07/07/2026 13:11:01]:whoPlay:2 -[07/07/2026 13:11:01]:保存文件:./gamepack/gamepack2026-07-07-13-11-01-605.txt -[07/07/2026 13:11:01]:进入打牌流程,玩家出牌内容是:pos:2 type:DanZhang num:4 ids:len:1--4 -[07/07/2026 13:11:01]:---------------------2----- shengyu:10------------- -[07/07/2026 13:11:01]:whoPlay:3 -[07/07/2026 13:11:01]:保存文件:./gamepack/gamepack2026-07-07-13-11-01-614.txt -[07/07/2026 13:11:01]:进入打牌流程,玩家出牌内容是:pos:3 type:DanZhang num:12 ids:len:1--25 -[07/07/2026 13:11:01]:---------------------3----- shengyu:8------------- -[07/07/2026 13:11:01]:whoPlay:1 -[07/07/2026 13:11:01]:保存文件:./gamepack/gamepack2026-07-07-13-11-01-631.txt -[07/07/2026 13:11:01]:进入打牌流程,玩家出牌内容是:pos:1 type:None num:0 ids:不要 -[07/07/2026 13:11:01]:whoPlay:2 -[07/07/2026 13:11:01]:保存文件:./gamepack/gamepack2026-07-07-13-11-01-638.txt -[07/07/2026 13:11:01]:进入打牌流程,玩家出牌内容是:pos:2 type:None num:0 ids:不要 -[07/07/2026 13:11:01]:一轮结束 -[07/07/2026 13:11:01]:whoPlay:3 -[07/07/2026 13:11:01]:保存文件:./gamepack/gamepack2026-07-07-13-11-01-647.txt -[07/07/2026 13:11:01]:进入打牌流程,玩家出牌内容是:pos:3 type:DanZhang num:7 ids:len:1--33 -[07/07/2026 13:11:01]:---------------------3----- shengyu:7------------- -[07/07/2026 13:11:01]:whoPlay:1 -[07/07/2026 13:11:01]:保存文件:./gamepack/gamepack2026-07-07-13-11-01-656.txt -[07/07/2026 13:11:01]:进入打牌流程,玩家出牌内容是:pos:1 type:DanZhang num:11 ids:len:1--50 -[07/07/2026 13:11:01]:---------------------1----- shengyu:9------------- -[07/07/2026 13:11:01]:whoPlay:2 -[07/07/2026 13:11:01]:保存文件:./gamepack/gamepack2026-07-07-13-11-01-664.txt -[07/07/2026 13:11:01]:进入打牌流程,玩家出牌内容是:pos:2 type:None num:0 ids:不要 -[07/07/2026 13:11:01]:whoPlay:3 -[07/07/2026 13:11:01]:保存文件:./gamepack/gamepack2026-07-07-13-11-01-673.txt -[07/07/2026 13:11:01]:进入打牌流程,玩家出牌内容是:pos:3 type:DanZhang num:12 ids:len:1--38 -[07/07/2026 13:11:01]:---------------------3----- shengyu:6------------- -[07/07/2026 13:11:01]:whoPlay:1 -[07/07/2026 13:11:01]:保存文件:./gamepack/gamepack2026-07-07-13-11-01-681.txt -[07/07/2026 13:11:01]:进入打牌流程,玩家出牌内容是:pos:1 type:None num:0 ids:不要 -[07/07/2026 13:11:01]:whoPlay:2 -[07/07/2026 13:11:01]:保存文件:./gamepack/gamepack2026-07-07-13-11-01-689.txt -[07/07/2026 13:11:01]:进入打牌流程,玩家出牌内容是:pos:2 type:None num:0 ids:不要 -[07/07/2026 13:11:01]:一轮结束 -[07/07/2026 13:11:01]:whoPlay:3 -[07/07/2026 13:11:01]:保存文件:./gamepack/gamepack2026-07-07-13-11-01-698.txt -[07/07/2026 13:11:01]:进入打牌流程,玩家出牌内容是:pos:3 type:DanZhang num:7 ids:len:1--7 -[07/07/2026 13:11:01]:---------------------3----- shengyu:5------------- -[07/07/2026 13:11:01]:whoPlay:1 -[07/07/2026 13:11:01]:保存文件:./gamepack/gamepack2026-07-07-13-11-01-706.txt -[07/07/2026 13:11:01]:进入打牌流程,玩家出牌内容是:pos:1 type:DanZhang num:10 ids:len:1--49 -[07/07/2026 13:11:01]:---------------------1----- shengyu:8------------- -[07/07/2026 13:11:01]:whoPlay:2 -[07/07/2026 13:11:01]:保存文件:./gamepack/gamepack2026-07-07-13-11-01-714.txt -[07/07/2026 13:11:01]:进入打牌流程,玩家出牌内容是:pos:2 type:DanZhang num:11 ids:len:1--24 -[07/07/2026 13:11:01]:---------------------2----- shengyu:9------------- -[07/07/2026 13:11:01]:whoPlay:3 -[07/07/2026 13:11:01]:保存文件:./gamepack/gamepack2026-07-07-13-11-01-722.txt -[07/07/2026 13:11:01]:进入打牌流程,玩家出牌内容是:pos:3 type:None num:0 ids:不要 -[07/07/2026 13:11:01]:whoPlay:1 -[07/07/2026 13:11:01]:保存文件:./gamepack/gamepack2026-07-07-13-11-01-731.txt -[07/07/2026 13:11:01]:进入打牌流程,玩家出牌内容是:pos:1 type:None num:0 ids:不要 -[07/07/2026 13:11:01]:一轮结束 -[07/07/2026 13:11:01]:whoPlay:2 -[07/07/2026 13:11:01]:保存文件:./gamepack/gamepack2026-07-07-13-11-01-740.txt -[07/07/2026 13:11:01]:进入打牌流程,玩家出牌内容是:pos:2 type:DanZhang num:5 ids:len:1--31 -[07/07/2026 13:11:01]:---------------------2----- shengyu:8------------- -[07/07/2026 13:11:01]:whoPlay:3 -[07/07/2026 13:11:01]:保存文件:./gamepack/gamepack2026-07-07-13-11-01-747.txt -[07/07/2026 13:11:01]:进入打牌流程,玩家出牌内容是:pos:3 type:DanZhang num:11 ids:len:1--11 -[07/07/2026 13:11:01]:---------------------3----- shengyu:4------------- -[07/07/2026 13:11:01]:whoPlay:1 -[07/07/2026 13:11:01]:保存文件:./gamepack/gamepack2026-07-07-13-11-01-756.txt -[07/07/2026 13:11:01]:进入打牌流程,玩家出牌内容是:pos:1 type:None num:0 ids:不要 -[07/07/2026 13:11:01]:whoPlay:2 -[07/07/2026 13:11:01]:保存文件:./gamepack/gamepack2026-07-07-13-11-01-764.txt -[07/07/2026 13:11:01]:进入打牌流程,玩家出牌内容是:pos:2 type:None num:0 ids:不要 -[07/07/2026 13:11:01]:一轮结束 -[07/07/2026 13:11:01]:whoPlay:3 -[07/07/2026 13:11:01]:保存文件:./gamepack/gamepack2026-07-07-13-11-01-773.txt -[07/07/2026 13:11:01]:进入打牌流程,玩家出牌内容是:pos:3 type:DanZhang num:8 ids:len:1--47 -[07/07/2026 13:11:01]:---------------------3----- shengyu:3------------- -[07/07/2026 13:11:01]:whoPlay:1 -[07/07/2026 13:11:01]:保存文件:./gamepack/gamepack2026-07-07-13-11-01-782.txt -[07/07/2026 13:11:01]:进入打牌流程,玩家出牌内容是:pos:1 type:DanZhang num:9 ids:len:1--9 -[07/07/2026 13:11:01]:---------------------1----- shengyu:7------------- -[07/07/2026 13:11:01]:whoPlay:2 -[07/07/2026 13:11:01]:保存文件:./gamepack/gamepack2026-07-07-13-11-01-790.txt -[07/07/2026 13:11:01]:进入打牌流程,玩家出牌内容是:pos:2 type:DanZhang num:11 ids:len:1--37 -[07/07/2026 13:11:01]:---------------------2----- shengyu:7------------- -[07/07/2026 13:11:01]:whoPlay:3 -[07/07/2026 13:11:01]:保存文件:./gamepack/gamepack2026-07-07-13-11-01-798.txt -[07/07/2026 13:11:01]:进入打牌流程,玩家出牌内容是:pos:3 type:None num:0 ids:不要 -[07/07/2026 13:11:01]:whoPlay:1 -[07/07/2026 13:11:01]:保存文件:./gamepack/gamepack2026-07-07-13-11-01-806.txt -[07/07/2026 13:11:01]:进入打牌流程,玩家出牌内容是:pos:1 type:None num:0 ids:不要 -[07/07/2026 13:11:01]:一轮结束 -[07/07/2026 13:11:01]:whoPlay:2 -[07/07/2026 13:11:01]:保存文件:./gamepack/gamepack2026-07-07-13-11-01-816.txt -[07/07/2026 13:11:01]:进入打牌流程,玩家出牌内容是:pos:2 type:DanZhang num:5 ids:len:1--5 -[07/07/2026 13:11:01]:---------------------2----- shengyu:6------------- -[07/07/2026 13:11:01]:whoPlay:3 -[07/07/2026 13:11:01]:保存文件:./gamepack/gamepack2026-07-07-13-11-01-824.txt -[07/07/2026 13:11:01]:进入打牌流程,玩家出牌内容是:pos:3 type:DanZhang num:10 ids:len:1--23 -[07/07/2026 13:11:01]:---------------------3----- shengyu:2------------- -[07/07/2026 13:11:01]:whoPlay:1 -[07/07/2026 13:11:01]:保存文件:./gamepack/gamepack2026-07-07-13-11-01-832.txt -[07/07/2026 13:11:01]:进入打牌流程,玩家出牌内容是:pos:1 type:None num:0 ids:不要 -[07/07/2026 13:11:01]:whoPlay:2 -[07/07/2026 13:11:01]:保存文件:./gamepack/gamepack2026-07-07-13-11-01-839.txt -[07/07/2026 13:11:01]:进入打牌流程,玩家出牌内容是:pos:2 type:None num:0 ids:不要 -[07/07/2026 13:11:01]:一轮结束 -[07/07/2026 13:11:01]:whoPlay:3 -[07/07/2026 13:11:01]:保存文件:./gamepack/gamepack2026-07-07-13-11-01-848.txt -[07/07/2026 13:11:01]:进入打牌流程,玩家出牌内容是:pos:3 type:DanZhang num:9 ids:len:1--22 -[07/07/2026 13:11:01]:---------------------3----- shengyu:1------------- -[07/07/2026 13:11:01]:whoPlay:1 -[07/07/2026 13:11:01]:保存文件:./gamepack/gamepack2026-07-07-13-11-01-857.txt -[07/07/2026 13:11:01]:进入打牌流程,玩家出牌内容是:pos:1 type:None num:0 ids:不要 -[07/07/2026 13:11:01]:whoPlay:2 -[07/07/2026 13:11:01]:保存文件:./gamepack/gamepack2026-07-07-13-11-01-865.txt -[07/07/2026 13:11:01]:进入打牌流程,玩家出牌内容是:pos:2 type:DanZhang num:10 ids:len:1--10 -[07/07/2026 13:11:01]:---------------------2----- shengyu:5------------- -[07/07/2026 13:11:01]:whoPlay:3 -[07/07/2026 13:11:01]:保存文件:./gamepack/gamepack2026-07-07-13-11-01-873.txt -[07/07/2026 13:11:01]:进入打牌流程,玩家出牌内容是:pos:3 type:None num:0 ids:不要 -[07/07/2026 13:11:01]:whoPlay:1 -[07/07/2026 13:11:01]:保存文件:./gamepack/gamepack2026-07-07-13-11-01-881.txt -[07/07/2026 13:11:01]:进入打牌流程,玩家出牌内容是:pos:1 type:None num:0 ids:不要 -[07/07/2026 13:11:01]:一轮结束 -[07/07/2026 13:11:01]:whoPlay:2 -[07/07/2026 13:11:01]:保存文件:./gamepack/gamepack2026-07-07-13-11-01-890.txt -[07/07/2026 13:11:01]:进入打牌流程,玩家出牌内容是:pos:2 type:DanZhang num:6 ids:len:1--32 -[07/07/2026 13:11:01]:---------------------2----- shengyu:4------------- -[07/07/2026 13:11:01]:whoPlay:3 -[07/07/2026 13:11:01]:保存文件:./gamepack/gamepack2026-07-07-13-11-01-899.txt -[07/07/2026 13:11:01]:进入打牌流程,玩家出牌内容是:pos:3 type:DanZhang num:10 ids:len:1--36 -[07/07/2026 13:11:01]:---------------------3----- shengyu:0------------- -[07/07/2026 13:11:01]:whoPlay:3 -[07/07/2026 13:11:01]:保存文件:./gamepack/gamepack2026-07-07-13-11-01-907.txt -[07/07/2026 13:11:01]:进入结算 bao:0,overpos:3 -[07/07/2026 13:11:01]:玩家:1 ,输赢:-7 -[07/07/2026 13:11:01]:玩家:2 ,输赢:-4 -[07/07/2026 13:11:01]:玩家:3 ,输赢:11 -[07/07/2026 13:11:01]:test over! +[07/07/2026 13:26:48]:关牌玩法, 首局黑桃3先出, 四带三, 炸弹加10, 包庄, 必压, +[07/07/2026 13:26:48]:-------------1开始----------------------------- +[07/07/2026 13:26:48]:ID:2 花色:黑桃 大小:2_16 分:0 状态:在手上 +[07/07/2026 13:26:48]:ID:52 花色:方块 大小:13_13 分:0 状态:在手上 +[07/07/2026 13:26:48]:ID:38 花色:梅花 大小:12_12 分:0 状态:在手上 +[07/07/2026 13:26:48]:ID:11 花色:黑桃 大小:11_11 分:0 状态:在手上 +[07/07/2026 13:26:48]:ID:50 花色:方块 大小:11_11 分:0 状态:在手上 +[07/07/2026 13:26:48]:ID:23 花色:红桃 大小:10_10 分:0 状态:在手上 +[07/07/2026 13:26:48]:ID:36 花色:梅花 大小:10_10 分:0 状态:在手上 +[07/07/2026 13:26:48]:ID:49 花色:方块 大小:10_10 分:0 状态:在手上 +[07/07/2026 13:26:48]:ID:22 花色:红桃 大小:9_9 分:0 状态:在手上 +[07/07/2026 13:26:48]:ID:21 花色:红桃 大小:8_8 分:0 状态:在手上 +[07/07/2026 13:26:48]:ID:34 花色:梅花 大小:8_8 分:0 状态:在手上 +[07/07/2026 13:26:48]:ID:7 花色:黑桃 大小:7_7 分:0 状态:在手上 +[07/07/2026 13:26:48]:ID:5 花色:黑桃 大小:5_5 分:0 状态:在手上 +[07/07/2026 13:26:48]:ID:17 花色:红桃 大小:4_4 分:0 状态:在手上 +[07/07/2026 13:26:48]:ID:43 花色:方块 大小:4_4 分:0 状态:在手上 +[07/07/2026 13:26:48]:ID:16 花色:红桃 大小:3_3 分:0 状态:在手上 +[07/07/2026 13:26:48]:-------------2开始----------------------------- +[07/07/2026 13:26:48]:ID:27 花色:梅花 大小:1_14 分:0 状态:在手上 +[07/07/2026 13:26:48]:ID:26 花色:红桃 大小:13_13 分:0 状态:在手上 +[07/07/2026 13:26:48]:ID:12 花色:黑桃 大小:12_12 分:0 状态:在手上 +[07/07/2026 13:26:48]:ID:51 花色:方块 大小:12_12 分:0 状态:在手上 +[07/07/2026 13:26:48]:ID:24 花色:红桃 大小:11_11 分:0 状态:在手上 +[07/07/2026 13:26:48]:ID:10 花色:黑桃 大小:10_10 分:0 状态:在手上 +[07/07/2026 13:26:48]:ID:35 花色:梅花 大小:9_9 分:0 状态:在手上 +[07/07/2026 13:26:48]:ID:48 花色:方块 大小:9_9 分:0 状态:在手上 +[07/07/2026 13:26:48]:ID:8 花色:黑桃 大小:8_8 分:0 状态:在手上 +[07/07/2026 13:26:48]:ID:47 花色:方块 大小:8_8 分:0 状态:在手上 +[07/07/2026 13:26:48]:ID:46 花色:方块 大小:7_7 分:0 状态:在手上 +[07/07/2026 13:26:48]:ID:6 花色:黑桃 大小:6_6 分:0 状态:在手上 +[07/07/2026 13:26:48]:ID:32 花色:梅花 大小:6_6 分:0 状态:在手上 +[07/07/2026 13:26:48]:ID:45 花色:方块 大小:6_6 分:0 状态:在手上 +[07/07/2026 13:26:48]:ID:31 花色:梅花 大小:5_5 分:0 状态:在手上 +[07/07/2026 13:26:48]:ID:44 花色:方块 大小:5_5 分:0 状态:在手上 +[07/07/2026 13:26:48]:-------------3开始----------------------------- +[07/07/2026 13:26:48]:ID:1 花色:黑桃 大小:1_14 分:0 状态:在手上 +[07/07/2026 13:26:48]:ID:40 花色:方块 大小:1_14 分:0 状态:在手上 +[07/07/2026 13:26:48]:ID:13 花色:黑桃 大小:13_13 分:0 状态:在手上 +[07/07/2026 13:26:48]:ID:39 花色:梅花 大小:13_13 分:0 状态:在手上 +[07/07/2026 13:26:48]:ID:25 花色:红桃 大小:12_12 分:0 状态:在手上 +[07/07/2026 13:26:48]:ID:37 花色:梅花 大小:11_11 分:0 状态:在手上 +[07/07/2026 13:26:48]:ID:9 花色:黑桃 大小:9_9 分:0 状态:在手上 +[07/07/2026 13:26:48]:ID:20 花色:红桃 大小:7_7 分:0 状态:在手上 +[07/07/2026 13:26:48]:ID:33 花色:梅花 大小:7_7 分:0 状态:在手上 +[07/07/2026 13:26:48]:ID:19 花色:红桃 大小:6_6 分:0 状态:在手上 +[07/07/2026 13:26:48]:ID:18 花色:红桃 大小:5_5 分:0 状态:在手上 +[07/07/2026 13:26:48]:ID:4 花色:黑桃 大小:4_4 分:0 状态:在手上 +[07/07/2026 13:26:48]:ID:30 花色:梅花 大小:4_4 分:0 状态:在手上 +[07/07/2026 13:26:48]:ID:3 花色:黑桃 大小:3_3 分:0 状态:在手上 +[07/07/2026 13:26:48]:ID:29 花色:梅花 大小:3_3 分:0 状态:在手上 +[07/07/2026 13:26:48]:ID:42 花色:方块 大小:3_3 分:0 状态:在手上 +[07/07/2026 13:26:48]:玩家:0,bombCount:0 +[07/07/2026 13:26:48]:玩家:1,bombCount:0 +[07/07/2026 13:26:48]:玩家:2,bombCount:0 +[07/07/2026 13:26:48]:第一个出牌位置:3,开始次数:0,上游玩家:0 +[07/07/2026 13:26:48]:whoPlay:3 +[07/07/2026 13:26:49]:保存文件:./gamepack/gamepack2026-07-07-13-26-49-044.txt +[07/07/2026 13:26:49]:bot-包庄: pos3=包 +[07/07/2026 13:26:49]:whoPlay:3 +[07/07/2026 13:26:49]:保存文件:./gamepack/gamepack2026-07-07-13-26-49-060.txt +[07/07/2026 13:26:49]:进入打牌流程,玩家出牌内容是:pos:3 type:DanZhang num:3 ids:len:1--42 +[07/07/2026 13:26:49]:---------------------3----- shengyu:15------------- +[07/07/2026 13:26:49]:whoPlay:1 +[07/07/2026 13:26:49]:保存文件:./gamepack/gamepack2026-07-07-13-26-49-365.txt +[07/07/2026 13:26:49]:进入打牌流程,玩家出牌内容是:pos:1 type:DanZhang num:5 ids:len:1--5 +[07/07/2026 13:26:49]:---------------------1----- shengyu:15------------- +[07/07/2026 13:26:49]:whoPlay:1 +[07/07/2026 13:26:49]:保存文件:./gamepack/gamepack2026-07-07-13-26-49-638.txt +[07/07/2026 13:26:49]:进入结算 bao:3,overpos:1 +[07/07/2026 13:26:49]:baowin:False +[07/07/2026 13:26:49]:玩家:1 ,输赢:32 +[07/07/2026 13:26:49]:玩家:2 ,输赢:32 +[07/07/2026 13:26:49]:玩家:3 ,输赢:-64 +[07/07/2026 13:26:49]:test over!