fix: ISMCTS包庄决策——600次模拟估算P(win), 阈值45%

替换占位逻辑(大牌≥6张)为真正的蒙特卡洛评估:
- EstimateWinProbability(): 模拟N局完整对局, 统计我第一个出完的概率
- 阈值45%: 包庄收益翻倍, 略微倾斜于有利局势
- 日志: [ISMCTS posX] 包庄评估: P(win)=XX% → 包庄/不包

原理: 包庄不改变牌局流程(不像斗地主叫地主), 只翻倍输赢。
因此决策简化为 P(win|我的手牌) ≥ 阈值 → 包庄。
This commit is contained in:
2026-07-07 13:29:36 +08:00
parent a75733e4ae
commit d23e0b7616
9 changed files with 163 additions and 80 deletions

View File

@ -26,10 +26,86 @@ namespace PdkFriendServer.Logic
public bool DecideBaoZhuang(PdkBotView view)
{
// 包庄决策:用快速模拟评估——手牌质量高就包
// 简化:手牌中 >10 的大牌J/Q/K/A/2多就包
int bigCards = view.MyHand.Count(c => c.GameNum >= 11);
return bigCards >= 6; // ≥6 张大牌 → 有一定控制力
// ISMCTS 包庄决策:模拟 N 局,估算自己第一个出完的概率
// 包庄不改变牌局流程只翻倍输赢P(win)*2*gain - P(lose)*2*loss
// 阈值 45%——因为包庄成功收益翻倍,略微倾斜有利于局势占优
double winRate = EstimateWinProbability(view);
bool shouldBao = winRate >= 0.45;
Console.WriteLine($"[ISMCTS pos{view.MyPos}] 包庄评估: P(win)={winRate:P0} → {(shouldBao ? "" : "")}");
return shouldBao;
}
/// <summary>模拟 N 局随机对局,统计我第一个出完的概率</summary>
private double EstimateWinProbability(PdkBotView view)
{
int myPos = view.MyPos;
var hand = view.MyHand;
int sims = Math.Min(_simulations, 600); // 包庄模拟用 600 次,比出牌少
int wins = 0;
for (int s = 0; s < sims; s++)
{
if (SimulateWin(hand, view))
wins++;
}
return (double)wins / sims;
}
/// <summary>模拟一局只看胜负——不指定第一步出什么</summary>
private bool SimulateWin(TCardInfoPdkF[] myHand, PdkBotView view)
{
int myPos = view.MyPos;
int nextPos = myPos % 3 + 1;
int oppPos = (myPos + 1) % 3 + 1;
var hands = new List<TCardInfoPdkF>[3];
hands[myPos - 1] = new List<TCardInfoPdkF>(myHand);
hands[nextPos - 1] = new List<TCardInfoPdkF>();
hands[oppPos - 1] = new List<TCardInfoPdkF>();
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));
// 模拟到有人出完
int current = myPos;
var maxPlay = new PlayOutCardPdkF(); // GameNum=0 → 新一轮
int maxPlayer = 0;
for (int move = 0; move < 400; move++)
{
var curHand = hands[current - 1];
if (curHand.Count == 0) return current == myPos;
bool isNewRound = maxPlayer == current || maxPlay.GameNum == 0;
var curMax = isNewRound ? new PlayOutCardPdkF() : maxPlay;
var tips = PdkCardAlgorithm.GetTipCard(curMax, curHand.ToArray(), null, false);
if (tips != null && tips.Count > 0)
{
var pick = tips[0];
maxPlay = new PlayOutCardPdkF
{
Pos = (byte)current,
GameNum = pick[0].GameNum,
Type = pick.Count == 1 ? CardType1.DanZhang : CardType1.DuiZi,
Ids = pick.Select(c => c.ID).ToArray()
};
maxPlayer = current;
foreach (var id in maxPlay.Ids)
curHand.RemoveAll(c => c.ID == id);
}
current = current % 3 + 1;
}
return hands[myPos - 1].Count <= hands[nextPos - 1].Count
&& hands[myPos - 1].Count <= hands[oppPos - 1].Count;
}
public PlayOutCardPdkF DecidePlay(PdkBotView view)

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -1 +1 @@
{"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"}}
{"CardPack":{"Cards":[{"CardInfos":[{"Flower":1,"Num":2,"GameState":1,"ID":2,"GameNum":16},{"Flower":3,"Num":1,"GameState":1,"ID":27,"GameNum":14},{"Flower":3,"Num":13,"GameState":1,"ID":39,"GameNum":13},{"Flower":4,"Num":13,"GameState":1,"ID":52,"GameNum":13},{"Flower":3,"Num":11,"GameState":1,"ID":37,"GameNum":11},{"Flower":4,"Num":11,"GameState":1,"ID":50,"GameNum":11},{"Flower":1,"Num":8,"GameState":1,"ID":8,"GameNum":8},{"Flower":3,"Num":8,"GameState":1,"ID":34,"GameNum":8},{"Flower":4,"Num":8,"GameState":1,"ID":47,"GameNum":8},{"Flower":2,"Num":7,"GameState":1,"ID":20,"GameNum":7},{"Flower":3,"Num":6,"GameState":1,"ID":32,"GameNum":6},{"Flower":1,"Num":5,"GameState":1,"ID":5,"GameNum":5},{"Flower":1,"Num":4,"GameState":1,"ID":4,"GameNum":4},{"Flower":4,"Num":4,"GameState":1,"ID":43,"GameNum":4},{"Flower":1,"Num":3,"GameState":1,"ID":3,"GameNum":3},{"Flower":2,"Num":3,"GameState":1,"ID":16,"GameNum":3}]},{"CardInfos":[{"Flower":1,"Num":13,"GameState":1,"ID":13,"GameNum":13},{"Flower":2,"Num":12,"GameState":1,"ID":25,"GameNum":12},{"Flower":4,"Num":12,"GameState":1,"ID":51,"GameNum":12},{"Flower":1,"Num":11,"GameState":1,"ID":11,"GameNum":11},{"Flower":1,"Num":10,"GameState":1,"ID":10,"GameNum":10},{"Flower":4,"Num":10,"GameState":1,"ID":49,"GameNum":10},{"Flower":1,"Num":9,"GameState":1,"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":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":4,"Num":6,"GameState":1,"ID":45,"GameNum":6},{"Flower":2,"Num":4,"GameState":1,"ID":17,"GameNum":4},{"Flower":3,"Num":3,"GameState":1,"ID":29,"GameNum":3},{"Flower":4,"Num":3,"ID":42,"GameNum":3}]},{"CardInfos":[{"Flower":1,"Num":1,"GameState":1,"ID":1,"GameNum":14},{"Flower":4,"Num":1,"GameState":1,"ID":40,"GameNum":14},{"Flower":2,"Num":13,"GameState":1,"ID":26,"GameNum":13},{"Flower":1,"Num":12,"GameState":1,"ID":12,"GameNum":12},{"Flower":3,"Num":12,"GameState":1,"ID":38,"GameNum":12},{"Flower":2,"Num":11,"GameState":1,"ID":24,"GameNum":11},{"Flower":2,"Num":10,"GameState":1,"ID":23,"GameNum":10},{"Flower":3,"Num":10,"GameState":1,"ID":36,"GameNum":10},{"Flower":2,"Num":9,"GameState":1,"ID":22,"GameNum":9},{"Flower":1,"Num":7,"GameState":1,"ID":7,"GameNum":7},{"Flower":3,"Num":7,"GameState":1,"ID":33,"GameNum":7},{"Flower":4,"Num":7,"GameState":1,"ID":46,"GameNum":7},{"Flower":2,"Num":5,"GameState":1,"ID":18,"GameNum":5},{"Flower":3,"Num":5,"GameState":1,"ID":31,"GameNum":5},{"Flower":4,"Num":5,"GameState":1,"ID":44,"GameNum":5},{"Flower":3,"Num":4,"ID":30,"GameNum":4}]}]},"Info":{"GameZT":4,"MaxPlayCard":{"Pos":3,"Type":2,"GameNum":4,"Ids":"Hg=="},"ActivePlayCard":{"Pos":3,"Type":2,"GameNum":4,"Ids":"Hg=="},"WhoPlay":3,"FistPlay":1,"BaoZhuang":"AgEB","PlayNum":3,"OverPos":3,"ZhaDans":[0,0,0],"ShenYuCard":"EA8P","Score":[0,0,0],"BaoPos":2,"PlayTuoGauan":"AAAA"}}

View File

@ -1,75 +1,82 @@
[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
[07/07/2026 13:29:25]:关牌玩法, 首局黑桃3先出, 四带三, 炸弹加10, 包庄, 必压,
[07/07/2026 13:29:25]:-------------1开始-----------------------------
[07/07/2026 13:29:25]:ID:2 花色:黑桃 大小:2_16 分:0 状态:在手上
[07/07/2026 13:29:25]:ID:27 花色:梅花 大小:1_14 分:0 状态:在手上
[07/07/2026 13:29:25]:ID:39 花色:梅花 大小:13_13 分:0 状态:在手上
[07/07/2026 13:29:25]:ID:52 花色:方块 大小:13_13 分:0 状态:在手上
[07/07/2026 13:29:25]:ID:37 花色:梅花 大小:11_11 分:0 状态:在手上
[07/07/2026 13:29:25]:ID:50 花色:方块 大小:11_11 分:0 状态:在手上
[07/07/2026 13:29:25]:ID:8 花色:黑桃 大小:8_8 分:0 状态:在手上
[07/07/2026 13:29:25]:ID:34 花色:梅花 大小:8_8 分:0 状态:在手上
[07/07/2026 13:29:25]:ID:47 花色:方块 大小:8_8 分:0 状态:在手上
[07/07/2026 13:29:25]:ID:20 花色:红桃 大小:7_7 分:0 状态:在手上
[07/07/2026 13:29:25]:ID:32 花色:梅花 大小:6_6 分:0 状态:在手上
[07/07/2026 13:29:25]:ID:5 花色:黑桃 大小:5_5 分:0 状态:在手上
[07/07/2026 13:29:25]:ID:4 花色:黑桃 大小:4_4 分:0 状态:在手上
[07/07/2026 13:29:25]:ID:43 花色:方块 大小:4_4 分:0 状态:在手上
[07/07/2026 13:29:25]:ID:3 花色:黑桃 大小:3_3 分:0 状态:在手上
[07/07/2026 13:29:25]:ID:16 花色:红桃 大小:3_3 分:0 状态:在手上
[07/07/2026 13:29:25]:-------------2开始-----------------------------
[07/07/2026 13:29:25]:ID:13 花色:黑桃 大小:13_13 分:0 状态:在手上
[07/07/2026 13:29:25]:ID:25 花色:红桃 大小:12_12 分:0 状态:在手上
[07/07/2026 13:29:25]:ID:51 花色:方块 大小:12_12 分:0 状态:在手上
[07/07/2026 13:29:25]:ID:11 花色:黑桃 大小:11_11 分:0 状态:在手上
[07/07/2026 13:29:25]:ID:10 花色:桃 大小:10_10 分:0 状态:在手上
[07/07/2026 13:29:25]:ID:49 花色:方块 大小:10_10 分:0 状态:在手上
[07/07/2026 13:29:25]:ID:9 花色:黑桃 大小:9_9 分:0 状态:在手上
[07/07/2026 13:29:25]:ID:35 花色:梅花 大小:9_9 分:0 状态:在手上
[07/07/2026 13:29:25]:ID:48 花色:方块 大小:9_9 分:0 状态:在手上
[07/07/2026 13:29:25]:ID:21 花色:红桃 大小:8_8 分:0 状态:在手上
[07/07/2026 13:29:25]:ID:6 花色:黑桃 大小:6_6 分:0 状态:在手上
[07/07/2026 13:29:25]:ID:19 花色:桃 大小:6_6 分:0 状态:在手上
[07/07/2026 13:29:25]:ID:45 花色:方块 大小:6_6 分:0 状态:在手上
[07/07/2026 13:29:25]:ID:17 花色:红桃 大小:4_4 分:0 状态:在手上
[07/07/2026 13:29:25]:ID:29 花色:梅花 大小:3_3 分:0 状态:在手上
[07/07/2026 13:29:25]:ID:42 花色:方块 大小:3_3 分:0 状态:在手上
[07/07/2026 13:29:25]:-------------3开始-----------------------------
[07/07/2026 13:29:25]:ID:1 花色:黑桃 大小:1_14 分:0 状态:在手上
[07/07/2026 13:29:25]:ID:40 花色:方块 大小:1_14 分:0 状态:在手上
[07/07/2026 13:29:25]:ID:26 花色:桃 大小:13_13 分:0 状态:在手上
[07/07/2026 13:29:25]:ID:12 花色:黑桃 大小:12_12 分:0 状态:在手上
[07/07/2026 13:29:25]:ID:38 花色:梅花 大小:12_12 分:0 状态:在手上
[07/07/2026 13:29:25]:ID:24 花色:红桃 大小:11_11 分:0 状态:在手上
[07/07/2026 13:29:25]:ID:23 花色:桃 大小:10_10 分:0 状态:在手上
[07/07/2026 13:29:25]:ID:36 花色:梅花 大小:10_10 分:0 状态:在手上
[07/07/2026 13:29:25]:ID:22 花色:红桃 大小:9_9 分:0 状态:在手上
[07/07/2026 13:29:25]:ID:7 花色:桃 大小:7_7 分:0 状态:在手上
[07/07/2026 13:29:25]:ID:33 花色:梅花 大小:7_7 分:0 状态:在手上
[07/07/2026 13:29:25]:ID:46 花色:方块 大小:7_7 分:0 状态:在手上
[07/07/2026 13:29:25]:ID:18 花色:红桃 大小:5_5 分:0 状态:在手上
[07/07/2026 13:29:25]:ID:31 花色:梅花 大小:5_5 分:0 状态:在手上
[07/07/2026 13:29:25]:ID:44 花色:方块 大小:5_5 分:0 状态:在手上
[07/07/2026 13:29:25]:ID:30 花色:梅花 大小:4_4 分:0 状态:在手上
[07/07/2026 13:29:25]:玩家:0,bombCount:0
[07/07/2026 13:29:25]:玩家:1,bombCount:0
[07/07/2026 13:29:25]:玩家:2,bombCount:0
[07/07/2026 13:29:25]:第一个出牌位置:1,开始次数0上游玩家0
[07/07/2026 13:29:25]:whoPlay:1
[07/07/2026 13:29:25]:保存文件:./gamepack/gamepack2026-07-07-13-29-25-456.txt
[07/07/2026 13:29:25]:bot-包庄: pos1=不
[07/07/2026 13:29:25]:whoPlay:2
[07/07/2026 13:29:25]:保存文件:./gamepack/gamepack2026-07-07-13-29-25-606.txt
[07/07/2026 13:29:25]:bot-包庄: pos2=包
[07/07/2026 13:29:25]:whoPlay:3
[07/07/2026 13:29:25]:保存文件:./gamepack/gamepack2026-07-07-13-29-25-748.txt
[07/07/2026 13:29:25]:bot-包庄: pos3=包
[07/07/2026 13:29:25]:进入打牌play:2 包庄玩家的位置2
[07/07/2026 13:29:25]:whoPlay:2
[07/07/2026 13:29:25]:保存文件:./gamepack/gamepack2026-07-07-13-29-25-884.txt
[07/07/2026 13:29:26]:进入打牌流程,玩家出牌内容是pos:2 type:DanZhang num:3 ids:len:1--42
[07/07/2026 13:29:26]:---------------------2----- shengyu:15-------------
[07/07/2026 13:29:26]:whoPlay:3
[07/07/2026 13:29:26]:保存文件:./gamepack/gamepack2026-07-07-13-29-26-037.txt
[07/07/2026 13:29:26]:进入打牌流程,玩家出牌内容是pos:3 type:DanZhang num:4 ids:len:1--30
[07/07/2026 13:29:26]:---------------------3----- shengyu:15-------------
[07/07/2026 13:29:26]:whoPlay:3
[07/07/2026 13:29:26]:保存文件:./gamepack/gamepack2026-07-07-13-29-26-188.txt
[07/07/2026 13:29:26]:进入结算 bao:2,overpos:3
[07/07/2026 13:29:26]:baowin:False
[07/07/2026 13:29:26]:玩家1 输赢32
[07/07/2026 13:29:26]:玩家2 ,输赢:-64
[07/07/2026 13:29:26]:玩家3 输赢32
[07/07/2026 13:29:26]:test over