X



※麻雀ロジック研究会※
■ このスレッドは過去ログ倉庫に格納されています
00011
垢版 |
NGNG
麻雀のロジックについて研究しませんか?

麻雀ゲームなんかで強いCPUキャラクターとやると
どうしてもプログラムの方で積み込んでいるとしか思えません。
人間の思考に近づくロジックを話し合いませんか?
0004デフォルトの名無しさん
垢版 |
NGNG
よーし、俺がネタヲ振ってやるぜ
ファジイ推論でルールヲつくって
すべての牌について、それを切ったときの評価をだして
評価の高かった牌を切る

どうよ
00051
垢版 |
NGNG
今のところ私が考えているのは、
キャラ毎に、ピンフ好き、タンヤオ好きとかにわけるしかないかなぁ
と、考えていますが、それだと上がれないですよね。
つまり強いCPUにはなり得なくなってしまいます。
ただ、前もって積み込みとかにしちゃうと、聴牌状態で
何巡目にリーチを書けて自摸る、とかいう設定になってしまいますし。。。
味気ないキャラクターになってしまいますよね。

ん〜難しいw
0006デフォルトの名無しさん
垢版 |
NGNG
まずは、上がりまでの起こりうる未来を全て列挙して、
その中から一番良いパスを選ぶことを考える。

多分、現在の計算機の能力ではできないので、
1)起きえないであろう選択肢をカットする
・ドラが2枚そろっていたら捨てない。
・終盤で、捨牌に出ていない牌は捨てない
など
2)最後まで読み切れないので、途中の状態で
得点を予測して、そのパスの得点とする。

を考える。

>>4 は 2) の一つの方法

1)でキャラクターの個性を出せるけど、最初は
最強プレーヤーを目指して作成して、機能制限
や評価項目の重み付けの調整で個性を作って
いった方が作りやすい
0009デフォルトの名無しさん
垢版 |
NGNG
>>6
>まずは、上がりまでの起こりうる未来を全て列挙して、
>その中から一番良いパスを選ぶことを考える。

「良さ」を計る関数の定義が出来ればほぼ終わったようなものな希ガス
関数を考えるに当たって
- 自分の上がりへの近づきとその点数の期待値
- 他家の手を進める、または振り込む期待値
くらいなのかな。

「上がりへの近づき」や「手を進める」というのをどう数値化するかが難しそう。
00101
垢版 |
NGNG
>まずは、上がりまでの起こりうる未来を全て列挙して、
>その中から一番良いパスを選ぶことを考える。

手牌からその可能性を計算して、
ツモるたびにその可能性を狭めて行くやりかたですかね?
ある程度の前例をデータとして保持し、その型にあったやり方で
進行して行く訳ですか。

人間にも経験というものがありますし、これはいいですね。

記憶として対戦相手の思考もコピーしていくような、
ロジックもいれると面白そうですね。
役が成立するパターンの配牌を記憶し、
自分の配牌をそれにあてはめて、前例だとこの役が成立する予定だから
それを必死に集めるとか。
00141
垢版 |
NGNG
>>12

プログラム自体はあります。
役判定はライブラリとか使ってますが・・・

ただ、決まった打ち方しか出来ないんですよね。
ピンフを中心に構成していくとか、
アンコばかり集めるとか・・・

さらにCPUを強化するには積み込むしかないし・・・

