電脳麻将 という麻雀アプリを開発しているのですが、基本となるライブラリを @kobalab/majiang-core として Node.js の npm パッケージとしました。
- シャンテン数計算
- 和了打点計算
- 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]
}
}
以下の牌姿のシャンテン数を計算してみましょう。いわゆる「完全イーシャンテン」の形です。
手牌のインスタンスを生成します。1
> s = Majiang.Shoupai.fromString('m23344577p667s56')
シャンテン数を計算します。
> Majiang.Util.xiangting(s)
1
1 と結果が出ました。
では有効牌(引くとシャンテン数が進む牌)を調べてみましょう。
> Majiang.Util.tingpai(s)
[ 'm7', 'p5', 'p6', 'p8', 's4', 's7' ]
> Majiang.Util.xiangting(s.zimo('m7'))
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, // 供託なし
})
);
デフォルトのルールでは「切り上げ満貫」がないため、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 も扱っています。
-
手牌の指定方法は https://github.com/kobalab/majiang-core/wiki/%E7%89%8C%E5%A7%BF を参照して下さい。 ↩