LoginSignup
9
5

麻雀基本ライブラリを使ってみる

Last updated at Posted at 2023-01-02

電脳麻将 という麻雀アプリを開発しているのですが、基本となるライブラリを @kobalab/majiang-core として Node.jsnpm パッケージとしました。

  • シャンテン数計算
  • 和了打点計算
  • AI同士の自動対戦

といったことが行えます。

APIのドキュメントは

にあります。

ここでは使い方を簡単に説明します。

インストール

作業用ディレクトリにインストールします。

$ mkdir work
$ cd work
$ npm init -y
$ npm i @kobalab/majiang-core

シャンテン数計算

手はじめにシャンテン数計算をしてみます。プログラムを書くのも面倒なので、NodeのREPLを使います。

$ node
Welcome to Node.js v16.17.0.
Type ".help" for more information.
> 

変数 Majiang にライブラリをロードします。

> Majiang = require('@kobalab/majiang-core')
{
  rule: [Function (anonymous)],
  Shoupai: [class Shoupai],
  Shan: [class Shan],
  He: [class He],
  Board: [class Board],
  Game: [class Game],
  Player: [class Player],
  Util: {
    xiangting_guoshi: [Function: xiangting_guoshi],
    xiangting_qidui: [Function: xiangting_qidui],
    xiangting_yiban: [Function: xiangting_yiban],
    xiangting: [Function: xiangting],
    tingpai: [Function: tingpai],
    hule: [Function: hule],
    hule_param: [Function: hule_param],
    hule_mianzi: [Function: hule_mianzi]
  }
}

以下の牌姿のシャンテン数を計算してみましょう。いわゆる「完全イーシャンテン」の形です。
m2m3m3m4m4m5m7m7p6p6p7s5s6
手牌のインスタンスを生成します。1

> s = Majiang.Shoupai.fromString('m23344577p667s56')

シャンテン数を計算します。

> Majiang.Util.xiangting(s)
1

1 と結果が出ました。

では有効牌(引くとシャンテン数が進む牌)を調べてみましょう。

> Majiang.Util.tingpai(s)
[ 'm7', 'p5', 'p6', 'p8', 's4', 's7' ]

m7 p5 p6 p8 s4 s7 の6種でテンパイすると分かりました。

では m7 を引いた場合のシャンテン数を計算してみましょう。

> Majiang.Util.xiangting(s.zimo('m7'))
0

テンパイ(シャンテン数 = 0)しました。

和了打点計算

次に和了点を計算します。

[東場 南家] 1本場 供託なし
__p1____
m1m2m3p1p2p3z1 z2z2-z2 s1-s2s3

の手牌で上家から z1 でロン和了した場合を計算します。

> Majiang.Util.hule(
    Majiang.Shoupai.fromString('m123p123z1,s1-23,z222='), 'z1-',
    Majiang.Util.hule_param({
        zhuangfeng: 0,      // 東場
        menfeng:    1,      // 南家
        baopai:     'p1',   // ドラ表示牌
        changbang:  1,      // 1本場
        lizhibang:  0,      // 供託なし
    })
);

デフォルトのルールでは「切り上げ満貫」がないため、30符4翻=7700点、積み場を含めると東家から南家に8000点の支払いとなります。

{
  hupai: [      // 和了役一覧
    { name: '自風 南', fanshu: 1 },
    { name: '三色同順', fanshu: 1 },
    { name: '混全帯幺九', fanshu: 1 },
    { name: 'ドラ', fanshu: 1 }
  ],
  fu: 30,       // 符
  fanshu: 4,    // 翻数
  defen: 7700,  // 和了打点
  fenpei: [ -8000, 8000, 0, 0 ]     // 局収支
}

ルールを「切り上げ満貫あり」に変えてみます。

> Majiang.Util.hule(
    Majiang.Shoupai.fromString('m123p123z1,s1-23,z222='), 'z1-',
    Majiang.Util.hule_param({
        zhuangfeng: 0,      // 東場
        menfeng:    1,      // 南家
        baopai:     'p1',   // ドラ表示牌
        changbang:  1,      // 1本場
        lizhibang:  0,      // 供託なし
        rule:       Majiang.rule({'切り上げ満貫あり': true})    // ルール
    })
);

和了打点が満貫(=8000点)になりました。

{
  hupai: [      // 和了役一覧
    { name: '自風 南', fanshu: 1 },
    { name: '三色同順', fanshu: 1 },
    { name: '混全帯幺九', fanshu: 1 },
    { name: 'ドラ', fanshu: 1 }
  ],
  fu: 30,       // 符
  fanshu: 4,    // 翻数
  defen: 8000,  // 和了打点
  fenpei: [ -8300, 8300, 0, 0 ]     // 局収支
}

書籍

電脳麻将のプログラムを解説した書籍を出版しました。

書籍では @kobalab/majiang-core だけでなく @kobalab/majiang-ai も扱っています。

  1. 手牌の指定方法は https://github.com/kobalab/majiang-core/wiki/%E7%89%8C%E5%A7%BF を参照して下さい。

9
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
5