卒業研究論文 - aows.jpaows.jp/lab/gr_2009/kobayashi/kobayashi.pdf ·...

38
卒業研究論文 2010 2 麻雀ゲーム (所属ゼミ:和島ゼミ) ソフトウェア情報学部 ソフトウェア情報学科 4 18011 小林 巧人

Upload: others

Post on 09-Jul-2020

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 卒業研究論文 - aows.jpaows.jp/lab/GR_2009/kobayashi/kobayashi.pdf · ックしたときにあがり、鳴き、リーチを実行するメソッド、牌や点数などの情報を表示するメソッドで

卒業研究論文

2010 年 2 月

麻雀ゲーム (所属ゼミ:和島ゼミ)

ソフトウェア情報学部

ソフトウェア情報学科 4 年

ソ 18011 小林 巧人

Page 2: 卒業研究論文 - aows.jpaows.jp/lab/GR_2009/kobayashi/kobayashi.pdf · ックしたときにあがり、鳴き、リーチを実行するメソッド、牌や点数などの情報を表示するメソッドで

1

目次 第1章 序論 ......................................................................................................................................... 3

第1節 背景 ...................................................................................................................................... 3

第2節 研究の流れ ........................................................................................................................... 3

第2章 開発環境 .................................................................................................................................. 3

第1節 Microsoft Visual Studio ...................................................................................................... 3

第2節 Visual C++ .......................................................................................................................... 3

第3節 ペイント .............................................................................................................................. 3

第4節 Tinuous 3.30 ....................................................................................................................... 3

第3章 ルール ...................................................................................................................................... 4

第1節 局 ......................................................................................................................................... 4

第2節 牌 ......................................................................................................................................... 5

第3節 配牌・ドラ ........................................................................................................................... 6

第4節 副露 ...................................................................................................................................... 7

第5節 あがり .................................................................................................................................. 7

第6節 点数 ...................................................................................................................................... 8

第7節 役 ........................................................................................................................................ 11

第4章 実装 ........................................................................................................................................ 11

第1節 変数 .................................................................................................................................... 12

第2節 メソッド ............................................................................................................................ 13

第3節 副露・カン ......................................................................................................................... 17

第1項 ポン ................................................................................................................................ 17

第2項 チー ................................................................................................................................ 18

第3項 明カン ............................................................................................................................ 19

第4項 暗カン ............................................................................................................................ 20

第5項 加カン ............................................................................................................................ 21

第4節 リーチ ................................................................................................................................ 22

第5節 あがりと局の進行 .............................................................................................................. 23

第1項 あがり ............................................................................................................................ 24

第2項 順子、刻子の判定 ........................................................................................................... 24

第3項 ロン ................................................................................................................................ 26

第6節 役 ....................................................................................................................................... 26

第7節 流局 .................................................................................................................................... 34

第1項 通常の流局 ..................................................................................................................... 34

第2項 九種九牌 ......................................................................................................................... 34

第3項 四風連打 ......................................................................................................................... 35

第4項 四カン流れ ..................................................................................................................... 35

第5項 四人リーチ流れ .............................................................................................................. 35

Page 3: 卒業研究論文 - aows.jpaows.jp/lab/GR_2009/kobayashi/kobayashi.pdf · ックしたときにあがり、鳴き、リーチを実行するメソッド、牌や点数などの情報を表示するメソッドで

2

第8節 comp の思考....................................................................................................................... 35

第5章 考察 ....................................................................................................................................... 36

第1節 達成度の評価 ..................................................................................................................... 36

第2節 改善案 ................................................................................................................................ 36

第1項 表示系 ............................................................................................................................ 36

第2項 ルールの拡張 .................................................................................................................. 37

第3項 comp の思考 ................................................................................................................... 37

第4項 コードの整理 .................................................................................................................. 37

第6章 文献目録 ................................................................................................................................ 37

Page 4: 卒業研究論文 - aows.jpaows.jp/lab/GR_2009/kobayashi/kobayashi.pdf · ックしたときにあがり、鳴き、リーチを実行するメソッド、牌や点数などの情報を表示するメソッドで

3

第1章 序論

第1節 背景

昔から囲碁や麻雀などの戦略的ボードゲームに興味があった。特に、麻雀は複雑なルールに従ってゲ

ームが進むため、これを整理して実装することはプロジェクト設計の能力の向上するものと考え、この

テーマを選択した。

第2節 研究の流れ

まず、麻雀のルールをまとめて必要な変数とメソッドを洗い出した。すなわち、山、ドラ山、手牌、

捨て牌、鳴き牌を表す配列、ゲームの進行に関わる局、親、ターンなどの変数を定義した。

さらに、ゲームの進行に従ってそれらの変数を変えていくのに必要なメソッドをリストアップした。

内訳は、役を計算したり、あがり、鳴き、リーチが可能かどうかの判定をするメソッド、ボタンをクリ

ックしたときにあがり、鳴き、リーチを実行するメソッド、牌や点数などの情報を表示するメソッドで

ある。

次に開発環境を選定した。昨年度の創作ゼミで使い慣れていたので言語は Visual C++とした。ルール

実装と思考ルーチンに重点を置くため、表示系はシンプルにすることを心がけた。レイアウトを決めて

牌を仮配置して確認し、マウスクリックによる入力系の実装を行った。ゲームの遷移としては、配牌、

ツモる、切る、鳴き、あがり点数計算、局の進行の順に実装して、各段階で不具合を修正しつつ開発を

すすめた。

第2章 開発環境

第1節 Microsoft Visual Studio

マイクロソフトのソフトウェア開発及び管理する統合開発。Microsoft .NET による、接続性に優れた

強力で安全なソフトウェアを構築および配置するための統合開発環境である。Visual Basic、Visual C++、

Visual C#や Visual J#での開発ができ、本研究では Visual C++を使用した。

第2節 Visual C++

マイクロソフトの開発した C 言語や C++言語で Windows 用のソフトウェアを開発するための統合開

発環境。テキストエディタを使ってソースコードを書いたり、作成したソースコードを GUI の画面上か

らコンパイルやデバッグ、C 言語や C++言語用のライブラリを利用、MSDN を参照して言語使用を調べ

たりライブラリ関数を確認することができる。

第3節 ペイント

コンピュータ上で画像を描く2次元コンピュータグラフィックス用のグラフィックソフトウェアであ

る。本研究では、牌や数字などの画像の作成に使用した。

第4節 Tinuous 3.30

Windows XP/Vista 対応のフリーソフト。複数ファイルを一括変換するイメージコンバーターで、画像

の縮小、回転、輪郭強調、ヒストグラム自動補正、明るさ/コントラスト/彩度/色相補正などを行なうこと

Page 5: 卒業研究論文 - aows.jpaows.jp/lab/GR_2009/kobayashi/kobayashi.pdf · ックしたときにあがり、鳴き、リーチを実行するメソッド、牌や点数などの情報を表示するメソッドで

4

ができる。本研究では、牌や数字の画像の回転バージョンの作成に使用した。

第3章 ルール

この章では一般的な麻雀のルールとゲームで採用したルールについて解説する。ルールにはいろいろ

なローカルなものが存在するが、ここではコンピュータ麻雀のアルゴリズム [1]、麻雀ルール [2]、

Wikipedia [3]、麻雀 点数計算解説書 [4]を参考にして 終的な仕様をまとめた。

麻雀は 4人の打ち手が点数を奪い合い、 終的に持っている点数の多さで順位を決めるゲームである。

ゲーム開始時に打ち手全員に決められた点数が渡され、その点数を奪い合うことになる。自分に配られ

た「牌」を組み合わせて「役」を作り、「あがる」ことによって他の打ち手から点数を奪うことができる。

より高い「役」を作ることによって、より多くの点を奪うことができる。

打ち手には「親」と「子」があり、初めに親を決める。親(1 名)と子(3 名)では点数の分配のルー

ルが異なる。

まず、ゲームを始める前に、それぞれの打ち手がどの席に座るかを決める「場所決め」を行う。それ

が終わると、全ての打ち手に配給原点(ここでは 25000 点)が配られ、さらに 初の親を決める「親決

め」を行ったあと、ゲームが始まる。ここでは「場所決め」を行わず、手前側がプレイヤーになるよう

にした。

親決めには2つのステップがある。まず、「仮東(カリトン)」を決める。そして、次に本当の 初の

親を決める。 初の親のことを「起家(チーチャ)」と言う。まず東家の打ち手が 2 個のサイコロを振る。

出た目を足した数を4で割って余りが 1 ならサイコロを振った人が「仮東」になる。同様に余りが 2 な

らサイコロを振った人から見て右隣の人(下家)が、余りが 3 なら正面の人(対面)が、余りが 0 なら

左隣の人(上家)が「仮東」になる。次に、「仮東」になった人が、もう一度 2 個のサイコロを振る。出

た目を足した数を使って、上記と同様の方法で「起家」を決める。

今回はこれらの手続きを省略し、親決めをランダムで行った。

第1節 局

ゲームの進行は局で管理される。牌が全ての打ち手に配られ、誰かがあがるか「流局」するまでを一

つの局といい、局を決められた数だけこなすのが基本的なゲームの流れである。

流局とはそれぞれの打ち手が「捨て牌」と「ツモ」を繰り返していき、牌山が残り 14 枚になってしま

った場合は、その時点でその局は「終了」となる。誰もあがらずに局が終わることを、「流局」と言う。

