- 使用该包需要开启
【自动设置】-> 【内建模式】 - 麻雀一番街的立直并非独立动作,而是内嵌在打牌中(带立直声明的弃牌),因此立直通过
Riichi 方法发出。 - 牌名沿用与雀魂一致的字符串表示:
1m-9m(万)、1p-9p(筒)、1s-9s(索)、1z-7z(字牌),赤五用 0m / 0p / 0s。
import "github.com/moxcomic/Archer/internal/platform/actions"
| 名称 | 参数 | 返回值 | 备注 |
|---|
| NewRiichiCityActions | 无 | *actions.RiichiCityActions | 一番街接口实例 |
| 名称 | 参数 | 返回值 | 备注 |
|---|
| Discard | tile: string, tsumogiri: bool | 无 | 弃牌, tile为牌名, tsumogiri为是否为刚摸来的最后一张牌(摸切) |
| Riichi | tile: string, tsumogiri: bool | 无 | 立直, 即带立直声明的弃牌, tile为打出的牌, tsumogiri同上 |
| Chii | calledTile: string, consumed: []string | 无 | 吃, calledTile为被吃的牌, consumed为手中组成顺子的两张牌 |
| Pon | calledTile: string, consumed: []string | 无 | 碰, calledTile为被碰的牌, consumed为手中用来碰的两张牌 |
| Daimingkan | calledTile: string, consumed: []string | 无 | 明杠, calledTile为被杠的牌, consumed为手中的三张牌 |
| Ankan | tile: string | 无 | 暗杠, tile为牌名 |
| Kakan | tile: string | 无 | 加杠, tile为新加入的牌名 |
| Tsumo | 无 | 无 | 自摸 |
| Ron | 无 | 无 | 荣和 |
| Ryukyoku | 无 | 无 | 九种九牌(流局) |
| Babei | 无 | 无 | 拔北 |
| Cancel | 无 | 无 | 取消、跳过(不鸣牌) |
- 与雀魂/天凤一致,在
onExecute 回调中拿到 AI 的推荐结果,按动作类型分派到 RiichiCityActions 对应方法。 lq.NotifyAIResult 参考 NotifyAIResultGetType 参考 动作类型
package main
import (
"fmt"
"math/rand"
"time"
"github.com/moxcomic/Archer/internal/platform/actions"
"github.com/moxcomic/lq"
)
const (
E_PlayOperation_None = iota
E_PlayOperation_Discard // 弃牌
E_PlayOperation_Chi // 吃
E_PlayOperation_Pon // 碰
E_PlayOperation_Ankan // 暗杠
E_PlayOperation_Minkan // 明杠
E_PlayOperation_Kakan // 加杠
E_PlayOperation_RiiChi // 立直
E_PlayOperation_Tsumo // 自摸
E_PlayOperation_Ron // 荣和
E_PlayOperation_JiuZhongJiuPai // 九种九牌
E_PlayOperation_Babei // 拔北
)
func onExecute(result *lq.NotifyAIResult, risk []float64, r, m, f, t float64) {
if len(result.GetResult()) == 0 {
return
}
onExecuteTarget(result.GetResult()[0], result.GetShanten())
}
func onExecuteTarget(target *lq.AIResult, shanten uint32) {
action := actions.NewRiichiCityActions()
// 拟人延迟: 打牌(自己回合, 时间充裕)稍长; 鸣牌/和牌(服务器有应答时限)取短, 避免错过窗口。
delay := 250 + rand.Intn(350)
switch target.GetType() {
case E_PlayOperation_Discard, E_PlayOperation_RiiChi:
delay = 700 + rand.Intn(900)
}
time.Sleep(time.Millisecond * time.Duration(delay))
switch target.GetType() {
case E_PlayOperation_Discard:
action.Discard(target.GetTile(), target.GetMoqie())
case E_PlayOperation_RiiChi:
action.Riichi(target.GetTile(), target.GetMoqie())
case E_PlayOperation_Chi:
action.Chii(target.GetTile(), target.GetCombination())
case E_PlayOperation_Pon:
action.Pon(target.GetTile(), target.GetCombination())
case E_PlayOperation_Minkan:
action.Daimingkan(target.GetTile(), target.GetCombination())
case E_PlayOperation_Ankan:
if len(target.GetCombination()) > 0 {
action.Ankan(target.GetCombination()[0])
}
case E_PlayOperation_Kakan:
action.Kakan(target.GetTile())
case E_PlayOperation_Tsumo:
action.Tsumo()
case E_PlayOperation_Ron:
action.Ron()
case E_PlayOperation_JiuZhongJiuPai:
action.Ryukyoku()
case E_PlayOperation_Babei:
action.Babei()
case E_PlayOperation_None, 321:
action.Cancel()
default:
fmt.Println("RiichiCity 未处理的操作类型:", target.GetType())
}
}
actions.NewRiichiCityActions().Discard("1m", true)