その辺を今後、研究していければいいと思っています。
将棋とか、囲碁と違って運もかなりゲーム要素に影響するので
なかなか難しいところではあります。
00151
垢版 |
05/01/17 10:59:28
牌に積み込む計算は
安全牌を計算しないといけないですね。
実装すると、モッサリしそうですが、
搭載したいきのうです。
0016デフォルトの名無しさん
垢版 |
05/01/18 01:45:26
このスレの住人が、ロジックを適当な言語で実装したモノを持ち寄って
対戦させられるような仕組みがあったら面白そう。
>12の言ってるのもそういうことじゃないのかな。
00171
垢版 |
05/01/21 15:01:21
面白いかもしれないけど、みんな暇じゃないですよね。
私も、現在、納期前でいそがすぃし
0019デフォルトの名無しさん
垢版 |
05/01/25 23:54:34
こんなの見つけた
ttp://members.jcom.home.ne.jp/hennano/maujong/java/
00201
垢版 |
05/01/31 19:14:11
ごめんよ。仕事の合間にふと思ってさ。
軽はずみにスレ立てちゃいかんねv(>_<)v
0021デフォルトの名無しさん
垢版 |
05/02/11 04:36:53
麻雀だと将棋スレみたく、最強を目指すと言うわけにはいかないのかな。
確率的に最善の手探しても、結局は運だろうから。
0022デフォルトの名無しさん
垢版 |
05/02/11 20:48:40
将棋におけるCSAプロトコルみたいな、ある程度標準となるネットワーク対戦プ
ロトコルみたいのって麻雀ではないの?
0023デフォルトの名無しさん
垢版 |
05/02/14 19:16:40
誰か、和了チェック関数見せてくれませんか?
漏れの使いかたが悪いのか、
http://www.interq.or.jp/snake/totugeki/mjcom_p0.htm
これを実装するとスタックオーバーフローになってしまいまつ。
0024デフォルトの名無しさん
垢版 |
05/02/15 02:36:37
ループ終わらずにネストし続けてしまってるんだよね。

ぱっと見ありそうなのは先頭の
>for(;!tehai[i];i++)if(i>=43){return;} //上がっている場合ここが実行される
で i=0とかしてたり?
0027デフォルトの名無しさん
垢版 |
05/02/15 16:27:30
>>24
あまり変数はいじってないんですけどね。
return の前に悪いやりかただろうけど大域変数のflagを使ってるだけで・・・
この人麻雀研究で有名だし、やっぱり漏れが悪いんだろうなあ。
0028デフォルトの名無しさん
垢版 |
05/02/15 17:00:06
その関数は悪くないと思うよ。
どんな使いかたしてるの?
見てあげるからソース貼ってみそ。
0030デフォルトの名無しさん
垢版 |
05/02/15 18:19:05
そのままコンパイルして実行してみたけど、問題無かったよ。
この状態でスタックオーバーフローになるの?
0031デフォルトの名無しさん
垢版 |
05/02/15 18:43:48
スタックオーバーフローは、恐らくなんですが・・・
VC++6のデバックモードだと、きちんと表示されるんですが
リリースモードと、BCCでは、最後のprintfが表示されないんです。
何が原因なのかなあ。
003228
垢版 |
05/02/15 18:49:23
>>29
tehai[43]で面子を作ろうとして無限ループ(再帰)してるな。
この関数はtehai[43]==0を前提にしているらしい。
tehaiの定義を 1増やして、
int tehai[44]=
{0, 0, 3, 0, 0, 0, 0, 0, 0, 0, //0-9
0, 0, 0, 1, 1, 1, 0, 0, 0, 0, //10-19
0, 2, 1, 1, 1, 1, 1, 1, 0, 0, //20-29
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //30-39
0, 0, 0, 0}; //40-43
で、うまくいくかも。
0033デフォルトの名無しさん
垢版 |
05/02/15 19:05:53
>>32
おお、最後きちんと表示されるようになりました。
まだおかしなところがあるかもしれませんが、とりあえず前進しました。
ありがとうございますm(__)m


0035デフォルトの名無しさん
垢版 |
05/02/15 22:17:17
そんなに数無いんだし自分で作れば?
漢字フォント作るより楽だと思うよ。
0036デフォルトの名無しさん
垢版 |
05/02/17 09:56:47
>>35
そんなこといわずに教えてください
0037デフォルトの名無しさん
垢版 |
05/02/17 12:09:45
上がり得点/期待値が最も高い手になるようプログラムすればいいじゃん。
統計的には確実に強い打ち方になるぞ
0044デフォルトの名無しさん
垢版 |
05/02/21 00:25:39
麻雀のルールって、増築に増築を重ねた「九龍城」みたいなものだからな・・・

実際にさまざまなルールを統合してプログラムを作成しようとすると、
あちらこちらに矛盾点が出てくるんだよね。

実際にゲームをしている時には殆ど発生しない
レアなケースでのみ起こる矛盾点もプログラムにする以上、
ちゃんと解決しなくちゃいけないし。

例えば、「完全先付け」とかさ・・・