流局にはいくつかパターンがあり、上記のように牌山が王牌のみになってしまうことで起こる流局を「荒

牌(こうはい)」と言う。荒牌になった場合は、ノーテンの打ち手がテンパイの打ち手に規定の額(後述)

の点棒を渡す。親がテンパイの場合は、同じ局をもう一回 初から始める。親がノーテンの場合は、次

の局がある場合は次の局に移り、ない場合はゲーム終了になる。他にも「九種九牌」、「四風連打」、「四

カン流れ」、「四人リーチ」という特殊な流局があり、この場合は点数、変動がない。

局が終わり、次の局に移る時は、親は右隣りの打ち手に移る。各局には、ゲームの進行によってそれ

ぞれ名前がつけられており、 初の局を「東一局」、その次の局を「東二局」などと呼ぶ。麻雀は本来、

東一局から北四局までの 16 局からなる「一荘」をワンゲームとするが、一般には東一局から南四局の 8

局からなる「半荘」や、東一局から東四局までの「東風戦」が行われることの方が多い。ここでは東風

Page 6: 卒業研究論文 - aows.jpaows.jp/lab/GR_2009/kobayashi/kobayashi.pdf · ックしたときにあがり、鳴き、リーチを実行するメソッド、牌や点数などの情報を表示するメソッドで

5

戦をワンゲームとした。

「親」があがった場合は、「親」はそのままに、同じ局をもう一回行う。これを、「連荘(レンチャン)」

と言う。「子」があがった場合は、「親」は反時計まわりに隣の打ち手に渡り、次の局になる。次の局が

ない場合は、そこでゲームは終わる。「親」「子」両方ともあがった場合は、「連荘」となる。

親があがって連荘した場合や流局になった場合は、親は場に 100 点棒を出して「局を積んだ」ことの

目印にする。この 100 点棒のことを、「積み棒」と言う。積み棒は、連荘や流局が起こるたびに 1 本ずつ

増やしていく。流局して親が移った場合は、元の親は積み棒を引っ込め、新しい親がそれまでの積み棒

の数に 1 本足した数の積み棒を出す。そして子があがったときに積み棒なしの状態に戻る。

第2節 牌

数牌と字牌と呼ばれるものがある。全部で 34 種類あり、そのうち数牌には萬子、筒子、索子がありそ

れぞれ 1~9 の数を持つ。また、字牌には風牌(東、南、西、北)、三元牌(白、發、中)がある。これら

がそれぞれ 4 枚ずつあり、全部で 136 枚の牌を使うことになる。以下で牌について具体的に説明する。

1. 数牌(スウハイ)

1.1. 萬子(マンズ・ワンズ)

~ の牌のこと。読み方はイーワン、リャンワン、サンワン、スーワン、ウーワン、ローワン、チー

ワン、パーワン、キュウワン。

1.2. 筒子(ピンズ)

~ の牌のこと。読み方はイーピン、リャンピン、サンピン、スーピン、ウーピン、ローピン、チー

ピン、パーピン、キュウピン。

1.3. 索子(ソーズ・ソウズ)

、 ~ の牌のこと。読み方はイーソウ、リャンゾウ、サンゾウ、スーソウ、ウーソウ、ローソウ、

チーソウ、パーソウ、キュウソウ。

2. 字牌(ジハイ・ツウハイ)

2.1. 風牌(カゼハイ)

、 、 、 の牌のこと。読み方はトン、ナン、シャー、ペイ。

2.2. 三元牌(サンゲンパイ)

、 、 の牌のこと。読み方はハク、ハツ、チュン。

Page 7: 卒業研究論文 - aows.jpaows.jp/lab/GR_2009/kobayashi/kobayashi.pdf · ックしたときにあがり、鳴き、リーチを実行するメソッド、牌や点数などの情報を表示するメソッドで

6

第3節 配牌・ドラ

1. 配牌・山積み

すべての牌を伏せて(裏にして)整列して並べる「山積み」という作業を行う。全ての打ち手が自分

の席の前に 2 段 1 列に牌を並べていく。牌は 136 枚あるので、全員が 17×2 段ずつ並べると、均等に並

ぶ。この作業で作られる牌の並びを「山」と言う。山積みがすんだら、それぞれの打ち手が順番に牌山

から牌を持ってくる「配牌」を行う。

① 牌山のどの位置から持ってくるかを決めるため、親が 2 個のサイコロを振る。出た目を足した数を x

とすれば、どの打ち手の前の牌山の、どの位置から配牌するかは x によって決まる。

② 牌山は、親決め時のサイコロの使い方と同様に、x の 4 で割った余りが 1 だったら「親」の人の、余

りが 2 だったら「南家」の、余りが 3 だったら「西家」の、余りが 0 だったら「北家」の、その人の

前の牌山を右側 x 枚(×2 段)の列と残りの左側の列に分ける。

③ この左側の列のいちばん右側(つまり左右に分けた分け目)から、まず親が「2 段×2 段=4 枚」の牌

を取る。

④ 南家、西家、北家、東家…の順に「2 段×2 段=4 枚」を取っていき、全員に 12 枚の牌が行き渡った

ら、こんどは 1 枚ずつ取っていく。

⑤ 親が 14 枚、子が 13 枚の牌を持ってきたところで、配牌は完了である。

⑥ 持ってきた牌はそれぞれの打ち手の正面に、自分にだけ見えるよう立てて並べる。この牌を「手牌」

と言う。

2. ドラ・王牌

上で説明したように、配牌を始める際には、サイコロを 2 個振って、牌を取り始める位置を決め、山

を左右に分ける。この分割された位置から「右側 7 枚×2 段」の牌山部分を「王牌(ワンパイ)」と言う。

また、王牌のうち左から 3 枚目の上の段にある牌を表にひっくり返して、その局の「ドラ」を決める。

「ドラ」とは、あがったときにその牌が手牌の中にあると得点が上がる牌のことで、局ごとに変わる。

ドラは、ひっくり返した牌の「次の牌」となる。「次の牌」とは、具体的には表 3-1 のようになる。なお、

ひっくり返した牌のことを、「ドラ表示牌」と言う。

表 3-1. ドラ表示牌とドラの関係

ドラ表示牌 ドラ

ドラ表示牌 ドラ

… …

Page 8: 卒業研究論文 - aows.jpaows.jp/lab/GR_2009/kobayashi/kobayashi.pdf · ックしたときにあがり、鳴き、リーチを実行するメソッド、牌や点数などの情報を表示するメソッドで

7

第4節 副露

他の打ち手が捨てた牌を奪い取ることで「面子(メンツ)」を作ることができる。その行為を、「副露

(フーロ)」あるいは「鳴き」という。鳴きは、奪い取る牌が捨てられて直後にのみ可能である。鳴きに

は、「ポン」「チー」「カン」という 3 種類がある。「ポン」は牌を取ることで のような同一牌の

3 枚組の刻子(コーツ)を作るもので、「チー」は牌を取ることで のような 3 つの連番の順子(ジ

ュンツ、シュンツ)を作るものである。同様に「カン」は のような同一牌の 4 枚組の槓子(カ

ンツ)を作る。副露していないときは「門前」と言う。

上で説明したように、面子の中には「槓子」という種類のものがある。「順子」や「刻子」とは異なり、

「槓子」を作るには、必ず「カン」を行う必要がある。

カンには「暗カン(アンカン)」と「明カン(ミンカン)」、「加カン(カカン、チャカン)」の 3 種類が

ある。

「暗カン」と「加カン」は、自分の捨て牌番のときに行うことができる。暗カンとは、自分の純手牌

の中に同一牌が 4 枚ある場合に、それらの牌をカンツにして手牌から除いて場に出すことである。この

場合は、「カン」と宣言して対象の 4 枚の牌のうち 2 枚を「表」にする。

加カンとは、すでに明刻があり、それと同一の牌が純手牌にあるかツモってきた場合に、「カン」と宣

言して、その牌を明刻に加えて、場にだすことである。

明カンとは、自分の手牌に同一牌が 3 枚ある場合に、それと同一の牌が捨てられたときにそれらをま

とめて場に出すことである。

カンをしたあとは、王牌のいちばん左側にある牌を 1 枚取ってくる。これを「リンシャン」といい、

取ってきた牌のことを、「リンシャン牌」と言う。そしてカンした人の捨て牌番になる。

リンシャン牌を取ってくることで王牌の牌は 1 枚減るが、王牌の右側に隣接する牌山から 1 枚、王牌

に組み込まれる。そのため王牌の牌数は常に 14 枚である。そしてドラ表字牌の右側上段の牌を「表」に

する。この新たに「表」にされた牌も「ドラ表示牌」となり、結果としてドラが 1 つ増えることになる。

なお、次のツモ牌がないときには、カンはできない。

第5節 あがり

具体的には、4 組の「面子」と 1 組の「雀頭(ジャントウ)」を作るか、七対子の場合は 7 組の「対子

(トイツ)」(同一牌を 2 枚組み合わせたもの)を作り、国士無双の場合は「么九牌(ヤオチュウハイ)」

(「字牌」と萬子、筒子、索子の 1、9 の牌の 13 種類の牌のこと)すべてを 1 枚ずつと、もう 1 枚の么九

牌で作る。

面子には、「順子」、「刻子」、「槓子」の 3 種類がある。雀頭は対子である。つまり、あがるには、「順

子」「刻子」「槓子」を 4 組と、「対子」を 1 組用意する必要がある。

