« 2005年5月 | トップページ | 2005年7月 »

2005/06/30

危険度判定評価関数作成中

ベタオリ処理作成中。まずは、現物牌をリストアップする関数を作成した。

問題は、補正値を算出するためのデータをどうするかだけど、ひいいさんの統計データを使わせてもらうことにする。
先日書いた方針で危険度を算出しようとした場合、牌毎の待ち形の割合という観点でまとめられているひいいさんのデータが利用しやすかったというのが一番の理由。まあ、自分のプログラムでデータを取るということもありなんだけど、やりたいことがまだ一杯あるんでまずは他の人の成果物を利用させてもらう。

それと、自分でテストしていて、ポン、チーするかを聞かれるたびにマウスでキャンセルボタンを押すのがウザかったのでESCキーとマウスボタンの右クリックでキャンセルできるように修正。

| | コメント (0) | トラックバック (0)

2005/06/27

ベタオリアルゴリズムの方針

これから、ベタオリアルゴリズムを作っていきたい。
ただし、近代麻雀ゴールドのページの下にあるような、リーチした人の捨てパイのみを見て当たり牌を1点読みするようなものを作るわけではない。そうではなくて、見えている牌をチェックして、それぞれの牌が当たり牌となる待ちの組み合わせ数をカウントして危険度を算出する方法でやっていく予定。

たとえば、3萬が当たり牌になる待ちは、ペンチャン(4x4,16通り)、カンチャン待ち(16通り)、3-6両面待ち(16通り)、シャボ待ち(6通り)、単騎待ち(4通り)ある。これらのトータルのパターン数が3萬の危険度になる。ただ、一般的にプレイヤーはできるだけ両面待ちになるように手を進める傾向があるので東風荘での待ちの形の出現比率を元にパターン数に係数をかけて数値を補正して危険度指数を出す。

この程度のプログラムはそれほど難しく無いはずで、これだけでもそこそこ正確なベタオリが出来るはず。その後、もし可能であれば、ドラやドラのまたぎ筋による点数補正とか、河の手出しパイの手順による当たりパイ読み補正とか役読みをやっていきたい。

放銃率こそがもっともプレイヤーの強さに影響を与えるパラメータであるとの統計結果もでている。
そして、市販の麻雀ゲームはちゃんとベタオリをしていない。これが市販の麻雀ゲームが弱い一番の理由だと思う。きっちりベタオリするプログラムが作れればそこそこ強い麻雀ゲームは作れるはず。そう信じているので頑張りたい。

| | コメント (3) | トラックバック (0)

2005/06/26

友人に試しに打ってもらう

ゲーム終了時の点数の精算処理と表示ダイアログまで作成。
最低限、(我慢すれば)ゲームとして遊べるようになったので友人に打たしてみる。
曰く、
「操作性に難あり」
ごもっとも、まだ改善していく予定です。
「キーボードで操作できないならカーソルを自動追尾にしたら」
多分これは鳴くか鳴かないかをいちいち聞いてくるときのことをいっていたと思うんで、キャンセルなどの処理をキーボードで出来るようにすることで代替することに。
「CPUの考慮時間は問題なし」
とりあえず安心。
「それと、COMのツモ良すぎ!」
結局友人は4着だった。まあ、確かに「こいつら引きツエエエ。いかさましてんじゃねーの!?このプログラム」と自分でも思うことあり。まあ、麻雀なんてそんなゲームですよ。


GUIにも改善項目はまだあるけど、今後は、まず先に、ベタオリのアルゴリズムを作成する。
総ステップ数:9180


| | コメント (0) | トラックバック (0)

変数名に悩む

私が英語が苦手なせいかもしれないが、プログラミングしてるときに意外と変数名、クラス名、メソッド名のつけ方に悩む。
普段はJavaとかVCLのライブラリ名を参考に名前のつけ方を決めることが多いけど、それでも結構迷うことはある。
長ったらしい名前をつけるのもアレだし、かといって短縮名をつけるのもイマイチ。出来ればメソッドは動詞にしたいが、しっくり来る英単語が思い浮かばない。かといってローマ字ってのもかっこ悪いし……

とくに、今回は麻雀なんで専門用語とか中国語が絡んでくるので悩みがさらに増加する。結局、ツモ、とか向聴数、などはローマ字で書いてるんだけどなんかかっこ悪い。

そんな悩みを抱えながら検索してたら以下のようなサイトが見つかった

英語で麻雀!
Mahjong for Dummies!! Learn Japanese Mahjongg

プログラミング全般の話で2chではこんなスレも
クラス名・変数名に迷ったら書き込むスレ

| | コメント (0) | トラックバック (0)

2005/06/24

アクセス解析してみると……

ごくわずかですが、このブログに麻雀のプログラミングの情報を求めて検索サイトから訪れる方もいるみたいです。時々有益な情報を載せていきたいですが、基本的に作業記録なんであまり情報が無いです、すいません。

初めての方なら以下の手順で進めると、最低限、上がりに向かうアルゴリズムは作れます。

