- 名称:
德州扑克(Texas Hold'em)
- 作者:
Desom-fu
- 版本:
1.1.0
- 兼容版本:
理论兼容所有 3.0 以上的 OlivOS 版本
- 平台:
理论支持能够私聊的全平台(仅在 QQ 部署测试)
- 前置插件:
OlivaDiceCore
—
简介
本插件在群聊中提供一局多人德州扑克(Texas Hold’em)对局:建局、入座、发牌、盲注、四轮下注、公共牌、摊牌与边池结算。
—
下载
—
注意事项
- 本插件的操作在群内进行,底牌通过私聊发送。
- QQ 平台若未添加 bot 为好友,无法使用本插件(插件会拦截并提示),其他平台暂未做检测。
—
命令总览(前缀:.dz 或 .th)
建局/入场
.dz 创建 [底注]:创建房间(默认 1000;必须为 1000 倍数)
.dz 加入 [携带筹码]:加入游戏(默认=底注;必须>=底注且为 1000 倍数;允许同一 QQ 多次加入占不同座位)
.dz 退出:仅开局前退出(若同一 QQ 多座位,按后加入先退出)
.dz 开始:至少 2 人开始,发牌并扣盲注
.dz 解散:仅开局前(权限:座位 1/管理员/群主/骰主)
回合操作
.dz 看牌:群聊触发,bot 私聊返回手牌
.dz 跟 / .dz 跟注
.dz 过 / .dz 过牌
.dz 下 [数值]:翻牌后且无人下注时
.dz 加 [数值]:可不带数字,默认=最小加注
.dz 全压 / .dz 梭哈
.dz 弃 / .dz 弃牌
.dz 离场:强行弃牌+净身出户,筹码充公入池并移除座位
全局/管理
.dz 局势:查看当前局面
.dz 结束:开启结束开关,本手结算后结束游戏(不会自动开始下一手)
.dz 踢 [座位号]:踢人(权限:管理员/群主/骰主;逻辑同离场)
.dz 强制结束 / .dz halt / .dz stop:立即销毁数据,不结算(权限:管理员/群主/骰主)
—
规则
基本玩法
- 人数:2-10 人。
- 牌局流程:发两张底牌(私聊)→ 盲注 → 四轮下注(翻牌前 / 翻牌 / 转牌 / 河牌)→ 摊牌结算。
- 公共牌:翻牌发 3 张,转牌 1 张,河牌 1 张。
- 手牌评估:从“2 张底牌 + 5 张公共牌”的 7 张牌中,选最强 5 张组成牌型。
盲注与轮转
- 开始一手时自动扣小盲/大盲,并进入翻牌前行动。
- 庄位每手轮转;位置名称(BTN/SB/BB/UTG…)按庄位顺时针计算。
下注与行动
- 轮到你行动时,群内用指令操作;底牌查看使用
.dz 看牌(触发私聊)。
- 常见动作:
- 过牌:当前你不需要跟注且无人下注时可用。
- 跟注:补齐到当前需要跟到的额度。
- 下注:翻牌后且当前无人下注时,用
.dz 下 [数值]。
- 加注:用
.dz 加 [数值];可省略数值表示“按最小加注”。
- 全压:
.dz 全压(把剩余筹码一次性投入)。
- 弃牌:
.dz 弃牌(放弃争夺本手所有底池)。
全压、边池与“未被跟注返还”
- 若出现不同玩家投入额度不同,会按投入额度自动拆分为“主池/边池”。
- 未被跟注的超额投入会返还:例如 A 全压 1000,B 只能跟到 200,则 A 的多出来 800 属于未被跟注金额,会退回给 A(并在摊牌明细中显示“退还”)。
- 只要某一层底池存在至少 2 名可争夺玩家,就会按牌力结算,不会返还。
摊牌与结算
- 当所有仍在手牌的玩家都无需继续行动(包括全员全压)时,会自动补齐公共牌并进入摊牌。
- 摊牌会展示:公共牌、每位玩家底牌/凑牌/牌型、各奖池赢家与赢得金额;平分时余数会按固定规则分配(保证结果确定)。
—
规则入口
- 规则:使用
.help texas_rule 查看。
- 牌型比较:使用
.help texas_rank 查看。
—
使用示例
.dz 创建 1000
.dz 加入 5000
.dz 加入 5000
.dz 开始
.dz 看牌
.dz 局势
.dz 跟
.dz 弃牌
—
全部自定义回复
{
# 发送模式(防风控):1=纯文本;0/其它=转图片发送
'strTHSendMode': '0',
# 图片样式(颜色使用十六进制 #RRGGBB 或 #RRGGBBAA)
'strTHImgBgStart': '#F7DBFF',
'strTHImgBgEnd': '#FFFFFF',
'strTHImgTextDark': '#111827',
'strTHImgTextLight': '#F9FAFB',
'strTHImgFontSize': '18',
'strTHImgMaxWidth': '860',
'strTHImgPadding': '26',
'strTHImgLineSpacing': '10',
# 文字描边宽度(像素)。建议 1-3;0 表示不描边
'strTHImgStrokeWidth': '2',
'strTHImgCacheLimit': '60',
# 通用/错误
'strTHErrNotInGroup': '该指令仅支持在群聊中使用。',
'strTHErrRoomNotFound': '本群未建局,请先使用:.dz 创建 [基础筹码](默认1000)。',
'strTHErrAlreadyPlaying': '游戏已开始,无法进行该操作。',
'strTHErrNotPlaying': '当前未在进行德州扑克对局。',
'strTHErrNoPermission': '权限不足,无法执行该操作。',
'strTHErrInvalidNumber': '参数错误:请输入合法数字。',
'strTHErrInvalidSeat': '座位号无效(仅支持 1-10 且必须存在该座位)。',
'strTHErrNotYourTurn': '现在不是你的回合。',
'strTHErrSeatNotFoundForUser': '你当前没有可操作的座位。',
'strTHErrActionNotAllowed': '当前阶段不允许使用该指令。',
'strTHErrRaiseTooSmall': '加注金额不足,最小加注为[{tMinRaise}]。',
'strTHErrBetTooSmall': '下注金额不足,最小下注为[{tBB}]。',
# 建局/入场
'strTHCreateSuccess': '已创建德州扑克房间,基础筹码[{tBaseStake}],小盲注[{tSB}],大盲注[{tBB}]。\n使用 .dz 加入 [人物名] [筹码] 加入游戏。',
'strTHCreateFailStake': '创建失败:基础筹码必须是[1000]的倍数,且 >= 1000。',
'strTHCreateFailRoomExists': '创建失败:本群已有房间,请先解散或等待游戏结束。',
'strTHJoinSuccess': '玩家[{tName}]加入游戏:<座位{tSeatId}>,携带筹码 {tChips}。',
'strTHJoinFailChips': '加入失败:入场筹码必须 > 大盲注[{tBB}]。',
'strTHJoinFailFull': '加入失败:座位已满(最多10人)。',
'strTHQuitSuccess': '玩家[{tName}]已退出:<座位{tSeatId}>。',
'strTHQuitFailNoSeat': '玩家[{tName}]退出失败:你没有可退出的座位。',
'strTHDismissSuccess': '房间已解散。',
'strTHStartFailNeedPlayers': '开始失败:至少需要2名玩家。',
'strTHStartSuccess': '游戏开始!已发牌并扣除盲注。\n请使用[.dz 看牌]查看手牌(将通过私聊发送)\n{tAtAll}',
# 私聊看牌
'strTHPrivateCardsHeader': '来自群: [{tGroupId}]',
'strTHPrivateCardsSeatLine': '座位: {tSeatId}号 - {tSeatName}({tRoleText})',
'strTHPrivateCardsCardsLine': '底牌: {tHandCards}',
'strTHPrivateCardsFooter': '请在群内进行操作。',
'strTHCardsFailNotDealt': '看牌失败:当前未发牌或本局未开始。',
'strTHErrNeedFriendForPrivate': '无法私聊发牌:QQ 平台需要先加 bot 好友。',
# 操作/离场/踢人/强制结束/结束开关
'strTHLeaveSuccess': '已离场:座位{tSeatId}: {tSeatName}({tSeatRoleText}){tSeatTurnMark},筹码[{tForfeit}]充公进入底池。',
'strTHKickSuccess': '已踢出:座位{tSeatId}: {tSeatName}({tSeatRoleText}){tSeatTurnMark},筹码[{tForfeit}]充公进入底池。',
'strTHStopSuccess': '已强制结束并销毁本群德州扑克数据(不结算)。',
'strTHEndFlagSet': '已开启结束开关:本手在“最后仅剩一人(其余弃牌)”或“摊牌比牌”结算后,将进行最终结算并结束游戏(不会自动开始下一手)。',
'strTHEndFlagUnset': '已关闭结束开关:游戏将继续进行,本手结束后会自动开始下一手。',
# 局势面板
'strTHStatusHeader': '底池:{tPot} ‖ 最小加注:{tMinRaise} ‖ 最小下注/跟注:{tMinCall}',
'strTHStatusCommunity': '公共牌: {tCommunityCards} {tStreetText}',
'strTHStatusSeparator': '------------------------------',
'strTHStatusSeatLine1': '座位{tSeatId}: {tSeatName}({tSeatRoleText}){tSeatTurnMark}',
'strTHStatusSeatLine2': '筹码:{tSeatChips} ‖ {tSeatActionText}',
'strTHStatusTurnLine': '轮到[<座位{tTurnSeatId}>{tTurnName}]({tTurnRoleText}){tTurnAt}行动',
'strTHStatusCmdHint': '指令: {tCmdHint}',
'strTHStatusBoard': '{tHeader}\n{tCommunity}\n{tSep}\n{tSeatLines}\n{tSep}\n{tTurnLine}\n{tSep}\n{tCmdLine}',
# 街名
'strTHStreetPreflop': '(翻牌前/Pre-Flop)',
'strTHStreetFlop': '(翻牌圈/Flop)',
'strTHStreetTurn': '(转牌圈/Turn)',
'strTHStreetRiver': '(河牌圈/River)',
'strTHStreetShowdown': '(摊牌/Showdown)',
# 位置/角色
'strTHRoleDealer': '庄家/BTN/D',
'strTHRoleDealerSB': '庄家/BTN/D(小盲位/SB)',
'strTHRoleSB': '小盲位/SB',
'strTHRoleBB': '大盲位/BB',
'strTHRoleUTG': '枪口位/UTG',
'strTHRoleUTG1': '枪口+1/UTG+1',
'strTHRoleUTG2': '枪口+2/UTG+2',
'strTHRoleMP': '中间位/MP',
'strTHRoleMP1': '中间位1/MP1',
'strTHRoleMP2': '中间位2/MP2',
'strTHRoleHJ': '劫持位/HJ',
'strTHRoleCO': '关煞位/CO',
# 座位动作显示
'strTHSeatActionPending': '⚪ 待行动({tOptCheck} / {tOptBet} / {tOptCall})',
'strTHSeatActionPendingBlind': '⚪ 待行动(暂未行动;已投{tBlindText};{tOptCheck} / {tOptBet} / {tOptCall})',
'strTHSeatActionNone': '⚪ 行动: 暂未行动',
'strTHSeatActionNoneBlind': '⚪ 行动: 暂未行动(已投{tBlindText})',
'strTHSeatActionFolded': '🔴 已弃牌',
'strTHSeatActionAllin': '🔴 全压(All-in)',
'strTHSeatActionText': '🔴 行动: {tActionText}',
# 待行动选项
'strTHPendingOptCheckOK': '过牌',
'strTHPendingOptCheckNO': '过牌(不可用)',
'strTHPendingOptBetOK': '下注',
'strTHPendingOptBetNO': '下注(不可用)',
'strTHPendingOptCall': '跟注 {tNeedCall}',
# 显示细节
'strTHTurnMark': ' -> 当前回合',
'strTHWinnersSep': ' ‖ ',
'strTHWinnerSeatName': '[<座位{tSeatId}>{tSeatName}]({tSeatRoleText})赢得{tWinAmount}',
# 动作文本
'strTHActionBlindSB': '小盲 {tAmount}',
'strTHActionBlindBB': '大盲 {tAmount}',
'strTHActionCheck': '过牌',
'strTHActionCall': '跟注 {tAmount}',
'strTHActionBet': '下注 {tAmount}',
'strTHActionRaise': '加注 {tAmount}',
'strTHActionAllinAmount': '全压 {tAmount}',
'strTHActionFold': '弃牌',
# 回合结果/结算
'strTHHandEndSingle': '本局结束:[<座位{tWinSeatId}>{tWinName}]获胜,赢得底池{tWinAmount}。',
'strTHHandEndShowdownHeader': '本局结束:进入摊牌结算。',
'strTHShowdownRevealHeader': '摊牌明细:',
'strTHShowdownRevealLine': '[<座位{tSeatId}>{tSeatName}]({tSeatRoleText})底牌:{tHandCards} ‖ 牌型:{tHandType} ‖ 最佳5张:{tBest5}',
'strTHShowdownRevealFoldedLine': '[<座位{tSeatId}>{tSeatName}]({tSeatRoleText})弃牌|底牌:{tHandCards}',
'strTHShowdownBoardLine': '公共牌: {tBoardCards}',
'strTHShowdownSeatHoleLine': '[<座位{tSeatId}>{tSeatName}]({tSeatRoleText}){tFoldMark} 底牌:{tHandCards}',
'strTHShowdownSeatMadeLine': '凑牌:{tBest5}',
'strTHShowdownSeatTypeLine': '牌型:{tHandType}',
'strTHHandEndPotLine': '奖池{tPotIndex}({tPotLabel}): {tPotAmount} -> 赢家: {tWinnersText}',
'strTHRefundLine': '未被跟注:退还 [<座位{tSeatId}>{tSeatName}]({tSeatRoleText}){tRefundAmount}',
'strTHFoldReveal': '[<座位{tSeatId}>{tSeatName}]({tSeatRoleText})弃牌,亮出底牌:{tHandCards}',
'strTHBrokeOut': '[<座位{tSeatId}>{tSeatName}]({tSeatRoleText})破产出局。',
'strTHGameOnlyOneLeft': '剩余唯一玩家:[<座位{tWinSeatId}>{tWinName}],游戏结束。',
'strTHFinalRankingHeader': '游戏结束,筹码排行:',
'strTHFinalRankingLine': '{tRankNo}. [<座位{tSeatId}>{tSeatName}]:{tSeatChips}',
# 指令提示
'strTHCmdHintPreflop': '.dz 跟 / .dz 加 [数值] / .dz 弃 / .dz 全压',
'strTHCmdHintPreflopCheck': '.dz 过 / .dz 跟 / .dz 加 [数值] / .dz 弃 / .dz 全压',
'strTHCmdHintPostflop': '.dz 下 [数值] / .dz 跟 / .dz 加 [数值] / .dz 弃 / .dz 全压',
'strTHCmdHintPostflopCheck': '.dz 过 / .dz 下 [数值] / .dz 跟 / .dz 加 [数值] / .dz 弃 / .dz 全压',
'strTHCmdHintPostflopCheckBet': '.dz 过 / .dz 下 [数值] / .dz 跟 / .dz 加 [数值] / .dz 弃 / .dz 全压',
'strTHCmdHintPostflopBet': '.dz 下 [数值] / .dz 跟 / .dz 加 [数值] / .dz 弃 / .dz 全压',
}
—
安装
- 将
TexasHoldem.opk 放入 OlivOS 插件目录:YourOlivOSPath/plugin/app。
- 重载插件。
—
注意事项
如果你使用的是 Linux 服务器,那么有可能报错:
[2026-01-24 15:39:05] - [ERROR] - OlivOS 插件 [TexasHoldem] 调用 [private_message] 失败: 'latin-1' codec can't encode characters in position 0-12: ordinal not in range(256)
Traceback (most recent call last):
File "/home/ubuntu/olivos-cli/venv/lib/python3.12/site-packages/PIL/ImageDraw.py", line 507, in draw_text
mask, offset = font.getmask2(
^^^^^^^^^^^^^
AttributeError: 'ImageFont' object has no attribute 'getmask2'. Did you mean: 'getmask'?
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/home/ubuntu/olivos-cli/OlivOS/OlivOS/core/core/pluginAPI.py", line 309, in plugin_event_router
plugin_model.main.Event.private_message(plugin_event=plugin_event, Proc=self)
File "/home/ubuntu/olivos-cli/OlivOS/plugin/tmp/TexasHoldem/main.py", line 24, in private_message
File "/home/ubuntu/olivos-cli/OlivOS/plugin/tmp/TexasHoldem/msgReply.py", line 754, in unity_reply
File "/home/ubuntu/olivos-cli/OlivOS/plugin/tmp/TexasHoldem/msgReply.py", line 246, in reply_custom
File "/home/ubuntu/olivos-cli/OlivOS/plugin/tmp/TexasHoldem/function.py", line 890, in replyMsg
File "/home/ubuntu/olivos-cli/OlivOS/plugin/tmp/TexasHoldem/function.py", line 809, in render_text_to_image
File "/home/ubuntu/olivos-cli/venv/lib/python3.12/site-packages/PIL/ImageDraw.py", line 558, in text
draw_text(stroke_ink, stroke_width)
File "/home/ubuntu/olivos-cli/venv/lib/python3.12/site-packages/PIL/ImageDraw.py", line 523, in draw_text
mask = font.getmask(
^^^^^^^^^^^^^
File "/home/ubuntu/olivos-cli/venv/lib/python3.12/site-packages/PIL/ImageFont.py", line 172, in getmask
return self.font.getmask(text, mode)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
UnicodeEncodeError: 'latin-1' codec can't encode characters in position 0-12: ordinal not in range(256)
[2026-01-24 15:39:05] - [INFO] - [qq|xxxxxxxxx] - [德州扑克] - <set_block> - True
[2026-01-24 15:39:05] - [INFO] - 事件 [private_message] 被插件 [德州扑克] 拦截,将终止后续插件处理
解决方案(二选一)
- 使用命令
.strTHSendMode 1切换到文字发送
- 使用命令
sudo apt install fonts-noto-cjk fonts-noto-color-emoji
sudo fc-cache -fv
安装中文字体和emoji字体
—
更新日志
2026.1.20 v1.1.0
- 新增图片发送(防风控腾讯检测封群),可以在自定义回复中自行更改

2026.1.13 v1.0.3
2026.1.13 v1.0.2
- 调整入场费只需大于大盲注就行
- 优化部分术语错误
- 优化黑桃emoji显示有问题
- 修复已经有了房间还能重新创建覆盖之前的房间的bug
2026.1.10 v1.0.1
- 优化人物名称显示,可自定义入局人物名称,修复.dz end的一个bug,修复私聊看牌不显示人物名的bug
2026.1.10 v1.0.0
- 初版发布(群聊对局 + 私聊发牌/看牌 + 盲注/轮转/边池结算)。
—
截图演示