あがりには、「ツモあがり」と「ロンあがり」の 2 種類がある。「ツモあがり」は、自分が牌山から取

ってきたツモ牌を含めた状態であがりの形を形成してあがることである。つまり、ツモ牌を取ってきた

Page 9: 卒業研究論文 - aows.jpaows.jp/lab/GR_2009/kobayashi/kobayashi.pdf · ックしたときにあがり、鳴き、リーチを実行するメソッド、牌や点数などの情報を表示するメソッドで

8

状態でのあがりである。「ツモあがり」するときは、「ツモ」と宣言する。「ロンあがり」は、他の打ち手

が捨てた牌を取ってくることであがりの形を形成し、あがることである。「ロンあがり」するときは「ロ

ン」と宣言する。「ロンあがり」する対象の牌が捨てられた直後に宣言する必要がある。

必要な牌をもう一つ持ってくるとあがることができる状態の手牌を、「テンパイ」と言う。テンパイ時

の、出たらあがることができる牌のことを「待ち牌」と言う。また、テンパイではない状態の手牌を、「ノ

ーテン」と言う。

自分が捨て牌するときに、選んだ牌を捨てることで自分の手牌がテンパイになり、かつ鳴いていない

場合は、「リーチ」をかけることができる。「リーチ」とは、自分がテンパイであることを他の打ち手に

宣言することである。リーチをかけた場合、その手であがったときにリーチをかけなかった場合よりも

多くの点数を得ることができる。また、リーチをかけたあとは、自分の手を変えることは許されず、鳴

くこともできない。できるのは、「ツモあがり」と「ロンあがり」、それに「暗カン」である。ただし、

リーチ後の暗カンについてはいくつか条件がある。

リーチをかける際には、「リーチ」と宣言しながら捨て牌し、場に千点棒を出す。この千点棒は「リー

チ棒」と呼ばれ、次にあがった人がもらえる。(千点棒は点棒の一種であり、点棒とは点数を表すための

道具である。)またリーチをかけたときに捨てた牌は、そこでリーチをかけたことが分かるよう、横にし

て置く。この牌を、「リーチ宣言牌」と言う。残りのツモ牌が 3 枚以下のときは、リーチをかけることは

できない。

テンパイ時に、待ち牌をすでに自分が捨てている場合は、ロンあがりすることはできない。これを「フ

リテン」と言う。

待ち牌が複数ある場合でも、そのうちの 1 枚を捨てていればフリテンとなり、ロンあがりは認められ

ない。さらに、リーチ後に他の打ち手が捨てた待ち牌を見逃した場合もフリテンになる。

また、リーチをかけていない場合でも、他の打ち手が捨てた待ち牌を見逃した場合、次の自分のツモ

番がくるまでロンあがりができない。これを「山越え」という。

第6節 点数

あがると点数をもらうことができる。このときにもらえる点数のことを「あがり点」と言い、この点

数はあがったときの手牌の形によって決まる。あがり点は、「ロンあがり」の場合は振り込んだ打ち手か

ら全額もらう。「ツモあがり」の場合は、他の打ち手全員から分割してもらう。このときの点数の分割方

法は、「親」であがった場合はあがり点を均等に 3 分割した点数を 3 人からもらう。「子」であがった場合

は「親」と子 2 人から「2:1:1」の割合でもらう。あがり点を 100 点単位で割り切れない場合は、100 点

単位で切り上げる。

さらに、あがった人は、場に出ている「リーチ棒」をもらうことができる。また、あがり点とは別に、

「積み棒」1 本当たり 300 点をもらうことができる。「積み棒」にかかる点数は、「ロンあがり」の場合

は振り込んだ打ち手が全額払い、「ツモあがり」の場合は他の 3 人が均等に払う。

流局の場合、全員がテンパイ、全員がノーテンの場合は点数の変動はない。テンパイしている打ち手

が一人から三人のときは、テンパイしていない側がテンパイしている側にトータル 3000 点支払う。例え

ば、テンパイしているのが一人の場合は 3 人のノーテンの打ち手が 1000 点ずつ、テンパイの打ち手に渡

す。

Page 10: 卒業研究論文 - aows.jpaows.jp/lab/GR_2009/kobayashi/kobayashi.pdf · ックしたときにあがり、鳴き、リーチを実行するメソッド、牌や点数などの情報を表示するメソッドで

9

符数

符数とは、テンパイ時の「待ちの形」に対して付与される点数と、手牌に含まれる面子および雀頭一

つ一つに付与される点数、それに「ロンあがり」か「ツモあがり」かによって付与される点数を合計し

た点数である。

待ちの形に付与される点数とは、あがるために必要な 4 面子 1 雀頭のうちの、どの部分の 1 枚をテン

パイ時に持っていたかによって与えられる点数である。待ちの形とそれに付与される点数は、表 3-2 の

ようになる。

表 3-2. 待ちによる符数の違い

待ちの形 説明 例 符数

両面待ち 順子を作る 3 枚の牌のう

ち、表側面の牌を待ってい

るテンパイ

面子 面子 面子 雀頭

0

シャンポン待ち 2 個の対子があり、どちら

か片方の牌を待って対子

を刻子にするテンパイ

面子 面子 面子

0

カンチャン待ち 順子を作る 3 枚の牌のう

ち、中央の牌を待っている

テンパイ

面子 面子 面子 雀頭

2

ペンチャン待ち 順子を作る 3 枚の牌のう

ち、片側面の牌を待ってい

るテンパイ

面子 面子 面子 雀頭

2

単騎待ち 4 個の面子ができており、

雀頭を作るための 1 枚を

待っているテンパイ

面子 面子 面子 面子

2

面子および雀頭一つ一つに付与される点数は、表 3-3 のようになる。

表 3-3. 面子に付与される点数

暗(純手牌) 明(副露)

順子 0 0

刻子 中張牌 4 2

么九牌 8 4

槓子 中張牌 16 8

么九牌 32 16

中張牌(チュンチャンパイ) ・・・・么九牌以外の牌のことを言う。

Page 11: 卒業研究論文 - aows.jpaows.jp/lab/GR_2009/kobayashi/kobayashi.pdf · ックしたときにあがり、鳴き、リーチを実行するメソッド、牌や点数などの情報を表示するメソッドで

10

表 3-4. 雀頭に付与される点数

三元牌

自分の風(東家の東、南家の南等)

場の風(東場の東、南場の南等)

2

ダブル風(東場の東家での東等) 4

その他 0

ここで注意するべき点は、「シャンポン待ち」で「ロンあがり」した場合の、ロンした牌に係わる刻子

に対しては、明刻としての点数しか付与されないと言うことである。

以上に加えて、「ツモあがり」の場合は 22 点が与えられる。ただし、これには例外があり、カンした

あとのリンシャン牌であがった場合や、後に説明する「平和」という役がつく場合には、22 点ではなく

20 点が付与される。「ロンあがり」の場合は、副露しているときは 20 点、副露していないとき(「門前」

という)は 30 点付与される。

上記の点数をすべて足した上で、 後に 10 点単位で端数を切り上げる。たとえば合計点数が 26 点だ

った場合は 30 点になる。この点数と、下で説明する翻数を使って、実際のあがり点を計算する。

翻数

あがった手牌には、あがった状況や面子の組み合わせによってさまざまな「役」がつく。

「役」にはさまざまな種類のものがあり、一つの手に複数の役をつけることできる。そしてそれぞれ

の役には決められた「翻数」が与えられる。それらの翻数を合計した数が、あがり点の計算に使われる。

役の一覧は役の項目で説明する。

あがり点

あがり点は、特殊な場合を除き、「符数(ふすう)」と「翻数(はんすう)」によって計算される。符数

も翻数も、多いほどあがり点は上がる。また、あがった打ち手が親か子かによっても変わる。

符数と翻数から、あがり点は以下の式で求められる。

ただし、子のあがり点に換算して 8000 点以上の場合は、あがり点は、上記の式ではなく表 3-5 に従う。

また、役満をあがった場合のあがり点は、上記の計算などとは関係なく、「親」の場合は 48000 点、「子」

の場合は 32000 点である。複数の役満が複合した場合は、役満の数だけ点数が倍増する。また、役満の

役ではない通常の役の翻数が一定値以上の場合(たとえば 13 翻以上)、その手を役満(数え役満)とす

るルールもある。ここでは 13 翻以上を数え役満とした。

あがり点=16×符数×2 役の翻数(子の場合)

あがり点=24×符数×2 役の翻数(親の場合)

Page 12: 卒業研究論文 - aows.jpaows.jp/lab/GR_2009/kobayashi/kobayashi.pdf · ックしたときにあがり、鳴き、リーチを実行するメソッド、牌や点数などの情報を表示するメソッドで

11

表 3-5. 満貫以上のあがり点

翻数 あがり点

親 子

満貫(マンガン) 5 以下 12000 8000

跳満(ハネマン) 6 または 7 18000 12000

倍満(バイマン) 8 以上 10 以下 24000 16000

三倍満 11 以上 36000 24000

第7節 役

普通の役にはリーチ、一発、平和、断么九、一盃口、二盃口、翻牌、門前ツモ、海底ツモ、河底振り

込み、嶺山開花、槍槓、ダブルリーチ、七対子、全帯么、一気通貫、三色同順、三色同刻、三暗刻、三

槓子、小三元、混老頭、混一色、清一色、人和がある。役満には四槓子、大三元、清老頭、天和、地和、