あれ考えた奴、脳みそのネジが5,6本、抜け落ちているんじゃないのか?
0046デフォルトの名無しさん
垢版 |
05/03/01 14:16:30
麻雀に関してのプログラムの書いてある本
何でもいいので教えてください
0047デフォルトの名無しさん
垢版 |
05/03/06 21:02:00
age
0051デフォルトの名無しさん
垢版 |
05/03/19 18:21:49
>>44
>例えば、「完全先付け」とかさ・・・

>あれ考えた奴、脳みそのネジが5,6本、抜け落ちているんじゃないのか?

タコ麻雀対策だろ。
麻雀格闘倶楽部やってるとたまに後付で勝つウザイ香具師が多い
005244
垢版 |
05/03/20 20:36:31
>>51
いや、俺が思うに、多分あのルールは
筋者の方々が素人さん相手に勝負をする時に
散々難癖を付けて、カネを搾り取るためのものだと思う。

その理由は・・・

1.ルールの出自が関西であり、今も関西でしか行われていない

2.「完全先付け」には様々なパターンと、それに対する様々な解釈があり、
それら全てをゲームの前に確認しておくのは不可能

3.その後のゲーム中で、事前に確認が取れなかったケースが
発生した場合、間違いなく腕力の強い奴の主張がまかりとおる

まぁ、そんな深読みをしなくても、実際にプログラミングをしてみれば
すぐ分かる。
「完全先付け」がどれほどトチ狂ったルールであるかが・・・
0054デフォルトの名無しさん
垢版 |
2005/06/08(水) 23:18:22
麻雀AIのロジック。

ツモ麻雀できるロジックを示しす漏れが来ましたよ。

A.総当り式
1、牌を積もる。
・上がっているーー>「ツモ!」
・上がってないーー>2、へ
2.捨てられるパイを仮捨てしてみる(捨てられる牌数分のパターンあり)
・積もる牌がまだ有るかーー>3、へ
・もう可能性ツモがないときは、
_・上がりリストから最良のデータを使い捨て牌を決定し捨てる−−>1,へ
_・上がりリストがない時は、牌評価数値表からいらないのを捨てる。
3、つもり可能性のある牌をつもってみる。(積もれる可能性分のパターンあり)
・上がりかーー>4、へ
・上がらないーー>2、へ
4.上がり評価
待牌の確立と点数の期待値を計算する。上がりリストに登録。
・次の可能性ツモ牌が有る時はーー>3、へ

興味があったらageみて。
0056デフォルトの名無しさん
垢版 |
2005/06/16(木) 02:45:27
ほい、

BOOL 上がり判定(int 手牌[])
{
if(国士か(手牌)) { return TRUE; }
if(チイトイか(手牌)) { return TRUE; }
for (int i = 0; i < 34; i++) {
if (手牌[i] >= 2) {
手牌[i] -= 2;
if (面子確認(手牌)) {
手牌[i] += 2;
return TRUE;
}
手牌[i] += 2;
}
}
return FALSE;
}
3つの関数は自分で考えろ。
聞くだけなら、もう何も出ない。
0060デフォルトの名無しさん
垢版 |
2005/08/23(火) 06:35:38
みんなで麻雀の思考ルーチンを作って、東風荘とかで対決してみたいなあ。
東風荘の画面から牌の情報を読み取ったりするライブラリは >>23のHPで公開されているから、
純粋な思考ルーチンの部分を作るだけでいいし。

age
0062デフォルトの名無しさん
垢版 |
2005/08/23(火) 10:02:16
「振らない」というのはロジックにどう組み込みますか?

というか、捨て牌から手役の高さと待ちを読むロジックは
あまり研究されてない分野と思う
0064デフォルトの名無しさん
垢版 |
NGNG
マージャンはルールが不明な部分が多いんだよな。

カンが四つで流れるってルールとスーカンツは両立しないけど、どうなってるんだとか。
・一人でカンを四つの場合は流れない
・カンを四つした時点でスーカンツができてなかったら流れる
・その他
とか、いろいろ考えられるけど、本屋に売ってるマージャンの本なんかには
載ってないし。
(なんとか協会とかのルールには決められてるんだろうけど)
0065デフォルトの名無しさん
垢版 |
2005/08/23(火) 10:30:26
>>64
仕様(ルール)の振れ幅は決まってるんだから、たいした問題ではないだろう
0066デフォルトの名無しさん
垢版 |
2005/08/23(火) 12:19:22
>>62
真面目に組むんだったら、捨牌戦略は割と簡単に組める

