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启动)
This commit is contained in:
194
PdkFriendServer/Logic/PdkBot.cs
Normal file
194
PdkFriendServer/Logic/PdkBot.cs
Normal file
@ -0,0 +1,194 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using GameFix.PaoDeKuaiF;
|
||||
using GameFix.Poker;
|
||||
using GameMessage;
|
||||
using GameMessage.PaoDeKuaiF;
|
||||
|
||||
namespace PdkFriendServer.Logic
|
||||
{
|
||||
/// <summary>
|
||||
/// 机器人可见的牌局信息(模拟真人视角——只看自己手牌+桌面公开信息)
|
||||
/// </summary>
|
||||
public class PdkBotView
|
||||
{
|
||||
/// <summary>我的手牌(仅本轮可出的牌,GameState==1)</summary>
|
||||
public TCardInfoPdkF[] MyHand { get; init; }
|
||||
|
||||
/// <summary>桌上最后一手牌(谁打的什么),GameNum==0表示桌上无牌/新一轮</summary>
|
||||
public PlayOutCardPdkF MaxPlayCard { get; init; }
|
||||
|
||||
/// <summary>当前轮到谁出牌(1-indexed)</summary>
|
||||
public int WhoPlay { get; init; }
|
||||
|
||||
/// <summary>我在第几个位置(1-indexed)</summary>
|
||||
public int MyPos { get; init; }
|
||||
|
||||
/// <summary>各玩家剩余牌数 [pos0,pos1,pos2]</summary>
|
||||
public byte[] ShenYuCard { get; init; }
|
||||
|
||||
/// <summary>各玩家已出炸弹数</summary>
|
||||
public int[] ZhaDans { get; init; }
|
||||
|
||||
/// <summary>游戏规则</summary>
|
||||
public PdkRule Rule { get; init; }
|
||||
|
||||
/// <summary>当前游戏阶段 3=包庄 4=打牌</summary>
|
||||
public int GameZT { get; init; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 机器人决策接口——外挂接入点
|
||||
/// </summary>
|
||||
public interface IPdkBot
|
||||
{
|
||||
/// <summary>包庄决策</summary>
|
||||
bool DecideBaoZhuang(PdkBotView view);
|
||||
|
||||
/// <summary>打牌决策:返回要出的牌(空=不要)</summary>
|
||||
PlayOutCardPdkF DecidePlay(PdkBotView view);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 跑得快最优出牌机器人 — 有限信息策略
|
||||
/// 只能看到自己手牌+桌面公开信息(最后出牌、各家剩余张数)
|
||||
/// </summary>
|
||||
public class PdkBot : IPdkBot
|
||||
{
|
||||
public bool DecideBaoZhuang(PdkBotView view)
|
||||
{
|
||||
// 简单策略:手牌好的话包庄(手牌≤10张说明大牌多)
|
||||
return view.MyHand.Length <= 10;
|
||||
}
|
||||
|
||||
public PlayOutCardPdkF DecidePlay(PdkBotView view)
|
||||
{
|
||||
var hand = view.MyHand;
|
||||
bool isFirstPlay = view.MaxPlayCard.GameNum <= 0;
|
||||
|
||||
// 获取合法出牌方案
|
||||
var maxHand = isFirstPlay ? null
|
||||
: GetMaxPlayerHand(view);
|
||||
var tips = PdkCardAlgorithm.GetTipCard(
|
||||
view.MaxPlayCard,
|
||||
hand,
|
||||
maxHand, // null = 不限上家手牌(因为我们不知道)
|
||||
view.Rule.AAAIsZhaDan);
|
||||
|
||||
var candidates = new List<(PlayOutCardPdkF play, int score)>();
|
||||
|
||||
// 不要(不是先出时可选)
|
||||
if (!isFirstPlay)
|
||||
candidates.Add((Pass(view), ScorePass(view)));
|
||||
|
||||
if (tips != null)
|
||||
{
|
||||
foreach (var tip in tips)
|
||||
{
|
||||
var play = MakePlay(tip, view.MyPos);
|
||||
candidates.Add((play, ScorePlay(play, hand.Length - tip.Count, view)));
|
||||
}
|
||||
}
|
||||
|
||||
if (candidates.Count == 0)
|
||||
return Pass(view);
|
||||
|
||||
candidates.Sort((a, b) => b.score.CompareTo(a.score));
|
||||
var best = candidates[0];
|
||||
var desc = best.play.Type == CardType1.None ? "pass" : $"{best.play.Type}:{best.play.Ids?.Length ?? 0}cards";
|
||||
System.Console.WriteLine($"[Bot pos{view.MyPos}] hand:{hand.Length} L:{GetLeftCount(view)} R:{GetRightCount(view)} => {desc}");
|
||||
return best.play;
|
||||
}
|
||||
|
||||
// ---- 辅助方法 ----
|
||||
|
||||
private static PlayOutCardPdkF MakePlay(List<TCardInfoPdkF> cards, int pos)
|
||||
{
|
||||
return new PlayOutCardPdkF
|
||||
{
|
||||
Pos = (byte)pos,
|
||||
GameNum = cards[0].GameNum,
|
||||
Ids = cards.Select(x => x.ID).ToArray(),
|
||||
Type = cards.Count == 1 ? CardType1.DanZhang
|
||||
: cards.Count == 2 ? CardType1.DuiZi
|
||||
: cards.Count == 4 && cards.All(c => c.GameNum == cards[0].GameNum) ? CardType1.ZhaDan
|
||||
: CardType1.DanZhang // 精确牌型由CheckPack/GetOutCard修正
|
||||
};
|
||||
}
|
||||
|
||||
private static PlayOutCardPdkF Pass(PdkBotView view)
|
||||
{
|
||||
return new PlayOutCardPdkF { Pos = (byte)view.MyPos, Type = CardType1.None };
|
||||
}
|
||||
|
||||
private static TCardInfoPdkF[] GetMaxPlayerHand(PdkBotView view)
|
||||
{
|
||||
// 我们不知道上家具体手牌,返回null让GetTipCard忽略maxHand限制
|
||||
return null;
|
||||
}
|
||||
|
||||
// ---- 评分引擎 ----
|
||||
|
||||
private int ScorePlay(PlayOutCardPdkF play, int remainingAfter, PdkBotView view)
|
||||
{
|
||||
int score = 0;
|
||||
int leftCnt = GetLeftCount(view);
|
||||
int rightCnt = GetRightCount(view);
|
||||
|
||||
// 1. 直接赢
|
||||
if (remainingAfter == 0) return 10000;
|
||||
|
||||
// 2. 对手威胁
|
||||
if (leftCnt <= 3 || rightCnt <= 3) score += 300;
|
||||
if (leftCnt <= 2 || rightCnt <= 2) score += 500;
|
||||
|
||||
// 3. 牌效率:剩余越少越好
|
||||
score += (20 - remainingAfter) * 15;
|
||||
|
||||
// 4. 炸弹:留到关键时刻
|
||||
bool isBomb = play.Type == CardType1.ZhaDan ||
|
||||
(play.Ids != null && play.Ids.Length == 4 &&
|
||||
view.MyHand.Count(x => x.GameNum == play.GameNum && x.GameState == 1) == 4);
|
||||
if (isBomb)
|
||||
{
|
||||
if (leftCnt <= 5 || rightCnt <= 5) score += 400; // 对手快赢了
|
||||
else if (remainingAfter <= 4) score += 200; // 自己快赢了
|
||||
else score -= 80; // 先留着
|
||||
}
|
||||
|
||||
// 5. 出更多牌更好
|
||||
int cardsOut = view.MyHand.Length - remainingAfter;
|
||||
score += cardsOut * 8;
|
||||
|
||||
// 6. 保持先手权
|
||||
if (play.Type != CardType1.None) score += 60;
|
||||
|
||||
// 7. 黑桃3首局必出
|
||||
if (view.Rule.HeiTao3BiChu && view.MaxPlayCard.GameNum <= 0)
|
||||
if (play.Ids != null && play.Ids.Any(x => x == 3)) score += 150;
|
||||
|
||||
return score;
|
||||
}
|
||||
|
||||
private int ScorePass(PdkBotView view)
|
||||
{
|
||||
int score = -80;
|
||||
// 对手快赢时不要很危险
|
||||
if (GetLeftCount(view) <= 3 || GetRightCount(view) <= 3) score -= 400;
|
||||
return score;
|
||||
}
|
||||
|
||||
private int GetLeftCount(PdkBotView view)
|
||||
{
|
||||
int next = view.MyPos % view.ShenYuCard.Length;
|
||||
return view.ShenYuCard[next];
|
||||
}
|
||||
|
||||
private int GetRightCount(PdkBotView view)
|
||||
{
|
||||
int prev = (view.MyPos - 2 + view.ShenYuCard.Length) % view.ShenYuCard.Length;
|
||||
return view.ShenYuCard[prev];
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -40,12 +40,47 @@ namespace PdkFriendServer.Logic
|
||||
/// </summary>
|
||||
public PdkGameDo DeskGameDo = null;
|
||||
|
||||
/// <summary>
|
||||
/// 机器人玩家 [pos0,pos1,pos2],null=人工
|
||||
/// </summary>
|
||||
private IPdkBot[] _bots = null;
|
||||
|
||||
/// <summary>
|
||||
/// 启用 Bot 自动对局
|
||||
/// </summary>
|
||||
public bool BotMode { get; set; }
|
||||
|
||||
public PdkGameMain(PdkGameDo _gamedo)
|
||||
{
|
||||
this.DeskGameDo = _gamedo;
|
||||
this.GamePack = new PdkGamePack();
|
||||
}
|
||||
|
||||
/// <summary>懒初始化3个bot(BotMode==true时首次WaitWanJiaShuRu调用)</summary>
|
||||
private void InitBots()
|
||||
{
|
||||
_bots = new IPdkBot[3];
|
||||
for (int i = 0; i < 3; i++)
|
||||
_bots[i] = new PdkBot();
|
||||
}
|
||||
|
||||
/// <summary>构建当前玩家的可见视图——只看自己手牌+公开信息</summary>
|
||||
private PdkBotView BuildBotView(int pos)
|
||||
{
|
||||
return new PdkBotView
|
||||
{
|
||||
MyHand = GamePack.CardPack.Cards[pos - 1].CardInfos
|
||||
.Where(x => x.GameState == 1).ToArray(),
|
||||
MaxPlayCard = GamePack.Info.MaxPlayCard,
|
||||
WhoPlay = pos,
|
||||
MyPos = pos,
|
||||
ShenYuCard = GamePack.Info.ShenYuCard,
|
||||
ZhaDans = GamePack.Info.ZhaDans,
|
||||
Rule = this.Rule,
|
||||
GameZT = GamePack.Info.GameZT
|
||||
};
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 游戏开始
|
||||
/// </summary>
|
||||
@ -241,7 +276,7 @@ namespace PdkFriendServer.Logic
|
||||
{
|
||||
if (GamePack.Info.BaoZhuang[i] == 0)
|
||||
{
|
||||
// GamePack.Info.WhoPlay = GetNextPos(GamePack.Info.WhoPlay);
|
||||
GamePack.Info.WhoPlay = (byte)(i + 1);
|
||||
SendPack();
|
||||
return; //还有玩家没有操作,不处理流程
|
||||
}
|
||||
@ -505,6 +540,7 @@ namespace PdkFriendServer.Logic
|
||||
|
||||
void SetFalseOperation()
|
||||
{
|
||||
if (DeskGameDo == null) return;
|
||||
for (int i = 0; i < GamePack.Info.PlayNum; i++)
|
||||
{
|
||||
this.SetWaitOperation(i, false);
|
||||
@ -611,75 +647,79 @@ namespace PdkFriendServer.Logic
|
||||
void WaitWanJiaShuRu()
|
||||
{
|
||||
if (DeskGameDo != null) return;
|
||||
//正式连客户端以后要屏蔽这些代码。return
|
||||
string str = "";
|
||||
byte num = 0;
|
||||
int pos = GamePack.Info.WhoPlay;
|
||||
switch (GamePack.Info.GameZT)
|
||||
{
|
||||
case 3://包庄流程,只能输入1和2
|
||||
Log("包庄操作 pos:" + GamePack.Info.WhoPlay);
|
||||
case 3://包庄流程
|
||||
{
|
||||
// Bot 接管:懒初始化
|
||||
if (BotMode && _bots == null)
|
||||
InitBots();
|
||||
if (_bots != null && _bots[pos - 1] != null)
|
||||
{
|
||||
var view = BuildBotView(pos);
|
||||
var bao = _bots[pos - 1].DecideBaoZhuang(view);
|
||||
GamePack.Info.BaoZhuang[pos - 1] = bao ? (byte)1 : (byte)2;
|
||||
Log($"bot-包庄: pos{pos}={(bao ? "包" : "不包")}");
|
||||
return;
|
||||
}
|
||||
// 人工输入
|
||||
Log("包庄操作 pos:" + pos);
|
||||
while (true)
|
||||
{
|
||||
str = Console.ReadLine();
|
||||
string str = Console.ReadLine();
|
||||
if (string.IsNullOrWhiteSpace(str)) continue;
|
||||
Log(str);
|
||||
var ss = str.Split(',');
|
||||
if (ss.Length < 2) continue;
|
||||
byte.TryParse(ss[0], out var pos);
|
||||
byte.TryParse(ss[1], out num);
|
||||
GamePack.Info.WhoPlay = pos;
|
||||
GamePack.Info.BaoZhuang[pos - 1] = num;
|
||||
if (CheckPack(GamePack.Info))
|
||||
{
|
||||
break; //如果包输入正确就跳走
|
||||
}
|
||||
else
|
||||
{
|
||||
Log("检测不合格,输入非法值");
|
||||
}
|
||||
byte.TryParse(ss[0], out var ipos);
|
||||
byte.TryParse(ss[1], out byte num);
|
||||
GamePack.Info.WhoPlay = ipos;
|
||||
GamePack.Info.BaoZhuang[ipos - 1] = num;
|
||||
if (CheckPack(GamePack.Info)) break;
|
||||
Log("检测不合格,输入非法值");
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 4: //打牌流程
|
||||
Log("打牌操作 pos:" + GamePack.Info.WhoPlay);
|
||||
{
|
||||
// Bot 接管:懒初始化
|
||||
if (BotMode && _bots == null)
|
||||
InitBots();
|
||||
if (_bots != null && _bots[pos - 1] != null)
|
||||
{
|
||||
var view = BuildBotView(pos);
|
||||
var botPlay = _bots[pos - 1].DecidePlay(view);
|
||||
GamePack.Info.ActivePlayCard = botPlay;
|
||||
return;
|
||||
}
|
||||
// 人工输入
|
||||
Log("打牌操作 pos:" + pos);
|
||||
while (true)
|
||||
{
|
||||
str = Console.ReadLine(); //逗号分隔
|
||||
string str = Console.ReadLine();
|
||||
if (string.IsNullOrWhiteSpace(str)) continue;
|
||||
var ss = str.Split(',');
|
||||
if (ss.Length <= 0) continue;
|
||||
Log(str);
|
||||
var selectCards = GamePack.CardPack.Cards[GamePack.Info.WhoPlay - 1].CardInfos.Where(x => ss.Any(s => s == x.ID.ToString())).ToArray();
|
||||
var selectCards = GamePack.CardPack.Cards[pos - 1].CardInfos
|
||||
.Where(x => ss.Any(s => s == x.ID.ToString())).ToArray();
|
||||
PlayOutCardPdkF payCard;
|
||||
if (selectCards == null || selectCards.Length <= 0) //不要
|
||||
if (selectCards == null || selectCards.Length <= 0)
|
||||
{
|
||||
payCard = new PlayOutCardPdkF();
|
||||
payCard.Pos = GamePack.Info.WhoPlay;
|
||||
payCard.Type = CardType1.None;
|
||||
payCard = new PlayOutCardPdkF { Pos = (byte)pos, Type = CardType1.None };
|
||||
GamePack.Info.ActivePlayCard = payCard;
|
||||
if (CheckPack(GamePack.Info))
|
||||
{
|
||||
break; //如果包输入正确就跳走
|
||||
}
|
||||
else
|
||||
{
|
||||
Log("检测不合格,输入非法值");
|
||||
}
|
||||
|
||||
if (CheckPack(GamePack.Info)) break;
|
||||
Log("检测不合格,输入非法值");
|
||||
}
|
||||
else if (PdkCardAlgorithm.GetOutCard(selectCards,
|
||||
GamePack.CardPack.Cards[GamePack.Info.WhoPlay - 1].CardInfos.Where(x => x.GameState == 1).ToArray(),
|
||||
GamePack.CardPack.Cards[pos - 1].CardInfos.Where(x => x.GameState == 1).ToArray(),
|
||||
this.Rule, out payCard))
|
||||
{
|
||||
payCard.Pos = GamePack.Info.WhoPlay;
|
||||
payCard.Pos = (byte)pos;
|
||||
GamePack.Info.ActivePlayCard = payCard;
|
||||
if (CheckPack(GamePack.Info))
|
||||
{
|
||||
break; //如果包输入正确就跳走
|
||||
}
|
||||
else
|
||||
{
|
||||
Log("检测不合格,输入非法值");
|
||||
}
|
||||
if (CheckPack(GamePack.Info)) break;
|
||||
Log("检测不合格,输入非法值");
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -687,10 +727,7 @@ namespace PdkFriendServer.Logic
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case 6:
|
||||
//GameOver();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -1 +1 @@
|
||||
{"CardPack":{"Cards":[{"CardInfos":[{"Flower":1,"Num":1,"GameState":1,"ID":1,"GameNum":14},{"Flower":3,"Num":1,"GameState":1,"ID":27,"GameNum":14},{"Flower":1,"Num":13,"GameState":1,"ID":13,"GameNum":13},{"Flower":2,"Num":13,"GameState":1,"ID":26,"GameNum":13},{"Flower":2,"Num":12,"GameState":1,"ID":25,"GameNum":12},{"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":3,"Num":9,"GameState":1,"ID":35,"GameNum":9},{"Flower":1,"Num":8,"GameState":1,"ID":8,"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":6,"GameState":1,"ID":6,"GameNum":6},{"Flower":4,"Num":5,"GameState":1,"ID":44,"GameNum":5},{"Flower":2,"Num":4,"GameState":1,"ID":17,"GameNum":4},{"Flower":1,"Num":3,"GameState":1,"ID":3,"GameNum":3}]},{"CardInfos":[{"Flower":4,"Num":1,"GameState":1,"ID":40,"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":12,"GameState":1,"ID":38,"GameNum":12},{"Flower":4,"Num":12,"GameState":1,"ID":51,"GameNum":12},{"Flower":1,"Num":10,"GameState":1,"ID":10,"GameNum":10},{"Flower":4,"Num":10,"GameState":1,"ID":49,"GameNum":10},{"Flower":4,"Num":9,"GameState":1,"ID":48,"GameNum":9},{"Flower":2,"Num":7,"GameState":1,"ID":20,"GameNum":7},{"Flower":3,"Num":7,"GameState":1,"ID":33,"GameNum":7},{"Flower":4,"Num":7,"GameState":1,"ID":46,"GameNum":7},{"Flower":4,"Num":6,"GameState":1,"ID":45,"GameNum":6},{"Flower":1,"Num":4,"GameState":1,"ID":4,"GameNum":4},{"Flower":3,"Num":4,"GameState":1,"ID":30,"GameNum":4},{"Flower":4,"Num":4,"GameState":1,"ID":43,"GameNum":4},{"Flower":4,"Num":3,"GameState":1,"ID":42,"GameNum":3}]},{"CardInfos":[{"Flower":1,"Num":2,"GameState":1,"ID":2,"GameNum":16},{"Flower":1,"Num":12,"GameState":1,"ID":12,"GameNum":12},{"Flower":1,"Num":11,"GameState":1,"ID":11,"GameNum":11},{"Flower":2,"Num":11,"GameState":1,"ID":24,"GameNum":11},{"Flower":3,"Num":11,"GameState":1,"ID":37,"GameNum":11},{"Flower":4,"Num":11,"GameState":1,"ID":50,"GameNum":11},{"Flower":1,"Num":9,"GameState":1,"ID":9,"GameNum":9},{"Flower":2,"Num":8,"GameState":1,"ID":21,"GameNum":8},{"Flower":4,"Num":8,"GameState":1,"ID":47,"GameNum":8},{"Flower":2,"Num":6,"GameState":1,"ID":19,"GameNum":6},{"Flower":3,"Num":6,"GameState":1,"ID":32,"GameNum":6},{"Flower":1,"Num":5,"GameState":1,"ID":5,"GameNum":5},{"Flower":2,"Num":5,"GameState":1,"ID":18,"GameNum":5},{"Flower":3,"Num":5,"GameState":1,"ID":31,"GameNum":5},{"Flower":2,"Num":3,"GameState":1,"ID":16,"GameNum":3},{"Flower":3,"Num":3,"GameState":1,"ID":29,"GameNum":3}]}]},"Info":{"GameZT":3,"WhoPlay":3,"FistPlay":1,"BaoZhuang":"AAAB","PlayNum":3,"ZhaDans":[0,0,0],"ShenYuCard":"EBAQ","Score":[0,0,0],"PlayTuoGauan":"AAAA"}}
|
||||
{"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"}}
|
||||
@ -7,12 +7,14 @@ namespace hjha_console
|
||||
{
|
||||
static void Main(string[] args)
|
||||
{
|
||||
Console.WriteLine("=== HJHA Console Mode - 跑得快测试 ===");
|
||||
Console.WriteLine("启动游戏状态机:发牌 → 包庄 → 打牌 → 结算");
|
||||
Console.WriteLine("=== HJHA Console Mode - 跑得快 Bot对局 (3人自动) ===");
|
||||
Console.WriteLine("牌型:关牌玩法 16张/人 | 策略:score-based optimal");
|
||||
Console.WriteLine();
|
||||
|
||||
string jsonPath = args.Length > 0 ? args[0] : null;
|
||||
var main = new PdkGameMain(null);
|
||||
main.BotMode = true;
|
||||
|
||||
string jsonPath = args.Length > 0 ? args[0] : null;
|
||||
main.Test(jsonPath ?? "");
|
||||
}
|
||||
}
|
||||
|
||||
400
output.txt
400
output.txt
@ -1,65 +1,335 @@
|
||||
[07/07/2026 12:56:25]:关牌玩法, 首局黑桃3先出, 四带三, 炸弹加10, 包庄, 必压,
|
||||
[07/07/2026 12:56:25]:-------------1开始-----------------------------
|
||||
[07/07/2026 12:56:25]:ID:1 花色:黑桃 大小:1_14 分:0 状态:在手上
|
||||
[07/07/2026 12:56:25]:ID:27 花色:梅花 大小:1_14 分:0 状态:在手上
|
||||
[07/07/2026 12:56:25]:ID:13 花色:黑桃 大小:13_13 分:0 状态:在手上
|
||||
[07/07/2026 12:56:25]:ID:26 花色:红桃 大小:13_13 分:0 状态:在手上
|
||||
[07/07/2026 12:56:25]:ID:25 花色:红桃 大小:12_12 分:0 状态:在手上
|
||||
[07/07/2026 12:56:25]:ID:23 花色:红桃 大小:10_10 分:0 状态:在手上
|
||||
[07/07/2026 12:56:25]:ID:36 花色:梅花 大小:10_10 分:0 状态:在手上
|
||||
[07/07/2026 12:56:25]:ID:22 花色:红桃 大小:9_9 分:0 状态:在手上
|
||||
[07/07/2026 12:56:25]:ID:35 花色:梅花 大小:9_9 分:0 状态:在手上
|
||||
[07/07/2026 12:56:25]:ID:8 花色:黑桃 大小:8_8 分:0 状态:在手上
|
||||
[07/07/2026 12:56:25]:ID:34 花色:梅花 大小:8_8 分:0 状态:在手上
|
||||
[07/07/2026 12:56:25]:ID:7 花色:黑桃 大小:7_7 分:0 状态:在手上
|
||||
[07/07/2026 12:56:25]:ID:6 花色:黑桃 大小:6_6 分:0 状态:在手上
|
||||
[07/07/2026 12:56:25]:ID:44 花色:方块 大小:5_5 分:0 状态:在手上
|
||||
[07/07/2026 12:56:25]:ID:17 花色:红桃 大小:4_4 分:0 状态:在手上
|
||||
[07/07/2026 12:56:25]:ID:3 花色:黑桃 大小:3_3 分:0 状态:在手上
|
||||
[07/07/2026 12:56:25]:-------------2开始-----------------------------
|
||||
[07/07/2026 12:56:25]:ID:40 花色:方块 大小:1_14 分:0 状态:在手上
|
||||
[07/07/2026 12:56:25]:ID:39 花色:梅花 大小:13_13 分:0 状态:在手上
|
||||
[07/07/2026 12:56:25]:ID:52 花色:方块 大小:13_13 分:0 状态:在手上
|
||||
[07/07/2026 12:56:25]:ID:38 花色:梅花 大小:12_12 分:0 状态:在手上
|
||||
[07/07/2026 12:56:25]:ID:51 花色:方块 大小:12_12 分:0 状态:在手上
|
||||
[07/07/2026 12:56:25]:ID:10 花色:黑桃 大小:10_10 分:0 状态:在手上
|
||||
[07/07/2026 12:56:25]:ID:49 花色:方块 大小:10_10 分:0 状态:在手上
|
||||
[07/07/2026 12:56:25]:ID:48 花色:方块 大小:9_9 分:0 状态:在手上
|
||||
[07/07/2026 12:56:25]:ID:20 花色:红桃 大小:7_7 分:0 状态:在手上
|
||||
[07/07/2026 12:56:25]:ID:33 花色:梅花 大小:7_7 分:0 状态:在手上
|
||||
[07/07/2026 12:56:25]:ID:46 花色:方块 大小:7_7 分:0 状态:在手上
|
||||
[07/07/2026 12:56:25]:ID:45 花色:方块 大小:6_6 分:0 状态:在手上
|
||||
[07/07/2026 12:56:25]:ID:4 花色:黑桃 大小:4_4 分:0 状态:在手上
|
||||
[07/07/2026 12:56:25]:ID:30 花色:梅花 大小:4_4 分:0 状态:在手上
|
||||
[07/07/2026 12:56:25]:ID:43 花色:方块 大小:4_4 分:0 状态:在手上
|
||||
[07/07/2026 12:56:25]:ID:42 花色:方块 大小:3_3 分:0 状态:在手上
|
||||
[07/07/2026 12:56:25]:-------------3开始-----------------------------
|
||||
[07/07/2026 12:56:25]:ID:2 花色:黑桃 大小:2_16 分:0 状态:在手上
|
||||
[07/07/2026 12:56:25]:ID:12 花色:黑桃 大小:12_12 分:0 状态:在手上
|
||||
[07/07/2026 12:56:25]:ID:11 花色:黑桃 大小:11_11 分:0 状态:在手上
|
||||
[07/07/2026 12:56:25]:ID:24 花色:红桃 大小:11_11 分:0 状态:在手上
|
||||
[07/07/2026 12:56:25]:ID:37 花色:梅花 大小:11_11 分:0 状态:在手上
|
||||
[07/07/2026 12:56:25]:ID:50 花色:方块 大小:11_11 分:0 状态:在手上
|
||||
[07/07/2026 12:56:25]:ID:9 花色:黑桃 大小:9_9 分:0 状态:在手上
|
||||
[07/07/2026 12:56:25]:ID:21 花色:红桃 大小:8_8 分:0 状态:在手上
|
||||
[07/07/2026 12:56:25]:ID:47 花色:方块 大小:8_8 分:0 状态:在手上
|
||||
[07/07/2026 12:56:25]:ID:19 花色:红桃 大小:6_6 分:0 状态:在手上
|
||||
[07/07/2026 12:56:25]:ID:32 花色:梅花 大小:6_6 分:0 状态:在手上
|
||||
[07/07/2026 12:56:25]:ID:5 花色:黑桃 大小:5_5 分:0 状态:在手上
|
||||
[07/07/2026 12:56:25]:ID:18 花色:红桃 大小:5_5 分:0 状态:在手上
|
||||
[07/07/2026 12:56:25]:ID:31 花色:梅花 大小:5_5 分:0 状态:在手上
|
||||
[07/07/2026 12:56:25]:ID:16 花色:红桃 大小:3_3 分:0 状态:在手上
|
||||
[07/07/2026 12:56:25]:ID:29 花色:梅花 大小:3_3 分:0 状态:在手上
|
||||
[07/07/2026 12:56:25]:玩家:0,bombCount:0
|
||||
[07/07/2026 12:56:25]:玩家:1,bombCount:0
|
||||
[07/07/2026 12:56:25]:玩家:2,bombCount:1
|
||||
[07/07/2026 12:56:25]:第一个出牌位置:1,开始次数:0,上游玩家:0
|
||||
[07/07/2026 12:56:25]:whoPlay:1
|
||||
[07/07/2026 12:56:25]:保存文件:./gamepack/gamepack2026-07-07-12-56-25-469.txt
|
||||
[07/07/2026 12:56:25]:包庄操作 pos:1
|
||||
[07/07/2026 12:56:25]:3,0
|
||||
[07/07/2026 12:56:25]:检测不合格,输入非法值
|
||||
[07/07/2026 12:56:25]:3,1
|
||||
[07/07/2026 12:56:25]:whoPlay:3
|
||||
[07/07/2026 12:56:25]:保存文件:./gamepack/gamepack2026-07-07-12-56-25-488.txt
|
||||
[07/07/2026 12:56:25]:包庄操作 pos:3
|
||||
[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!
|
||||
|
||||
Reference in New Issue
Block a user