字一色、小四喜、大四喜、緑一色、四暗刻、国士無双、九連宝燈がある。

このうち①役満の役が成立しているときはそれより下位の役(②満貫、跳満、倍満、三倍満、③満貫

未満)についてはカウントに入れない。また満貫、跳満、倍満、三倍満が成立しているときは②の領域

内の役についてのみカウントする。

それぞれの役の詳細な条件と判定方法については実装の章で説明する。

図 3-1. 役のグループとカウント範囲

第4章 実装

前章で述べたルールに従って進行するゲームを制作した。この章ではそのために使用した主な変数と

メソッド、副露、あがり、局の進行を実行した方法について説明する。

なお、プレイヤーは図 4-1 の手前側の打ち手を担当するものとし、残り 3 つの打ち手をコンピュータ

が受け持つ。そのため、実際の麻雀と同様に手牌は自分のものだけが見えており、他の打ち手の情報は

捨て牌とリーチ棒、点数しか見ることができない。(開発中は残りの三者のものも表示してデバッグを行

った。表示の有無はフラグでコントロールしているので、問題があればすぐに確認できる)

W役満

役満

満貫未満

三倍満

倍満

跳満

満貫

Page 13: 卒業研究論文 - aows.jpaows.jp/lab/GR_2009/kobayashi/kobayashi.pdf · ックしたときにあがり、鳴き、リーチを実行するメソッド、牌や点数などの情報を表示するメソッドで

12

プレイヤーのターンになると自動的に牌を山からツモるので、マウスで牌を選択して切る。コンピュ

ータが担当する残り 3 人分の打ち手は「ツモる」「切る」を自動で行う。思考の原則については「comp

の思考」の節で詳しく説明する。

図 4-1 に示すように、画面の中央にはドラ、局、リーチの積み棒、場の積み棒、山の残り牌数が、そ

の周囲にそれぞれの風牌と打ち手の名前、点数が表示される。名前と点数を囲む赤枠は、それぞれのタ

ーンが回ってきた打ち手であることを示す。

画面下にあるボタンは副露、カン、リーチ、あがりのためのボタンであり、プレイヤーがこれらの行

為を行える場合にのみアクティブになるので、それをクリックしてゲームを進めるが、あえて行いたく

ない場合は右クリックでキャンセルすることもできる。一番右側の「鳴きあり」と表示されているボタ

ンは、プレイヤーが副露を行うことができるかどうかをコントロールするボタンであり、クリックする

と表示が「鳴きなし」に変化し、本来「ポン」「チー」を行える場面でもそれらのボタンが反応しなくな

る。「鳴きあり(鳴きなし)」ボタンはクリックするたびにもう一方の状態に変化する。

図 4-1. 実行画面

第1節 変数

牌や点数を扱うため、以下の変数を用いた。

ゲームの進行に係わる変数

int Kyoku:局

ターンが来ている打ち手

ドラ

手牌

捨て牌

Page 14: 卒業研究論文 - aows.jpaows.jp/lab/GR_2009/kobayashi/kobayashi.pdf · ックしたときにあがり、鳴き、リーチを実行するメソッド、牌や点数などの情報を表示するメソッドで

13

int Oya:親

int Turn:ターン

牌を表す変数

0~3 が 、4~7 が …を表す。手牌と場の 1 つ目のインデックスは打ち手の番号、2 つ目のインデ

ックスは牌の位置を表す。

int Yama[136]:山の牌

int Pais[4][14]:手牌

int Ba[4][34]:捨て牌

int BaPos[4]:捨て牌の数

操作に係わる変数

int selectPai:マウスのカーソルがいる牌の位置

int selectPerson:マウスのカーソルがいる人の番号

点数計算に係わる変数

int Score[4]:点数

int numNaki[4]:鳴いた回数

bool Riichi[4]:リーチしたことを表すフラグ

第2節 メソッド

メソッドを描画系、判定系、実行系に大別して以下にまとめる。

1. 描画系

1.1. public:System::Void DrawScore(int Pos,int Pts,Graphics^gr)

打ち手の点数を表示する。

1.2. public:System::Void drawPai(void)

中央の枠とその中の情報、手牌、捨て牌、鳴いた牌を表示する。

1.3. private:System::Void pictureBox1_Paint

再描画で自動的に呼ばれる。ここから drawPai を呼ぶが、ウェイトが発生しているときは待ち時間終

了まで呼ばない。

2. 判定系

2.1. void CheckBeforeTsumo(void)

ロン、明カン、ポン、チーが可能かどうかのチェックを行う。これらのボタンは同時にアクティブに

Page 15: 卒業研究論文 - aows.jpaows.jp/lab/GR_2009/kobayashi/kobayashi.pdf · ックしたときにあがり、鳴き、リーチを実行するメソッド、牌や点数などの情報を表示するメソッドで

14

してはならないので、この並びで優先順位の高いもの 1 つをアクティブにする。ただし、優先順位の高

いものがキャンセルされていた場合は、次のものをアクティブにする。キャンセルされたかどうかはボ

タンの文字列で判別する。

・ ロン可能かどうかのチェック

現在のターンの打ち手以外の 3 人について

手牌に捨て牌を追加

あがり可能ならあがりボタンをアクティブにし、文字を「ロン」に書き換える

・ 明カン可能かどうかのチェック

現在のターンの打ち手以外の 3 人について

手牌に捨て牌を追加

明カン可能ならカンボタンをアクティブにする

・ ポン可能かどうかのチェック

現在のターンの打ち手以外の 3 人について

手牌に捨て牌を追加

ポン可能ならポンボタンをアクティブにする

・ チー可能かどうかのチェック

現在のターンの打ち手以外の 3 人について

手牌に捨て牌を追加

チー可能ならチーボタンをアクティブする

・ ロンボタンがアクティブだった場合、ロンをキャンセルして明カン、ポン、チーをチェック

明カンが可能

カンボタンをアクティブにする

明カン不可でポンが可能

ポンボタンをアクティブにする

上記 2 つが不可でチーが可能

チーボタンをアクティブにする

いずれも不可

全てのボタンを非アクティブにする

ターンを増やす

山から牌をツモる

・ 明カンボタンがアクティブだった場合、明カンをキャンセルしてポン、チーをチェック

ポンが可能

ポンボタンをアクティブにする

ポンが不可でチーが可能

チーボタンをアクティブにする

いずれも不可

全てのボタンを非アクティブにする

ターンを増やす

Page 16: 卒業研究論文 - aows.jpaows.jp/lab/GR_2009/kobayashi/kobayashi.pdf · ックしたときにあがり、鳴き、リーチを実行するメソッド、牌や点数などの情報を表示するメソッドで

15

山から牌をツモる

・ ポンボタンがアクティブだった場合、ポンをキャンセルしてチーをチェック

チー可能

チーボタンをアクティブにする

いずれも不可

全てのボタンを非アクティブにする

ターンを増やす

山から牌をツモる

・ チーボタンがアクティブだった場合、チーのキャンセル

全てのボタンを非アクティブにする

ターンを増やす

山から牌をツモる

2.2. public: System::Void CheckAfterTsumo(void)

ツモ、リーチ、暗カン、加カン可能かどうかのチェックをし、可能なら対応するボタンをアクティブ

にする。

・ ツモ可能かどうかのチェック

あがることができるか調べる

あがり可能ならあがりボタンをアクティブにし、文字を「ツモ」に書き換える

・ リーチ可能かどうかのチェック

リーチ可能か調べる

リーチ可能ならリーチボタンをアクティブにする

・ 暗カン可能かどうかのチェック

暗カン可能か調べる

暗カン可能ならカンボタンをアクティブにする

・ 加カン可能かどうかのチェック

加カン可能か調べる

加カン可能ならカンボタンをアクティブにする

3. 実行系(マウス、ボタン)

3.1. public: System::Void InitPai(void)

山、手牌、場、捨て牌を初期化して、山をシャッフルする。

3.2. private: System::Void pictureBox1_MouseMove

マウスが移動したときに呼ばれる。カーソルの位置を取得し、その位置の打ち手の番号と牌の位置を

対応する変数に入れる。

3.3. private: System::Void pictureBox1_MouseClick

Page 17: 卒業研究論文 - aows.jpaows.jp/lab/GR_2009/kobayashi/kobayashi.pdf · ックしたときにあがり、鳴き、リーチを実行するメソッド、牌や点数などの情報を表示するメソッドで

16

マウスでピクチャーボックスをクリックしたときに呼ばれる。

左クリック

通常

その位置の牌を切り、ロン、明カン、ポン、チーが可能かどうかのチェックを行った後、可能なら対

応するボタンをアクティブにする。不可能ならば次の人に交代して山から 1 つ牌をツモり、ツモ、リー

チ、暗カン、加カン可能かどうかのチェックをし、可能なら対応するボタンをアクティブにする。

リーチのボタンをクリックした後

リーチ後に切れる牌を切り、次の人に交代して山から 1 つ牌をツモり、ツモ、リーチ、暗カン、加カ

ン可能かどうかのチェックをし、可能なら対応するボタンをアクティブにする。

ポン、チー、カンのボタンをクリックした後

明カン、ポン、チー可能かどうかをチェックして、可能なら処理を終了する。不可能なら次の人に交

代して山から 1 つ牌をツモり、ツモ、リーチ、暗カン、加カン可能かどうかのチェックをし、可能なら