・裏筋チェック
・壁チェック
・自分の手牌と場に出た牌の数え上げ
・染め手系のチェック
・序盤の中張牌(変則待ち)チェック

・・・といろいろあるが、はっきり言って、上の3つ程度を行えば十分だし、
それ以上やったら、かえって弱くなる傾向がある。
(変則待ちや染め手を警戒するあまり、棒テンにぶち当たる)

本当はプレイヤーの待ち牌をチェックして出さないことだが、それはあくまでも反則ということで。

あと、日本プロ麻雀連盟の公式ルール(抜粋)
ttp://www.ma-jan.or.jp/rule.htm

あと、スーカンツは1人で4つのカンをした場合に成立し、その場合5つめのカンの発声および牌の提示とともに流局となる。
それ以外の場合は、全て4つめのカンが成立した時点で流れとなる。
カンの成立は、カンをした人が、リンシャン牌をツモり、手牌の中から不要な牌を打牌した瞬間。
(カンドラありのルールの場合、チャンカン時にはカンを行った人の打牌が行われていないため、新ドラが成立しない)
0068デフォルトの名無しさん
垢版 |
2005/08/23(火) 15:39:48
>>66
手役の高さを推測し、期待値計算して自分の手の期待値と比較して
相手のノミ手より自分のとびまんを優先して 危険牌でも打つ みたいな
そういうロジックを組みたいよな
あと、当然ネットワーク対戦等の 神(サーバ)があり 打ち手(クライアント)
があるという構成での最強を目指したいよな
006966
垢版 |
2005/08/23(火) 16:03:00
>>68
実は色々やっているんだが、実は「リーチ一発・裏ドラあり」というルールや、
「カンドラ・カンウラあり」とか「赤五ピン・赤五ソーあり」とか
「ウラドラチップ制」などの、祝儀たくさんのインフレ麻雀になればなるほど・・・

(1)自分から見える情報だけで、もっとも待ち牌がたくさんある面子選択を面前で行う。
(2)字牌を除き9-10枚以上同種牌が無いとチンイツに行かない。(ホンイツは想定外)
(3)聴牌はもっとも残り枚数が多い形(たいていはリャンメン待ちかその変形)
を選択し、リーチを必ずかける(裏ドラが乗るため)
(4)相手のリーチはこちらが2シャンテンより遅い場合は全て無視

・・・という棒テン・即リー・タコツッパリ君AIが強かったりする。

逆に一発ウラドラなしルールだと、AIのウエイト変数を工夫した、
敵側の捨てパイ読み部分のプログラムの作成が楽しくなるのだが。

また同じAIを使っても、棒テン即リー君ばかりのAIx4人の相互対戦の場合とか、
染め屋さんAIが一人入るとか、なんちゃって鳴きの竜AIが入ってくるか、
・・・またそのAIがどこに座るかによって、対戦結果が有意(5%以上)違ってくるので、面白い。

まだまだ研究途上だけどね。
007060
垢版 |
2005/08/23(火) 20:35:25
>>61
Javaでいいなら、ここでダウンロードできるよ。

tp://www5e.biglobe.ne.jp/~tatano/index.html
007161
垢版 |
2005/08/25(木) 08:38:59
>>70
おお、ありがとう。思考以前に麻雀動かすだけで四苦八苦ですわ
0072デフォルトの名無しさん
垢版 |
2005/09/01(木) 00:53:18
>>68
点差の問題や残り牌の問題もあるので相当難しくなりそう。
>>69
麻雀格闘倶楽部ではライフ制の香具師がライフ切れ落ちすると次局からCPUになるが
そのCPUの下家は圧倒的に有利w
0073東風荘じゃ1600程度
垢版 |
2005/09/01(木) 11:33:02
おまいら教えてください

最強の麻雀ロジックを作るため研究を始めました。
まずポンチーカンロンなし、役もなしですべてのプレイヤーがひたすら上がりに向かうという
シミュレーションを行っているのですが、この状況で誰かが上がる確率が50%にしかなりません。

