• Showing Page History #27776

オープンネットワーク麻雀

このプロジェクトでは、オープンなネットワーク麻雀のプロトコルを策定し、その実装を行います。

ちなみに発端は2chのプログラム板の「おまいら最強の麻雀プログラムしてみろよ」スレです(現在はpart2)

将来的には、そのプロトコルを使用した様々なサーバ、クライアントの実装がでてきたら良いなと思います。

プロトコル

とりあえず名前ですが、スレで紹介されていた将棋用のUSI(Universal Shogi Interface)にあやかって、 UMP(Universal Mahjong Protocol)でいこうと思います。

また、基本コンセプトとして、UMPでは麻雀自体のルールは定義しません。つまり、「クイタンあり」のような情報をUMPでは扱いません。 クイタンありかなしかはサーバの実装次第で、クライアントの実装では、 クイタンで和了ろうとして、サーバにコマンドを送り、 認められるかどうかで初めてわかります。
これだと問題だと思われる方もいるでしょうが、逆にそれを扱ってしまうことで、プロトコルの可搬性が落ちてしまうのを避けるためです。

あくまでもUMPでは、麻雀におけるアクションや情報をサーバとクライアントでやりとりするために必要なものを定義するにとどめ、 単純ではあるが、多くのルールに対応できるものを目指します。

基本

  • TCPを介した通信
  • 使用コードはASCIIのみ。大文字小文字は区別する。コマンドは小文字
  • プレイヤーの名前など、ASCIIで入らない場合はUTF-8をURIエンコードしたものを使う
  • やりとりは、基本的にサーバからクライアントへ送り、一部コマンド(hello/sutehai?/naku?/tenpai?)はクライアントから返答を返す
  • クライアントから任意のタイミングでサーバにコマンドは送らない

詳細

  • 牌の表記
    • 数字1文字+アルファベット1文字で一つの牌を表す。
    • アルファベットはm(マンズ)、p(ピンズ)、s(ソウズ)、z(字牌)
    • 字牌は東南西北白発中の順に1z〜7z
    • アルファベット大文字はドラ(赤牌)
  • 手牌の表記
    • 必ず理牌(ソート)して表記。順番はm<p<s<z、1<9
    • 面前部分は普通に牌を並べ、晒した牌は<>で囲む。暗カンは()
    • スベースは空けない
      • 4m4m6m7m5p6p7p2s3s4s5s6s7s
      • 2m2m5z5z5z7z7z<2p3p4p><6z6z6z>
  • プレイヤーの表記
    • 起家から順に、A、B、C...と表記する
  • コマンド形式
    • <センテンスID> <コマンド> [<引数> ...] <CR+LF>
    • サーバから送られたコマンドに返答するときには、同じセンテンスIDを送る

コマンド一覧

サーバ クライアント 説明
hello [<オプション> ...] hello [<オプション> ...] 接続確認。オプションについては後述
bye bye 接続終了
error <メッセージ> サーバから強制的に接続を切断する際に送る(認証失敗等)
gamestart <席> <名前A> ... ゲーム(半荘)開始
gameend <点数A> ... ゲーム終了
kyokustart <場風> <親> <本場> <供託> 一局が始まるときに送る
kyokuend 一局終了
ready? ok クライアントの返答を待つ
point <プレイヤー> (=|+|-)<点数> プレイヤーの点数を通知する。点数の前には必ず=|+|-が付き、=は点数の直指定、+-は増減を意味する
dice <サイコロの目1> <サイコロの目2> サイコロの出目を送る
haipai <プレイヤー> [<配牌>] 配牌を配る
open <プレイヤー> <晒した牌> [<捨牌>] 手牌を公開する(和了、流局時のテンパイ宣言、オープンリーチ、チー、ポン、カン)
dora <牌> ドラ表示牌を送る
tsumo <プレイヤー> <残り枚数> [<牌>] 自摸る。他家には牌は送らない
sutehai? 捨牌を尋ねる
sute <牌> [tsumogiri] 捨てる
ankan <牌> 暗カン
kakan <牌> 加カン
richi <牌> [tsumogiri] リーチをかけて牌を捨てる
openrichi <牌> [<手牌>] [tsumogiri] オープンリーチをかけて牌をすてる
tsumo ツモあがり
sutehai <プレイヤー> <牌> [tsumogiri] 捨牌
naku? <牌> 牌を鳴くか尋ねる
no 鳴かない
chi <牌1> <牌2> チー
pon <牌1> <牌2> ポン
kan 明カン
ron ロン
say <プレイヤー> chi | pon | kan | ron | tsumo | richi | tenpai | noten 発声
agari <プレイヤー> <符> <役1> <ハン数1> ... あがり
ryukyoku 流局
tenpai? テンパイを宣言するか尋ねる
yes 宣言する
no 宣言しない

helloコマンドのオプション

重要度 オプション名 説明
ump=<バージョン> バージョン
name=<名前> 名前。UTF-8をURIエンコードしたもの
user=<ユーザ名> 認証用ユーザ名
password=<パスワード> 認証用パスワード
  • ◎=必須、○=推奨、△=オプショナル
  • オプション名が'_"(アンダーバー)で始まるものは、各サーバ/クライアントの実装で自由に使って良い。 ただし、指定されなかった場合でもできるだけ動作するようにすること

補足

  • 不正なコマンドを返したとき(持っていないのにponとか)の挙動は、サーバの実装次第(無視、あるいは再度尋ねる等)
  • なので、状況についてはサーバから送られてきたものが絶対。クライアントがponやronを送っても、サーバが認めない限り無効
  • チョンボについて

課題

  • 途中流局