対応するボタンをアクティブにする。

右クリック

ロン、明カン、ポン、チーのいずれかのボタンがアクティブであった場合

その時点でアクティブであったボタンを非アクティブにし、優先順位の低いものについてチェックを

行い、可能なものをアクティブにする。すべて不可能なら次に人に交代して山から 1 つ牌をツモり、ツ

モ、リーチ、暗カン、加カン可能かどうかのチェックをし、可能なら対応するボタンをアクティブにす

る。

ツモ、リーチ、暗カン、加カンのボタンのいずれかがアクティブであった場合

それらを非アクティブの状態にする。

3.4. public: System::Void HaiPai(void)

局の開始直後に実行される。山からそれぞれの打ち手に 13 枚ずつ牌を渡す。

3.5. public: System::Void SortPai(int i)

受け取った番号の打ち手の牌を対応する数の小さい順に並べ替える。

3.6. public: System::Void KiruPai(int t)

pictureBox1_MouseClick から呼ばれる。受け取った打ち手の番号の手牌からマウスで選択した牌を切

り、ソートし直す。

3.7. public: System::Void updateNakiBtn(void)

Page 18: 卒業研究論文 - aows.jpaows.jp/lab/GR_2009/kobayashi/kobayashi.pdf · ックしたときにあがり、鳴き、リーチを実行するメソッド、牌や点数などの情報を表示するメソッドで

17

pictureBox1_MouseClick から呼ばれる。明カン、ポン、チーが可能かどうかのチェックを行い、この

順で優先順位の高いもの 1 つに対応するボタンをアクティブにする。それがキャンセルされた場合は優

先順位の低いものを順にアクティブにする。

3.8. private: Sytem::Void btn_Chi_Click

捨て牌の 2 つ前、1 つ前とでチーが成立する場合は btn_Naki1 のラベルをその 2 つの牌の名前に書き

換えてアクティブにする。

捨て牌の直後でチーが成立する場合は btn_Naki2 のラベルをその 2 つの牌の名前に書き換えてアクテ

ィブにする。

捨て牌の 1 つ後、2 つ後でチーが成立する場合は btn_Naki3 のラベルをその 2 つの牌の名前に書き換

えてアクティブにする。

3.9. private: Sytem::Void btn_Kan_Click

明カン可能であった場合、その処理をしてターンを交代して 1 つ牌をツモらせる。

加カン、暗カン可能であった場合は、その対象の牌の名前を btn_Naki1~btn_Naki3 に書き込んでアク

ティブにする。

3.10. public: System::Void ExecuteKan(int btn)

btn_Naki1~btn_Naki3 から呼ばれる。加カン、暗カンのいずれかであるかをボタン名から判定してそ

の処理を行った後、1 つ牌をツモり、ツモ、リーチ、暗カン、加カン可能かどうかのチェックを行う。

3.11. private: Sytem::Void btn_Naki1_Click

3.12. private: Sytem::Void btn_Naki2_Click

3.13. private: Sytem::Void btn_Naki3_Click

ラベル名がチーに関わるものであった場合はチーの処理を行い、鳴いた人にターンを移す。ラベル名

がカンに関わるものであった場合は ExcuteKan を呼ぶ。

3.14. private: Sytem::Void btn_Agari_Click

条件に応じてロン、ツモ、流局を行う。

3.15. private: Sytem::Void btn_Riichi_Click

点数から 1000 点引き、リーチの牌の切り待ち状態にする。

第3節 副露・カン

第1項 ポン

ポンが可能かどうかの判定を bool CanPon(int t,int sute) で行う。手順としては受け取った捨て牌

を使い、

・ リーチをしていたら false を返す

Page 19: 卒業研究論文 - aows.jpaows.jp/lab/GR_2009/kobayashi/kobayashi.pdf · ックしたときにあがり、鳴き、リーチを実行するメソッド、牌や点数などの情報を表示するメソッドで

18

・ 手牌と捨て牌を比べる

・ 比べた牌が同じで手牌に 2 枚以上あったら true を返す

というステップを踏む。ポン可能な打ち手がプレイヤーである場合には図 4-2、4-3 のようにして副露を

実行する。右クリックでキャンセルできる。

ポンした牌は図 4-3 に示すように 1 つを横向きにして表示する。横向きにする牌は、牌を捨てた打ち

手が下家の場合は右、対面の場合は中央、上家の場合は左側となる。

図 4-2. ポン可能な状態 図 4-3. ポンの実行

第2項 チー

チーが可能かどうかの判定を bool CanChi(int t,int sute) で行う。手順としては上家から受け取っ

た捨て牌を使い

・ リーチをしていたら false を返す

・ 捨て牌が字牌だったら false を返す

・ 手牌と捨て牌を比べる

手牌と捨て牌が同じ種類の牌か調べる

手牌のうち、捨て牌の 2 つ前、1 つ前、1 つ後、2 つ後の組合せの数を調べる

・ 比べた牌が 2 つ前と 1 つ前、1 つ前と 1 つ後、1 つ後と 2 つ後の組合せが 1 つ以上ずつあった場

合は true を返す。

というステップを踏む。チー可能な打ち手がプレイヤーである場合には図 4-4~4-6 のようにして副露を

実行する。チーの場合は複数の可能な組み合わせが出ることがあるので、チーのボタンのクリックで対

象となる牌を選ぶためのボタンを表示する。(図 4-5)さらにそれをクリックするとチーが実行される。

こちらも右クリックでキャンセルできる。

チーした牌は図 4-6 に示すように上家から受け取った牌を横向きにして左端に表示する。

Page 20: 卒業研究論文 - aows.jpaows.jp/lab/GR_2009/kobayashi/kobayashi.pdf · ックしたときにあがり、鳴き、リーチを実行するメソッド、牌や点数などの情報を表示するメソッドで

19

図 4-6. チーの実行

第3項 明カン

明カン可能かどうかの判定を bool CanMinKan(int t,int sute)で行う。手順としては受け取った捨て

牌を使い

・ リーチをしていたら false を返す

・ 手牌と捨て牌を比べる

・ 比べた牌が同じで手牌に 3 枚あったら true を返す

というステップを踏む。明カン可能な打ち手がプレイヤーである場合には図 4-7~4-8 のようにして副露

を実行する。こちらも右クリックでキャンセルできる。

カンした牌は図 4-8 に示すように 2 つを横向きにして表示する。横向きにする牌は、ポンと同様の規

図 4-4. チーが可能な状態 図 4-5. チーする牌の選択

Page 21: 卒業研究論文 - aows.jpaows.jp/lab/GR_2009/kobayashi/kobayashi.pdf · ックしたときにあがり、鳴き、リーチを実行するメソッド、牌や点数などの情報を表示するメソッドで

20

則に従う。

図 4-7. 明カンが可能な状態 図 4-8. 明カンの実行

第4項 暗カン

暗カン可能かどうかの判定を bool CanAnKan(int t) で行う。手順としては

・ 手牌を調べる

・ 調べた手牌に同じ牌が 3 枚あったら true を返す

というステップを踏む。暗カン可能な打ち手がプレイヤーである場合には図 4-9~図 4-11 のようにして

副露を実行する。暗カンの場合は複数の可能な組み合わせが出ることがあるので、カンのボタンのクリ

ックで対象となる牌を選ぶためのボタンを表示する。(図 4-10)さらにそれをクリックするとカンが実行

される。こちらも右クリックでキャンセルできる。

カンした牌は図 4-11 に示すように 2 つを裏返しにして表示する。

Page 22: 卒業研究論文 - aows.jpaows.jp/lab/GR_2009/kobayashi/kobayashi.pdf · ックしたときにあがり、鳴き、リーチを実行するメソッド、牌や点数などの情報を表示するメソッドで

21

図 4-11. 暗カンの実行

第5項 加カン

加カン可能かどうかの判定を bool CanChanKan(int t) で行う。手順としては

・ リーチをしていたら false を返す

・ ポンをしているか調べる

・ 手牌とポンした牌が同じ牌か調べる

・ 同じ牌だった場合 true を返す

図 4-9. 暗カンが可能な状態 図 4-10. 暗カンする牌の選択

Page 23: 卒業研究論文 - aows.jpaows.jp/lab/GR_2009/kobayashi/kobayashi.pdf · ックしたときにあがり、鳴き、リーチを実行するメソッド、牌や点数などの情報を表示するメソッドで

22

というステップを踏む。加カン可能な打ち手がプレイヤーである場合には図 4-12~図 4-13 のようにして

副露を実行する。(加カンも暗カンのようにカンのボタンを押した後で対象となる牌を選択するボタンを

押して実行するがここでは図を省略した)こちらも右クリックでキャンセルできる。

カンした牌は図 4-13 に示すようにポンの段階で横向きになっていた牌の上に付け加える形で表示する。

図 4-12. 加カン可能な状態 図 4-13. 加カンの実行

第4節 リーチ

リーチが可能かどうかの判定を bool CanRiichi(int t)で行う。手順としては

・ リーチ時に切るべき牌の位置を格納する配列 RiichiKiru[ ]のすべての要素に-1 を入れる

・ 手牌を先頭から一つずつ除いてみて、それがテンパイかどうかを調べる

テンパイの場合はその位置を「切れる位置」として RiichiKiru に記憶する

・ RiichiKiru に変化があった場合はリーチが可能であると判定する。

というステップを踏む。リーチが可能な場合は図 4-14 のようにリーチのボタンがアクティブになり、そ