麻雀そのものにそれほど詳しくないのでこれが妥当なのかよくわからんです
次に今のアルゴリズムを書きます
0074東風荘じゃ1600程度
垢版 |
2005/09/01(木) 11:36:55
>>73
一枚引いて14枚になったら・・・

IF 聴牌
 return どの牌を捨てたら一番待ちが多くなるか()

FOREACH hai IN 手牌
 仮想手牌 = 手牌からhaiを取り除く
 評価(仮想手牌)

return 一番評価の高かったhai
0075東風荘じゃ1600程度
垢版 |
2005/09/01(木) 11:42:30
>>74
評価関数は・・・

評価(牌の配列)
 int SCORE
 WHILE 順子 がある
  配列から取り除いて、SCOREに順子値をプラス
 WHILE 刻子 がある
  配列から取り除いて、SCOREに刻子値をプラス
 WHILE 両面 がある
  配列から取り除いて、SCOREに両面値をプラス
・・・

という感じで重要な構成要素から点をつけています。
この両面値などを適当に調整しているのですが、この方法ではパラメータがプログラマの
マージャンの知識に依存してしまうし、仮定のような簡単な状況(役なしなど)でなくなった
場合に応用が利きません。

なにかよい方法はないでしょうか?
0076デフォルトの名無しさん
垢版 |
2005/09/01(木) 12:21:23
>>73
>ポンチーカンロンなし、役もなしですべてのプレイヤーがひたすら上がりに向かう
という状況なら
>誰かが上がる確率が50%
そんなもんだろ
>>75
>この方法ではパラメータがプログラマのマージャンの知識に依存してしまうし、
>仮定のような簡単な状況(役なしなど)でなくなった場合に応用が利きません。
詰め将棋のように今の手配から上がるまでを総当りで調べる

0077東風荘じゃ1600程度
垢版 |
2005/09/01(木) 13:03:24
>>76
>詰め将棋のように今の手配から上がるまでを総当りで調べる
これをやってしまうと10000回とかのシミュレーションが行えず(時間がかかりすぎるため)
悩んでいます。

しかし50%が妥当なのであれば、そろそろ次のステップに行こうかと思います
・ロンできるようにする
・捨て牌を見る
・役判定をいれる
くらいからはじめようかなと思っています
007876
垢版 |
2005/09/01(木) 16:28:14
枝狩り。理想は総当りだが、実際には時間に合わせて読むようにする
それか、数牌だけとか抽象化したモデルで先にデータベース化(定跡)するとか
さらに、こちらの番やアニメーション+音声の再生時に読むとか
これが難しいなら、積み込みや手牌透視ができるインチキ対戦CPUを作る
0080デフォルトの名無しさん
垢版 |
2005/09/05(月) 20:11:02
>>白木
それは違うぞ
0084デフォルトの名無しさん
垢版 |
2005/09/08(木) 11:47:39
コンピュータ対戦も可能なネット麻雀を作ったら面白いな。
対戦相手はランダムな選出だけど、運良く二人以上が選ばれたら
通しもしていいというルールで。
まあ同一IPからの接続は二人まで、と縛っとけば
CATV以外の人はそう困らんでしょう。
山に対する仕掛けが出来なければそれなりにフェアだし。
0085デフォルトの名無しさん
垢版 |
2005/09/08(木) 22:53:10
>>78
手牌透視とかはアーケードの某ネット対戦麻雀でも大々的にやってるらしいな


 315 名前:焼き鳥名無しさん[sage] 投稿日:2005/09/07(水) 03:54:12 ID:???
 金突っ込まないと上がれないようにする。これ当然の話。
 MJは知らないが、以前組んだオンラインマージャンシステムだと・・・

 まずは、リーチをかけようがポンしてもチーしてもツモ牌は変わらないようにする。
 すなわち配牌グループ13枚x4,ツモグループ17枚x4程度を事前に作る。

 投入資金をパラメータ化しておき、高額支払い者が比較的有利になるように
 乱数を使って、ほどほどに偏りのある有利度補正値を適宜決定する。  

 有利度補正値によって、配牌グループでは、(1)(2)(3)(4),ツモグループでは(1),(2)を作る。

 (1)中張牌の出現頻度を10,20,30,40%多いグループを作る
 (2)特定の柄(ピンズ、ソーズ、マンズ)が10,20,30,40%多い割合で選択されるグループを作る。
 (3)場風と字風と三元牌を2枚もしくは3枚含むグループを作る
 (4)ドラ牌を2枚もしくは3枚含むグループを作る。

 なお、何も補正を加えなくてもいい場合は、完全ランダムで牌を選ぶ。

 テストプレイでは、中張牌が20%程度多い配牌で、同様のツモグループにするだけで、
 飛躍的に得点が伸びるし、リーチ一発も多くなる。
 しかも、一見して細工しているのがわからない。

 役満(三元牌を5枚以上積み込む)などの露骨な細工は、(露骨過ぎるので)あまりしないでほしいといわれた。
 (ただ一色手方向の補正が大きくなると、大車輪・九連宝灯・緑一色などの出現頻度が高くなる...四暗刻も増える)