1. 手牌を表現するクラス(構造体)の作成
2. 手牌を面子候補(ターツ、順子、刻子、対子、孤立牌)に分類する全パターンをリストアップする。
3. 分類した手牌のシャンテン数を調べるアルゴリズムの作成。
4. シャンテン数を上げるための受け入れ牌をリストアップする処理の作成
5. 1枚牌を取り除いて、シャンテン数を下がらず、受け入れ牌が一番多い牌を切る。

1は、2パターンのデータの表現方法を用意します。1つは単純に、どの牌を何枚持っているかを記録する方法。もう一つは手牌を面子(面子候補)に分類したときのデータの表現。
2の処理が最初思いつかなくて大変かもしれませんが、これは、再帰呼び出しを使ったバックトラック法で行えます。或る程度レベルのアルゴリズムの本なら、パズルを解く方法としてバックトラック法の処理は紹介されていますので、それを麻雀の場合に応用すればプログラムは組めます。
シャンテン数のカウントはターツ、面子、対子の数を数えることで行えます。

上記の処理ができれば得点計算も、ゲーム進行部分も根気で何とかなります。

| | コメント (0) | トラックバック (0)

2005/06/23

順位表示ダイアログ作成中

ゲーム終了時の順位表示ダイアログを作成中。相変わらずショボショボのGUI。

まあ、絵的にいまいちなのはともかく、情報が分かりにくい箇所については直す必要があるだろう。
現状では、リーチしても画面にも音にも変化が無い(牌は曲げてるが)ので、CPUの打牌が早いこともありなかなかリーチしたと気づかないことがある。ここら辺は改善しないといけない。

それと初めてCPUが役満を上がった。四暗刻でした。

yakuman


| | コメント (0) | トラックバック (0)

2005/06/22

バグ修正

七対子関係の役判定にバグ多数。塔子と対子を同一の配列に入れていたころの名残があった。
そのため、同一のバグか無いかどうか役判定ロジックを全面的再チェック。
また、期待値計算版評価関数(内部名eval6)にバグがあった。これはかなり細かく見えていない枚数やらなんやらを計算している。その中で、今からX順後に聴牌したときに、その地点からY順先までの期待値の合計値を求める処理の箇所でありえない順目(たとえば21順目とか)まで計算しようとしてテーブル領域をオーバーしていた。

| | コメント (0) | トラックバック (0)

2005/06/21

半荘単位でのゲーム

いままで、1局分のゲームしかしていなかったのを半荘単位でゲームが出来るように修正。
半荘単位でゲームが出来るようになったのでためしに数半荘プレイしてみた。
いかんせん、CPU3人は棒テン即リー全ツッパなんで跳ね満クラスの手が飛び交うド派手なノーガードの殴りあいの展開になる。
結局一度もトップを取れず。
うーむ、CPUがそれなりに強いことを喜ぶべきか、自分がヘタレなのを悲しむべきか。

明日以降、ゲーム終了時の順位表示と、ハコ、和了やめの処理を作成する。
そこまで、できればようやくベタオリの処理に手が回る。
mj


総ステップ数:8945

| | コメント (0) | トラックバック (0)

2005/06/20

点数移動処理とバグ修正

今週はサボリ気味。
流局、和了時の点数移動処理を作成。それとポン、チーしたときの処理にバグがあったので修正。

脳内では別の評価関数のアイディアが思い浮かんでいる。
シャンテン数の向上しない変化、鳴きの評価処理、速度の問題が解消できそうなんで、機をみて実装してみたい。

| | コメント (0) | トラックバック (0)

2005/06/09

送り槓禁止の処理作成

このゲームでは送りカンを禁止するルールを採用したいのだが、そのパターンを見つけるためのアルゴリズムを作成した。
14枚持っている状態のテンパイ形を(カンをしないものとして)4面子1雀頭候補にする。(多面待ちなどがあるため複数の候補の分け方がある場合もある)
4面子1雀頭候補に分類するとテンパイ状態では1牌が余剰牌になるのだが、送りカンになっていないかどうかを判定したい牌がどの候補でも必ず余剰パイになっていれば、送りカンではないのでカンできると判定できる。(はず多分)

2005/7/10追記
上記ではだめでした。
六七七七七⑤⑤⑦⑧⑨123ツモ六
六六七七七⑤⑤⑦⑧⑨123ツモ七
の二つが判断できない。
ツモった牌がアンカンの対象か?また、手牌(13枚状態で)テンパイしている4面子1雀頭の候補(複数ある場合あり)に分割したとき、積もった牌が常にアンコになっているかどうかを見るように修正。

| | コメント (0) | トラックバック (0)

2005/06/06

途中流局の処理ほぼ完了

四開槓、四風連打、三家和、九種九牌の処理作成。明日からは、リーチ後に待ちが変化する槓を禁止する処理をつくる。そこまで作ればようやく麻雀の1局を進行するために必要なルールは一通り出来上がる。しかし、マッタリがモットーの作業とはいえ、ここまでずいぶんと時間が掛かったものだ……

総ステップ数:8677

| | コメント (0) | トラックバック (0)

« 2005年5月 | トップページ | 2005年7月 »