ArcherArcher
首页
快速开始
项目介绍
  • 简体中文
  • English
首页
快速开始
项目介绍
  • 简体中文
  • English
  • 首页
  • 基础配置

    • 项目介绍
    • 快速开始
    • 常见问题
    • 联系我们
  • 二次开发

    • 基础知识
    • 基础框架
    • 脚本迁移
    • 雀魂开发

      • 牌名

        • 基本
      • 游戏接口

        • 基本
      • lq

        • 基本
      • 动作类型

        • 基本
      • 游戏状态

        • 基本
      • 登录事件

        • 登录事件
        • 进阶:麻将事件登录
      • 弃牌

        • 基础
        • 进阶
      • 吃
      • 碰
      • 杠
      • 取消、跳过
  • 自动Review

    • 自动Review
  • 天凤个室对战

    • 在天凤个室与Mortal对局
  • 麻雀一番街

    • 基础

注意事项

  • 使用该包需要开启 【自动设置】-> 【内建模式】
  • 麻雀一番街的立直并非独立动作,而是内嵌在打牌中(带立直声明的弃牌),因此立直通过 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 参考 动作类型
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)