0086デフォルトの名無しさん
垢版 |
2005/09/09(金) 00:49:19
おまえら、PS2の麻雀やろうぜ!2でも参考にしろ
0087デフォルトの名無しさん
垢版 |
2005/09/09(金) 20:22:09
白木、出て来い
0089デフォルトの名無しさん
垢版 |
2005/10/31(月) 00:35:54
age
0090名前は開発中のものです。
垢版 |
2005/11/25(金) 19:01:36ID:/aObainy
 
0092名前は開発中のものです。
垢版 |
2006/06/16(金) 15:06:48ID:gys/BJwI
age
0093名前は開発中のものです。
垢版 |
2006/06/22(木) 04:21:40ID:2BUVy0Re
age
0094名前は開発中のものです。
垢版 |
2006/07/04(火) 12:32:40ID:RtEqyIQY
AI同士を対戦させるプログラムを作ってみようかなあ。

し よ う
基本は、>>7のMJSimと同じ。
・AI同士のみの対戦。
・東風荘ルール。
・東風荘のログを出す。

・AIは、.netで作る。作るの楽だし、開発環境無料だし。
・勝敗は、東風戦200回以上の合計得点で決める。
・「勝敗」にほとんど関係のない(めったに現れない)ルールは無しにする(役満、チャンカンなど)。

MJSimは、AIに「普通の麻雀」をさせようとして作るのが難しくなっている気がする。
麻雀のルールを、AIが作りやすい形に変えてしまえばいいのではないか。

まあ、できるかどうかわからん。
1ヶ月たって音沙汰が無ければ頓挫したと思ってくれ。
0096名前は開発中のものです。
垢版 |
2006/11/11(土) 10:51:40ID:bfMsKF2A
東風荘の代打プログラムを作って、100試合ほど打たせてみた。
安定Rが1100しかなかった(´・ω・`)

実装した機能は以下の通り。
・普段は単純に聴牌一直線。具体的には、シャンテン数を落とさずに
 受け入れが広くなるように切る。ドラおよびドラ付近は評価を高めに。
・鳴きは役牌のみ。
・残り山枚数が20枚以下になると、形式聴牌を取りにいく。
・相手から先制リーチが入ると、現物→字牌→筋の順でベタオリ。
009896
垢版 |
2006/11/11(土) 14:19:21ID:bfMsKF2A
>>97
そうかなあ。
ベタオリ機能を実装してから、成績がだいぶ安定したから
必須機能だと思ってたけど・・・
0099名前は開発中のものです。
垢版 |
2006/11/11(土) 20:49:33ID:GfQHFT1U
ベタオリする条件を先制リーチと別に、もういくつか設定してみたらどう?

たとえば残り山数が少なく、シャンテン数が高いとか
切れる牌が危険牌だらけとか上がれそうもなかったら、ベタオリ。

まだ、山数が十分あるとか、シャンテン数が低いとか、切れる牌の危険度が
低かったら続行するとか。
010096
垢版 |
2006/11/13(月) 09:22:52ID:duDFKbMP
>>96からさらに100試合ほど打たせてみた。
すると、その100試合の安定Rが1650で、
>>96の100試合と合わせた計200試合の安定Rが1450に。

まだまだ試合数が少ないから断言はできないけど、
今までは運が悪すぎたのかなあ。

とりあえずは旧上ランの入り口である、R1600を目指して
がんばります(`・ω・´)
■ このスレッドは過去ログ倉庫に格納されています

ニューススポーツなんでも実況