れを押すとリーチが実行され、千点棒を場に表示し、点数から 1000 点を減算する。

その後、RiichiKiru に保存された位置の牌をクリックするとその牌を切ることができる。

Page 24: 卒業研究論文 - aows.jpaows.jp/lab/GR_2009/kobayashi/kobayashi.pdf · ックしたときにあがり、鳴き、リーチを実行するメソッド、牌や点数などの情報を表示するメソッドで

23

図 4-14. リーチ可能な状態 図 4-15. リーチの実行

第5節 あがりと局の進行

プレイヤーは「あがり」ボタン(ロンあがりが可能な場合はボタンの文字が「ロン」に、ツモあがり

が可能な場合は文字が「ツモ」に変化し、押せるようになる)を押すことであがることができる。

comp はあがれる局面で自動的にあがる。

誰かがあがると図 4-16 の様に役と翻数、符数、あがり点が表示される。また、打ち手間の点数のやり

とり、結果の得点も表示される。

END ボタンを押すと、次の局がある場合は再び配牌が行われ、ゲームが進行する。

図 4-16. あがりの実行

Page 25: 卒業研究論文 - aows.jpaows.jp/lab/GR_2009/kobayashi/kobayashi.pdf · ックしたときにあがり、鳴き、リーチを実行するメソッド、牌や点数などの情報を表示するメソッドで

24

第1項 あがり

あがりが可能かどうかの判定を bool Agari(int t)で行う。

t の打ち手があがれるかどうかを判定して、可能なら true を返す。あがれるパターンは通常、国士無

双、七対子の 3 通りに分けられるので、これらを個別に判定する。また、役がないとあがることができ

ないので、役の数をカウントする int Yaku(int t)を作り、これが 1 以上かつ 3 パターンのいずれかが満

たされた場合に true を返す形にした。

このメソッドはロンのチェック(牌を切った直後か副露の直後)、ツモのチェック(牌をツモった直後)

の両方に使用される。ロンのチェックの場合は、切られた牌を打ち手 t の手牌に追加した後で呼ばれるの

で、このメソッド中では打ち手 t の手牌数は必ず 3 の倍数+2 になる。

いずれのチェックにおいても、まず手牌と副露した牌のそれぞれの種類の数をカウントし

int man[10]:萬子の数(man[n]は「n 萬」の数)

int pin[10]:筒子の数(pin[n]は「n 筒」の数)

int sou[10]:索子の数(sou[n]は「n 索」の数)

int jihai[8]:字牌の数(jihai[1]~jihai[7]が東南西北白發中の数)

このような配列(以後牌数配列と呼ぶ)に格納して面子や雀頭ができているかどうかを調べる。

国士無双は、么九牌 13 種類すべてを 1 枚ずつと、もう 1 枚の么九牌を集める役なので

の数がそれぞれ 1 以上ある場合に true を返す。

七対子は、7 組の対子を作る役なので牌数配列が 2 のものが 7 つある場合に true を返す。

通常のあがりのパターンでは、まず 2 つ以上のペアができているものについて牌数配列からそれらを

除き、bool CheckJunKou(int t, int type, int atama)で残りの組み合わせが順子か刻子になっているかど

うかを調べる。

第2項 順子、刻子の判定

チェックすべき打ち手の番号、雀頭候補を受け取り、順子、刻子によるあがりが可能かどうかの判定

を bool CheckJunKou(int t,int type,int atama)で行う。

なお、副露していた場合もそれらは面子を形成しているので、初めに手牌をカウントしておいて面子

を見つけたらその数を減らしていき、0 になったらあがり可能であると判断する。

・手牌の数をカウントする(nokori)

・手牌のそれぞれの種類の数をカウントする

・順子があるかどうかを調べ、該当するものがあったらカウント数からそれらを取り除く

Page 26: 卒業研究論文 - aows.jpaows.jp/lab/GR_2009/kobayashi/kobayashi.pdf · ックしたときにあがり、鳴き、リーチを実行するメソッド、牌や点数などの情報を表示するメソッドで

25

ただし、

のように、同一の組み合わせが 2 つ存在するケースもあるので、

繰り返し(調査の先頭位置を 1から 7まで)

無限ループ

該当があったら残り(nokori)を減らす

該当がなければループを抜ける

という方法で、すべての数牌についてチェックを行う。

・刻子があるかどうかを調べ、該当するものがあったらカウント数からそれらを取り除く

繰り返し(調査の位置を数牌は 1から 9まで、字牌は 1から 7まで)

該当があったら残り(nokori)を 3 減らす

これを行うことによって全ての刻子を抜き出す。

ただし、 のようなケースでは数え落としが生じるので、こ

の後で刻子→順子の順に数え直してすべての牌が面子としてカウントされた場合も true を返す。

man[1]=0,man[2]=0,man[3]=3,man[4]=4…

・man[3]を 3 減らす

・手牌の残り数(nokori)を 3 減らす

man[1]=1,man[2]=1,man[3]=1,man[4]=4…

・man[1],man[2],man[3]を 1 ずつ減らす

・手牌の残り数(nokori)を 3 減らす

Page 27: 卒業研究論文 - aows.jpaows.jp/lab/GR_2009/kobayashi/kobayashi.pdf · ックしたときにあがり、鳴き、リーチを実行するメソッド、牌や点数などの情報を表示するメソッドで

26

この時点で残り数(nokori)が 0 であれば true を返す。

第3項 ロン

ロンが可能かどうかの判定を public: System::Void Ron(int i)で行う。

山越え、フリテンによるロン不可のルールを考慮に入れたロンの可・不可を配列の要素 flgCanRon[i]

に入れる。

・ 山越えとフリテンを考慮に入れずに現在の手牌があがり可能かどうかを調べ、結果を

flgCanRon[i]に入れる。

・ フリテンのチェック

現在の手牌を temp に入れる

すべての自分の捨て牌について

手牌の 後の牌を捨て牌に置き換える

あがり可能ならその打ち手の flgCanRon[i]を false にする

手牌を temp に入れていた手牌に戻す

・ 山越えのチェック

ロンできる状態を見過ごしてから 2 人分たっているか調べる

2 人分以上たっていない場合は山越えなので flgCanRon[i]を false にする

2 人分以上たっていた場合はあがることができるので flgCanRon[i]を true にする

第6節 役

翻数はコンピュータ麻雀のアルゴリズム、麻雀 - 役一覧 [4]を参考にしたが、一部は一般的に使われて

いるものに変更した。なお、役を判定する際にあがった牌の種類をカウントする必要があるが、手牌の

みをカウントするメソッドCountPaiと副露した牌を含めてカウントするメソッドCountPaiFullを別に

作り、場合によって使い分けた。

以下で役、その条件と翻数、またプログラムでの判定方向について説明する。

いずれの役についても、あがりが確定し手牌、副露した牌、 後に取得した牌が分かっている状態で、

翻数を返す(成立しない場合は 0)メソッドによってチェックを行う。

図 4-17. あがり牌のカウント

・待ちのチェック

役には待ちの状態によって翻数が変わるものがある。これを調べるために、 後に得た牌(ツモあが

りならツモった牌、ロンあがりなら捨て牌)を手牌から除き、そこに全種類の牌を入れて役の(完成形

の)条件を満たすかどうかを調べ、その候補を記録する。これが 1 つだけであれば単騎待ち、それが完

2 1 0 1 1 1 …

Page 28: 卒業研究論文 - aows.jpaows.jp/lab/GR_2009/kobayashi/kobayashi.pdf · ックしたときにあがり、鳴き、リーチを実行するメソッド、牌や点数などの情報を表示するメソッドで

27

成形の刻子の 1 つであればシャンポン待ちである、などのように判断する。

・ リーチ(門前のみ 1)

リーチをかけてあがった場合につく役。

・ 一発(門前のみ 1)

リーチをかけてから次のツモまでにあがった場合につく役。ただし、リーチをかけてからあがるま

でに誰かが副露やカンをしていた場合はつかない。

判定は次の 3 つの条件が満たされているかどうかで行う。

リーチしている

リーチしたときの捨て牌数が現時点の捨て牌数に等しい

局の開始時に偽、リーチすると真、誰かが副露すると偽になるフラグが真

ルールとしては副露していないことも条件だが、副露するとリーチを掛けられないので、第一の条

件がこれを網羅している。

・ 平和(ピンフ)(門前のみ 1)

数牌かオタ風(場風でもなく自風でもない風牌)の雀頭と 3 組の順子を作った上で、両面待ちであ

がった場合につく役。門前のみ。

待ち 、

待ちが何であったかを調べるため、あがりの直前の状態(ロンなら捨て牌、ツモならツモ牌を除い

た状態)に、全種類の牌を追加してあがれるかどうかを調べ、可能なら追加した牌を待ち牌として

記憶する。

判定は以下を全て満たしているかどうかで行う

待ち牌の中に同種の数牌で 3 だけずれてものがある

テンパイ状態で 3 つの順子がある

副露していない

雀頭が数牌かオタ風である

・ 断么九(タンヤオチュウ)(門前、 副露に関わらず 1)

么九牌を一切使わないとつく役。

判定に特に工夫はないが、手牌、副露した牌の両方についてチェックを行う。

・ 一盃口(イーペイコウ)(門前のみ 1)、二盃口(リャンペイコウ)(門前のみ 3)

一盃口:同一の順子を 2 組作る役。門前のみ。

