GEN MUTO'S HOMEPAGE > Cell_雀公式サイト > 不定期コラム

Cell_雀 不定期コラム 第三十二弾!
 
 
麻雀ゲームは数字の並び替え
 
  
 
毎度ーっ! 今年もあとわずかになりましたね。
 月日がたつのはホントに早いものです♪


ドキドキCクラブ © GEN MUTO

 
 
 Cell_雀、新バージョンのver2.70で思考ルーチンの「劇的」強化をはかりました。
 新しいCell_雀、お楽しみいただいておりますでしょーか?

 麻雀のプログラミングは楽しいです。
 メインのロジックさえ組んでしまえば思考ルーチンの強化は全く別のところで行なえますから、実に保守性がいい!

 ver2.70よりCell_雀のソースコードも併せて公開しております。
 たくさんの方から、
 「ソースコードが見たい!」
 とご要望いただきました。
 そんなにニーズがあるのか…とちょっと感動し、お粗末なコードながらも公開させていただいた次第です(汗)。

 中をご覧いただくと大体わかると思うんですが…、麻雀ゲームのプログラミングは雀牌を数字に置き換えるところから始まります。
 Cell_雀の場合、数字の1-9が萬子牌、11-19が筒子牌、21-29が索子牌で、31-34が東南西北、35-37が白発中を担当しています。

 これを最初にHpai(14) As Longという配列に格納します。14は和了時の手牌の数、Hpaiは表示牌の略です。すると14枚の牌が数字に置き換えられて配列に格納されることになります。

 次に、Hpaiの構成をWpai(37) As Longという配列に格納しなおします。Wpaiはワーク牌の略です。37というのは先ほどお話した数字に置き換えた雀牌の全種類です。
 ここで何をしているのかというと…手牌の構成を37の要素をもつ配列に積算しているのです。
 つまり37種類(使ってない数字があるので実際には34種類)の牌の、どの牌が何枚、手牌にあるのか?…ということをコンピュータに教えているわけです。

 和了判定はこのWpaiを用いて行ないます。
 Wpai(1)から順番に見ていって二枚以上、牌を持っているところをまず雀頭に決めます。あとは残りの配列から順子と刻子の構成になっている要素を除算していきます。
 最終的に配列の中身がゼロになっていれば、その配列(手牌)は和了しています。

 和了していなければ続きの要素から再び雀頭を探し、見つかれば同じ事を繰り返します。
 配列の最後までいっても和了のパターンが見つけられなかった場合、その手牌は和了していません。

 簡単に言ってしまえばこれが和了ルーチンの全てです。
 こんな簡単な理屈で国士無双と七対子を除く全ての和了パターンを判定できます(笑)。

 コンピュータは常にこの37種類の”数字”を用いて麻雀します。
 ワークシート上に見えている「一萬」は「1」の数字を別表からVlookup関数で「一萬」として拾ってきてるだけです。
 (五時までモードの「一部」とかも、同じ表からVlookupで置き換えてるだけでプログラム側ではなんら操作してません)

 あとは先ほどの配列をもとに、鳴けるときは鳴きダイアログを出したり、テンパったときはリーチがかけられるように制御するだけです。
 これで基本的な麻雀の動きは実現します。

 多分、難しいのはこの後でしょう。
 それなりに強い麻雀ゲームを作るためには…COM側にそれなりの思考ルーチンを持たせる必要があります。

 ・ダマで満貫ならリーチをしないほうが得策?
 ・他家、三副露ならテンパったとみるべきか?
 ・一飜下げても和了やすさを優先すべき?
 ・ラスにドンベがノミ手でテンパっちゃった(どうしよう? 笑)

 これらを、その時の得点状況とゲームの進行状況に応じて的確に処理させる必要があります。
 これらは全て、今回のバージョンアップで取り入れた要素です。

 強いだけの麻雀ゲームではつまらない…。
 でも弱い麻雀ゲームはもっとつまらない。

 いろいろな意味で完成された「麻雀ゲーム」をCell_雀は目指したいと思います。
 
 
 

>> 次の話にすすむ