Archer

麻雀一番街基础

注意事项

注意
  • 使用该包需要开启 【自动设置】-> 【内建模式】
  • 麻雀一番街的立直并非独立动作,而是内嵌在打牌中(带立直声明的弃牌),因此立直通过 Riichi 方法发出。
  • 牌名沿用与雀魂一致的字符串表示:1m-9m(万)、1p-9p(筒)、1s-9s(索)、1z-7z(字牌),赤五用 0m / 0p / 0s

包名

  • actions

引用方式

  • import "github.com/moxcomic/Archer/internal/platform/actions"

接口方法

名称参数返回值备注
NewRiichiCityActions*actions.RiichiCityActions一番街接口实例

实例方法

名称参数返回值备注
Discardtile: string, tsumogiri: bool弃牌, tile为牌名, tsumogiri为是否为刚摸来的最后一张牌(摸切)
Riichitile: string, tsumogiri: bool立直, 即带立直声明的弃牌, tile为打出的牌, tsumogiri同上
ChiicalledTile: string, consumed: []string吃, calledTile为被吃的牌, consumed为手中组成顺子的两张牌
PoncalledTile: string, consumed: []string碰, calledTile为被碰的牌, consumed为手中用来碰的两张牌
DaimingkancalledTile: string, consumed: []string明杠, calledTile为被杠的牌, consumed为手中的三张牌
Ankantile: string暗杠, tile为牌名
Kakantile: string加杠, tile为新加入的牌名
Tsumo自摸
Ron荣和
Ryukyoku九种九牌(流局)
Babei拔北
Cancel取消、跳过(不鸣牌)

完整示例脚本

  • 与雀魂/天凤一致,在 onExecute 回调中拿到 AI 的推荐结果,按动作类型分派到 RiichiCityActions 对应方法。
  • lq.NotifyAIResult 参考 NotifyAIResult
  • GetType 参考 动作类型
main.go go
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())
	}
}

示例代码

go
actions.NewRiichiCityActions().Discard("1m", true)