二盃口:一盃口を 2 組作る役。

一盃口、二盃口共に七対子とは重複しない。

Page 29: 卒業研究論文 - aows.jpaows.jp/lab/GR_2009/kobayashi/kobayashi.pdf · ックしたときにあがり、鳴き、リーチを実行するメソッド、牌や点数などの情報を表示するメソッドで

28

一盃口

二盃口

判定を 1 つのメソッドにまとめ、第 2 引数が 1 なら一盃口、2 なら二盃口の判定をする形にした。

CountPai で手牌をカウントし、それをもとに順子をなしているものを調べ、順子の先頭の牌をイン

デックスとした配列で「その順子が何セットあるか」を調べる。 後に同一の順子が 2 セット以上

あるものの数をカウントする。

判定は次の 2 つの条件を満たしているかどうかで行う。

副露していない

2 セット以上の順子の組の数が第 2 引数と等しい

・ 翻牌(ファンパイ)(門前、副露に関わらず 1)

三元牌の刻子につく役。

自分の風の刻子につく役。

場の風の刻子につく役。

一つの刻子につきそれぞれ条件を満たすものを独立に 1 翻としてカウントする。

プログラムでは翻数として副露していない場合には

刻子のうち三元牌であるものの数

刻子のうち自風に等しいものの数

刻子のうち場風に等しいものの数

の和を、副露した場合は 0 を返す。

・ 門前ツモ(メンゼンツモ)(門前のみ 1)

門前でツモあがりのときにつく役。

・ 海底ツモ(ハイテイツモ)(門前、副露に関わらず 1)

その局の 後のツモ牌(海底牌という)であがった場合につく役。

判定は以下を満たしているかどうかで行う。

ツモあがりである

山の残り牌の数が 14 である

副露していない

・ 河底振り込み(ホウテイフリコミ)(門前、副露に関わらず 1)

その局の 後の捨て牌(河底牌という)であがった場合につく役。

判定は以下を満たしているかどうかで行う。

ロンあがりである

山の残り牌の数が 14 である

Page 30: 卒業研究論文 - aows.jpaows.jp/lab/GR_2009/kobayashi/kobayashi.pdf · ックしたときにあがり、鳴き、リーチを実行するメソッド、牌や点数などの情報を表示するメソッドで

29

・ 嶺上開花(リンシャンカイホウ)(門前、副露に関わらず 1)

リンシャン牌であがった場合につく役。

判定は以下を満たしているかどうかで行う。

局の開始時に偽、自らが暗カン、加カンしたときにツモあがりが可能なら真、副露をキャ

ンセルすると偽になるフラグが真

・ 槍槓(チャンカン)(門前、副露に関わらず 1)

他家が加カンした牌であがった場合につく役。

判定は以下を満たしているかどうかで行う。

局の開始時に偽、他家が加カンした時にロンあがりが可能なら真、副露をキャンセルする

と偽になるフラグが真

・ ダブルリーチ(門前のみ 2)

自分の 初の捨て牌時にリーチをかけた際、それまでに誰も副露、カンをしていない場合につく役。

判定は以下を満たしているかどうかで行う。

局の開始時に偽、副露が一度も発生していない状態で開始から一巡以内にリーチをかけた

ら真になるフラグが真

・ 七対子(チートイツ)(門前のみ 2)

通常なあがりの形とは異なり、7 組の対子を作る役。この場合の符数は 25 点となる。また、一盃口

とは重複しない。

判定は以下を満たしているかどうかで行う。

副露していない

テンパイ状態で 7 つの対子がある

・ 全帯么(チャンタ)(門前で 2、副露で 1)、純全帯么(ジュンチャンタ)(門前で 3、副露で 2)

全帯么:すべての面子が么九牌を含んでいる場合につく役。

純全帯么:数牌のみで、すべての面子が 1 か 9 の牌を含んでいる場合につく役。

全帯么

純全帯么

判定を 1 つのメソッドにまとめ、第 2 引数が 0 なら全帯么、1 なら純全帯么の判定をする形に

した。CountPaiFull で手牌と副露した牌をカウントし

全帯么では全ての牌をスキャンして

么九牌以外なら役の成立を不可にする

Page 31: 卒業研究論文 - aows.jpaows.jp/lab/GR_2009/kobayashi/kobayashi.pdf · ックしたときにあがり、鳴き、リーチを実行するメソッド、牌や点数などの情報を表示するメソッドで

30

純全帯么では

字牌があった場合に役の成立を不可にする

これらの条件をクリアした時に役が成立したとみなす。

・ 一気通貫(イッキツウカン)(門前で 2、副露で 1)

同じ種類の数牌で 123、456、789 の 3 組の順子を作る役。

判定は以下を満たしているかどうかで行う。

萬子か筒子か索子の 123、456、789 の順子が存在する

上の 9 枚を除いたものが面子、雀頭の組み合わせである

第 2 の条件は のようなケースを除外するために必要と

なる。

・ 三色同順(サンシキドウジュン)(門前で 2、副露で 1)

萬子、筒子、索子で同じ数の順子を作る役。

判定は以下を満たしているかどうかで行う。

萬子、筒子、索子の同じ数の順子が存在する

上の 9 枚を除いたものが面子、雀頭の組み合わせである

第 2 の条件は のようなケースを除外するために必要と

なる。

・ 三色同刻(サンシキドウコウ)(門前、副露に関わらず 2)

萬子、筒子、索子で同じ数の刻子を作る役。

・ 対々和(トイトイホウ)(門前、副露に関わらず 2)

4 組の刻子を作る役。

・ 三暗刻(サンアンコウ)(門前、副露に関わらず 2)

3 組の暗刻を作る役。

ただし残りの面子の条件として

① ツモあがりで順子

② ロンあがりでシャンポン待ち

Page 32: 卒業研究論文 - aows.jpaows.jp/lab/GR_2009/kobayashi/kobayashi.pdf · ックしたときにあがり、鳴き、リーチを実行するメソッド、牌や点数などの情報を表示するメソッドで

31

③ ツモあがりで副露 1 回のみ

のいずれかを満たさなければならない。

① の例

ツモのみ

② の例

待ち 、 ロンのみ

③ の例

待ち 、 ツモのみ

・ 三槓子(サンカンツ)(門前、副露に関わらず 2)、四槓子(スーカンツ)(門前、副露に関わらず役

満(13))

三槓子:3 組の槓子を作る役。

四槓子:槓子を 4 組作る役。

ゲーム進行中に記憶しておいた「鳴き」(カンも含む)のリストの中からカンの回数を調べてこれら

の役を判定する。

三槓子

四槓子

・ 小三元(ショウサンゲン)(門前、副露に関わらず 2)、大三元(ダイサンゲン)(門前、副露に関わ

らず役満(13))

小三元:三元牌のうち 2 つの牌を刻子とし、残りの 1 つを雀頭とした場合につく役。

大三元:三元牌 3 種すべての刻子を作る役。

判定では三元牌についてのみ刻子の数と対子の数を調べ、刻子×2+対子×1 の場合は小三元、刻子

×3 の場合は大三元とする。

小三元

大三元

・ 混老頭(ホンロウトウ)(門前、副露に関わらず 2)、清老頭(チンロウトウ)(門前、副露に関わら

ず役満)

混老頭:么九牌のみで手牌を構成した場合につく役。

清老頭:数牌の 1 の牌と 9 の牌のみで手牌を構成した場合につく役。

Page 33: 卒業研究論文 - aows.jpaows.jp/lab/GR_2009/kobayashi/kobayashi.pdf · ックしたときにあがり、鳴き、リーチを実行するメソッド、牌や点数などの情報を表示するメソッドで

32

混老頭

清老頭

・ 混一色(ホンイーソウ)(門前で 3、副露で 2)、清一色(チンイーソウ)(門前で 6、副露で 5)

混一色:字牌と、1 種類の数牌だけで手牌を構成した場合につく役。

清一色:1 種類の数牌だけで手牌を構成した場合につく役。

混一色

清一色

・ 流し満貫(門前、副露に関わらず満貫)

捨て牌で作る特殊な役。局の始めから終わりまで、么九牌以外を捨てなかった場合に、荒牌時にあ

がりとなる。ただし、自分の捨て牌が誰かに副露された場合は無効となる。

・ 人和(レンホウ)(門前のみ倍満(8))

自分の第 1 ツモの前に他家の捨て牌に対してロンあがりした場合につく役。他の役はつかない。

・ 天和(テンホウ)(門前のみ役満(13))

親が配牌であがったときにつく役。

・ 地和(チーホウ)(門前のみ役満)

子が第 1 ツモであがった場合につく役。

・ 字一色(ツーイーソウ)(門前、副露に関わらず役満(13))

字牌のみで手牌を構成した場合につく役。

・ 小四喜(ショウスーシー)(門前、副露に関わらず役満(13))、大四喜(ダイスーシー)(門前、副

露に関わらず W役満(26))

小四喜:風牌のうち 3 種を刻子とし、残り 1 種を雀頭とした場合につく役。

大四喜:風牌 4 種すべての刻子を作る役。

小四喜

大四喜

Page 34: 卒業研究論文 - aows.jpaows.jp/lab/GR_2009/kobayashi/kobayashi.pdf · ックしたときにあがり、鳴き、リーチを実行するメソッド、牌や点数などの情報を表示するメソッドで

33

・ 緑一色(リューイーソウ)(門前、副露に関わらず役満(13))

のみで手牌を構成した場合につく役。

・ 四暗刻(スーアンコウ)(門前のみ)

暗刻を 4 組作る役。

ただし条件として

④ ツモあがりでシャンポン待ち

⑤ ツモあがりで単騎待ち

⑥ ロンあがりで単騎待ち

のいずれかを満たさなければならず、役としては①、③の場合は役満(13)、②の場合は W 役満(26)

となる。

判定では、牌が揃った状態で CountPai で手牌の数をカウントして刻子が 4 つあることを第一

の条件とし、待ちの種類によって四暗刻の条件を満たすか、また役満か W 役満かを調べる。

「四暗刻(シャンポン待ち)」(役満)

待ち 、 (ツモのみ)

「四暗刻単騎」(ツモで W 役満、ロンで役満)

待ち

・ 国士無双(コクシムソウ)(門前のみ)

通常なあがりの形とは異なり、么九牌 13 種類すべてを 1 枚ずつと、もう 1 枚の么九牌を集める役。

手牌が各 1 枚ずつあり 13 種類を待ちとする場合を「国士無双十三面待ち」として W 役満とした。

「国士無双(通常)」(役満(13))

待ち

「国士無双十三面待ち」(W 役満(26))

待ち

・ 九連宝燈(チュウレンポウトウ)(門前のみ)

門前の清一色で、数牌を 1112345678999 ともう 1 枚の任意の数牌で手牌を構成した場合につく役。

1、9 牌が 3 枚、2~8 牌が各 1 枚ずつあり 9 種類を待ちとする場合を「純正九連宝燈」として W 役満

とした。

「九連宝燈(通常)」(役満(13))

待ち ( 、 も待ちだが九連宝燈にはならない)

Page 35: 卒業研究論文 - aows.jpaows.jp/lab/GR_2009/kobayashi/kobayashi.pdf · ックしたときにあがり、鳴き、リーチを実行するメソッド、牌や点数などの情報を表示するメソッドで

34

「純正九連宝燈」(W 役満(26))

待ち

・ ドラ(門前、副露に関わらず 1)

手牌に含まれるドラの数に応じて 1 翻つく。

第7節 流局

第1項 通常の流局

山の牌数が残り 14 枚となり、 後に牌をツモった打ち手が牌を切って誰もあがれないことが確定した

時点でこのタイプの流局が成立する。

END ボタンを押すと、親がテンパイ状態だった場合はその局が繰り返される。親がノーテンだった場

合は親と局を次に移す。どちらの場合も積み棒が増える。

図 4-18. 通常の流局

第2項 九種九牌

特殊な流局の一つである。いずれかの打ち手の手牌に 9 種類以上の么九牌がある場合にその打ち手の

宣言によって成立する。(流局を起こさないこともできる)ここではプレイヤーの手牌がその条件を満た

した場合に「あがり」ボタンの文字を「九種九牌」に変えてアクティブにし、それをクリックすること

で流局を確定させる。右クリックすると流局は起こらず通常のゲーム進行となる。

comp の手牌がこの条件を満たした場合は自動的に流局とする。

Page 36: 卒業研究論文 - aows.jpaows.jp/lab/GR_2009/kobayashi/kobayashi.pdf · ックしたときにあがり、鳴き、リーチを実行するメソッド、牌や点数などの情報を表示するメソッドで

35

この流局ではテンパイ、ノーテンの状態によらず点数の変動は起こらない。以下の項で説明する特殊

な流局についても同様である。

図 4-19. 九種九牌の状態 図 4-20. 九種九牌の流局

第3項 四風連打

特殊な流局の一つである。一巡目の捨て牌が全て同じ風牌であった場合に成立する。牌を捨てるたび

にこの条件が成り立つかどうかをチェックし、成立していたら即座に流局させる。

第4項 四カン流れ

特殊な流局の一つである。カンをした打ち手が 2 人以上いて、カンの総数が 4 回の場合に成立する。

カンをするたびにこの条件が成り立つかどうかをチェックし、成立していたら即座に流局させる。

第5項 四人リーチ流れ

特殊な流局の一つである。全員がリーチしていて、 後にリーチをかけた打ち手がその捨て牌でロン

されなかった場合に成立する。リーチ直後に切った牌でロンできるか調べるタイミングでリーチをかけ

た人数をカウントし、それが 4 であった場合に即座に流局させる。

第8節 comp の思考

コンピュータ麻雀には通信で他の打ち手と対戦する場合と、オフラインでコンピュータと対戦する場

合がある。今回制作したものでは通信を実装しなかったので、コンピュータの思考を作った。

打ち手を人間にするか comp にするかを簡単に決められるように int Routine[4]というものを作った。

それが 0 の場合は対応する場所の打ち手をプレイヤー、1 の場合を comp として扱う形にした。現時点で

は comp のルーチンを 1 つしか実装していないが、より賢い思考ルーチンを 2、3 に対応させて簡単に追

Page 37: 卒業研究論文 - aows.jpaows.jp/lab/GR_2009/kobayashi/kobayashi.pdf · ックしたときにあがり、鳴き、リーチを実行するメソッド、牌や点数などの情報を表示するメソッドで

36

加実装できる。

現在実装している comp の思考ルーチンの原則は

副露しない

手牌のうちから見つかる限りの面子、 大 1 つの対子を除き、残った牌の中からランダム

に切るものを選ぶ

ツモ、ロンに関わらずあがりが可能な時はツモ、ロンによらず即座にあがる

リーチが可能な場合は即座にリーチをする

手牌が九種九牌の条件を満たしている場合は即座に流局させる

である。なお、切る牌を選択するために面子を除外する際になるべく数え漏らしをなくすために順子→

刻子、刻子→順子の 2 通りの数え方で残り牌が少なくなる方を採用した。

この思考ルーチンでは対子を 1 組しか除外しないようにしているため、刻子になりうるものを崩して

しまう可能性がある。(図 4-21)全ての対子を切るものの候補から外したほうがいいように思えるが、そ

うしてしまうと図 4-22 のように手牌が面子と対子だけで構成されていた場合は牌を切ることができなく

なる。そのため除外する対子は 1 組だけに限定した。

第5章 考察

第1節 達成度の評価

親を決めて配牌をし、順番に牌をツモる切るを繰り返しながら、条件によって副露やあがりなどを行

わせ、点数計算、親の交代などによる局の進行を実装して一連の麻雀の流れを実現できた。また、comp

の思考ルーチンを実装して一通り麻雀ゲームとしての体裁を成すことができた。

第2節 改善案

第1項 表示系

現在は流局したときや、あがった時に他家またはあがった打ち手以外の手牌を確認することができな

いので、これを見せる仕様にするとより分かりやすくなるだろう。

また現在は、comp がリーチしたり、あがったときに特別な効果を入れていないので見逃しがちである。

そこで、それを示すような効果を表示してワンテンポ置いてやることも改善につながる。

図 4-21. 面子、対子、それ以外で構成される手牌

切る候補から除外 切られる可能性がある

現在の除外対象 全ての面子、対子を除外

図 4-22. 面子、対子だけで構成される手牌

Page 38: 卒業研究論文 - aows.jpaows.jp/lab/GR_2009/kobayashi/kobayashi.pdf · ックしたときにあがり、鳴き、リーチを実行するメソッド、牌や点数などの情報を表示するメソッドで

37

第2項 ルールの拡張

現在はゲームを開始するとすぐに配牌が行われ、東風戦でゲームが始まるだけであるが、半荘戦か東

風戦かをゲーム開始時に選択できるようにするとより本物の麻雀に近くなる。この他にも役の判定に関

わる「アリアリ」か「ナシナシ」などのルールも選択できるようにするとゲームの幅が広がるだろう。

第3項 comp の思考

現在の comp の思考ルーチンの原則はあまりに単純で対戦相手としては弱すぎる。強くするためのアイ

ディアで以下のことが考えられる。

① 捨て牌が翻牌であった場合は役が付くので副露させるようにする。

② 役を考慮して牌を切る候補に優先順位をつける。(1~4 の順で切る)

1. 他の種類の牌と隣り合っていない牌

2. 塔子(ターツ)(面子になる前の牌の並び、 や 、 など)の牌

3. 対子の牌

4. 面子の牌

③ 他家がリーチをしていたら、待ち牌を予測して牌を切り、その打ち手にロンされない様にする。

第4項 コードの整理

開発の当初の段階で comp の思考ルーチンの導入を考慮せずにコードを組んでしまったため、思考ルー

チンを導入する際にその処理を特定の場所にまとめることができなかった。そのため、バグの原因を見

つけることが非常に難しくなってしまった。

ルールの実装の際に例外処理などをきちんと把握していなかったために、ファイル構造の設計が無駄

に複雑になったことが原因なので、 適なファイル構造を考えて作りなおす他に、これを改善する方法

は考えられない。

第6章 文献目録

1. コンピュータ麻雀のアルゴリズム, 石畑恭平, 工学社.

2. 麻雀ルール, http://gatoh.sakura.ne.jp/mjrule/mjruletop.html. (オンライン)

3. 麻雀 - 役一覧, http://www.ne.jp/asahi/t-t/tumo/majan/jan.html. (オンライン)

4. 麻雀 点数計算解説書, http://www4.cty-net.ne.jp/~l6000all/tensu.html. (オンライン)

5. Wikipedia, http://ja.wikipedia.org/wiki/. (オンライン)