麻雀のロジックについて研究しませんか?
麻雀ゲームなんかで強いCPUキャラクターとやると
どうしてもプログラムの方で積み込んでいるとしか思えません。
人間の思考に近づくロジックを話し合いませんか?
成人記念2ゲット
>>1 アナタの考えたロジックを叩き台にして進めたらどうだろう。
ということで、ネタ振ってちょ。
よーし、俺がネタヲ振ってやるぜ
ファジイ推論でルールヲつくって
すべての牌について、それを切ったときの評価をだして
評価の高かった牌を切る
どうよ
今のところ私が考えているのは、
キャラ毎に、ピンフ好き、タンヤオ好きとかにわけるしかないかなぁ
と、考えていますが、それだと上がれないですよね。
つまり強いCPUにはなり得なくなってしまいます。
ただ、前もって積み込みとかにしちゃうと、聴牌状態で
何巡目にリーチを書けて自摸る、とかいう設定になってしまいますし。。。
味気ないキャラクターになってしまいますよね。
ん~難しいw
6 :
デフォルトの名無しさん:05/01/10 18:14:53
まずは、上がりまでの起こりうる未来を全て列挙して、
その中から一番良いパスを選ぶことを考える。
多分、現在の計算機の能力ではできないので、
1)起きえないであろう選択肢をカットする
・ドラが2枚そろっていたら捨てない。
・終盤で、捨牌に出ていない牌は捨てない
など
2)最後まで読み切れないので、途中の状態で
得点を予測して、そのパスの得点とする。
を考える。
>>4 は 2) の一つの方法
1)でキャラクターの個性を出せるけど、最初は
最強プレーヤーを目指して作成して、機能制限
や評価項目の重み付けの調整で個性を作って
いった方が作りやすい
>>7 その前の年にもあった。
1年に1度は麻雀ネタのスレが立つんだよ。
>>6 >まずは、上がりまでの起こりうる未来を全て列挙して、
>その中から一番良いパスを選ぶことを考える。
「良さ」を計る関数の定義が出来ればほぼ終わったようなものな希ガス
関数を考えるに当たって
- 自分の上がりへの近づきとその点数の期待値
- 他家の手を進める、または振り込む期待値
くらいなのかな。
「上がりへの近づき」や「手を進める」というのをどう数値化するかが難しそう。
>まずは、上がりまでの起こりうる未来を全て列挙して、
>その中から一番良いパスを選ぶことを考える。
手牌からその可能性を計算して、
ツモるたびにその可能性を狭めて行くやりかたですかね?
ある程度の前例をデータとして保持し、その型にあったやり方で
進行して行く訳ですか。
人間にも経験というものがありますし、これはいいですね。
記憶として対戦相手の思考もコピーしていくような、
ロジックもいれると面白そうですね。
役が成立するパターンの配牌を記憶し、
自分の配牌をそれにあてはめて、前例だとこの役が成立する予定だから
それを必死に集めるとか。
振り込むリスクも考えないといかんなあ…
例えば相手の捨て牌から予想するような。
>>1 ロジックを実装できるような
プログラムを用意するべきだと思います
もうある
>>12 プログラム自体はあります。
役判定はライブラリとか使ってますが・・・
ただ、決まった打ち方しか出来ないんですよね。
ピンフを中心に構成していくとか、
アンコばかり集めるとか・・・
さらにCPUを強化するには積み込むしかないし・・・
その辺を今後、研究していければいいと思っています。
将棋とか、囲碁と違って運もかなりゲーム要素に影響するので
なかなか難しいところではあります。
牌に積み込む計算は
安全牌を計算しないといけないですね。
実装すると、モッサリしそうですが、
搭載したいきのうです。
このスレの住人が、ロジックを適当な言語で実装したモノを持ち寄って
対戦させられるような仕組みがあったら面白そう。
>12の言ってるのもそういうことじゃないのかな。
面白いかもしれないけど、みんな暇じゃないですよね。
私も、現在、納期前でいそがすぃし
>>17 >私も、現在、納期前でいそがすぃし
後先考えずにスレを立てる暇だけはあったのか・・・
19 :
デフォルトの名無しさん:05/01/25 23:54:34
ごめんよ。仕事の合間にふと思ってさ。
軽はずみにスレ立てちゃいかんねv(>_<)v
麻雀だと将棋スレみたく、最強を目指すと言うわけにはいかないのかな。
確率的に最善の手探しても、結局は運だろうから。
将棋におけるCSAプロトコルみたいな、ある程度標準となるネットワーク対戦プ
ロトコルみたいのって麻雀ではないの?
23 :
デフォルトの名無しさん:05/02/14 19:16:40
ループ終わらずにネストし続けてしまってるんだよね。
ぱっと見ありそうなのは先頭の
>for(;!tehai[i];i++)if(i>=43){return;} //上がっている場合ここが実行される
で i=0とかしてたり?
i=0しても下スルーされるから関係無いか。
すまん、やっぱりあるね。
自分の脳内トレーサじゃ
>>24しか思い浮かばないや・・・
>>24 あまり変数はいじってないんですけどね。
return の前に悪いやりかただろうけど大域変数のflagを使ってるだけで・・・
この人麻雀研究で有名だし、やっぱり漏れが悪いんだろうなあ。
その関数は悪くないと思うよ。
どんな使いかたしてるの?
見てあげるからソース貼ってみそ。
そのままコンパイルして実行してみたけど、問題無かったよ。
この状態でスタックオーバーフローになるの?
スタックオーバーフローは、恐らくなんですが・・・
VC++6のデバックモードだと、きちんと表示されるんですが
リリースモードと、BCCでは、最後のprintfが表示されないんです。
何が原因なのかなあ。
>>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
で、うまくいくかも。
>>32 おお、最後きちんと表示されるようになりました。
まだおかしなところがあるかもしれませんが、とりあえず前進しました。
ありがとうございますm(__)m
34 :
デフォルトの名無しさん:05/02/15 21:36:58
35 :
デフォルトの名無しさん:05/02/15 22:17:17
そんなに数無いんだし自分で作れば?
漢字フォント作るより楽だと思うよ。
36 :
デフォルトの名無しさん:05/02/17 09:56:47
37 :
デフォルトの名無しさん:05/02/17 12:09:45
上がり得点/期待値が最も高い手になるようプログラムすればいいじゃん。
統計的には確実に強い打ち方になるぞ
38 :
デフォルトの名無しさん:05/02/17 18:09:47
1ソーがポイントだなw
>>16 対戦させられるような仕組みは、
>>7の「MJSim」、
>>19の「まうじゃん」というところか・・・
で、作っている人いるの?
あがり判定とか役判定ってどうやんの?
それだけで結構難しくない?
少し上にあるだろ
麻雀のルールって、増築に増築を重ねた「九龍城」みたいなものだからな・・・
実際にさまざまなルールを統合してプログラムを作成しようとすると、
あちらこちらに矛盾点が出てくるんだよね。
実際にゲームをしている時には殆ど発生しない
レアなケースでのみ起こる矛盾点もプログラムにする以上、
ちゃんと解決しなくちゃいけないし。
例えば、「完全先付け」とかさ・・・
あれ考えた奴、脳みそのネジが5,6本、抜け落ちているんじゃないのか?
46 :
デフォルトの名無しさん:05/03/01 14:16:30
麻雀に関してのプログラムの書いてある本
何でもいいので教えてください
47 :
デフォルトの名無しさん:05/03/06 21:02:00
age
んとね、テクノポリスに書いてあった。
探すのめんどいから何号かは知らん。
>>1 そもそも上がり、いやテンパイにまで持って行けるの?
と言ってみるテスト
>>44 >例えば、「完全先付け」とかさ・・・
>あれ考えた奴、脳みそのネジが5,6本、抜け落ちているんじゃないのか?
タコ麻雀対策だろ。
麻雀格闘倶楽部やってるとたまに後付で勝つウザイ香具師が多い
>>51 いや、俺が思うに、多分あのルールは
筋者の方々が素人さん相手に勝負をする時に
散々難癖を付けて、カネを搾り取るためのものだと思う。
その理由は・・・
1.ルールの出自が関西であり、今も関西でしか行われていない
2.「完全先付け」には様々なパターンと、それに対する様々な解釈があり、
それら全てをゲームの前に確認しておくのは不可能
3.その後のゲーム中で、事前に確認が取れなかったケースが
発生した場合、間違いなく腕力の強い奴の主張がまかりとおる
まぁ、そんな深読みをしなくても、実際にプログラミングをしてみれば
すぐ分かる。
「完全先付け」がどれほどトチ狂ったルールであるかが・・・
「完全先付け」というルールの存在自体を無視することをお奨めする
麻雀AIのロジック。
ツモ麻雀できるロジックを示しす漏れが来ましたよ。
A.総当り式
1、牌を積もる。
・上がっているーー>「ツモ!」
・上がってないーー>2、へ
2.捨てられるパイを仮捨てしてみる(捨てられる牌数分のパターンあり)
・積もる牌がまだ有るかーー>3、へ
・もう可能性ツモがないときは、
_・上がりリストから最良のデータを使い捨て牌を決定し捨てる-->1,へ
_・上がりリストがない時は、牌評価数値表からいらないのを捨てる。
3、つもり可能性のある牌をつもってみる。(積もれる可能性分のパターンあり)
・上がりかーー>4、へ
・上がらないーー>2、へ
4.上がり評価
待牌の確立と点数の期待値を計算する。上がりリストに登録。
・次の可能性ツモ牌が有る時はーー>3、へ
興味があったらageみて。
ほい、
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つの関数は自分で考えろ。
聞くだけなら、もう何も出ない。
>>56 お~い、それじゃフリテンと複数の可能性を考えられないぞ~
60 :
デフォルトの名無しさん:2005/08/23(火) 06:35:38
みんなで麻雀の思考ルーチンを作って、東風荘とかで対決してみたいなあ。
東風荘の画面から牌の情報を読み取ったりするライブラリは
>>23のHPで公開されているから、
純粋な思考ルーチンの部分を作るだけでいいし。
age
>>57 麻雀のソースずっと探してたんだ、ありがとう
62 :
デフォルトの名無しさん:2005/08/23(火) 10:02:16
「振らない」というのはロジックにどう組み込みますか?
というか、捨て牌から手役の高さと待ちを読むロジックは
あまり研究されてない分野と思う
板違いすぎ
64 :
デフォルトの名無しさん:2005/08/23(火) 10:15:36 BE:79877344-#
マージャンはルールが不明な部分が多いんだよな。
カンが四つで流れるってルールとスーカンツは両立しないけど、どうなってるんだとか。
・一人でカンを四つの場合は流れない
・カンを四つした時点でスーカンツができてなかったら流れる
・その他
とか、いろいろ考えられるけど、本屋に売ってるマージャンの本なんかには
載ってないし。
(なんとか協会とかのルールには決められてるんだろうけど)
65 :
デフォルトの名無しさん:2005/08/23(火) 10:30:26
>>64 仕様(ルール)の振れ幅は決まってるんだから、たいした問題ではないだろう
>>62 真面目に組むんだったら、捨牌戦略は割と簡単に組める
・裏筋チェック
・壁チェック
・自分の手牌と場に出た牌の数え上げ
・染め手系のチェック
・序盤の中張牌(変則待ち)チェック
・・・といろいろあるが、はっきり言って、上の3つ程度を行えば十分だし、
それ以上やったら、かえって弱くなる傾向がある。
(変則待ちや染め手を警戒するあまり、棒テンにぶち当たる)
本当はプレイヤーの待ち牌をチェックして出さないことだが、それはあくまでも反則ということで。
あと、日本プロ麻雀連盟の公式ルール(抜粋)
ttp://www.ma-jan.or.jp/rule.htm あと、スーカンツは1人で4つのカンをした場合に成立し、その場合5つめのカンの発声および牌の提示とともに流局となる。
それ以外の場合は、全て4つめのカンが成立した時点で流れとなる。
カンの成立は、カンをした人が、リンシャン牌をツモり、手牌の中から不要な牌を打牌した瞬間。
(カンドラありのルールの場合、チャンカン時にはカンを行った人の打牌が行われていないため、新ドラが成立しない)
>>66 手役の高さを推測し、期待値計算して自分の手の期待値と比較して
相手のノミ手より自分のとびまんを優先して 危険牌でも打つ みたいな
そういうロジックを組みたいよな
あと、当然ネットワーク対戦等の 神(サーバ)があり 打ち手(クライアント)
があるという構成での最強を目指したいよな
69 :
66:2005/08/23(火) 16:03:00
>>68 実は色々やっているんだが、実は「リーチ一発・裏ドラあり」というルールや、
「カンドラ・カンウラあり」とか「赤五ピン・赤五ソーあり」とか
「ウラドラチップ制」などの、祝儀たくさんのインフレ麻雀になればなるほど・・・
(1)自分から見える情報だけで、もっとも待ち牌がたくさんある面子選択を面前で行う。
(2)字牌を除き9-10枚以上同種牌が無いとチンイツに行かない。(ホンイツは想定外)
(3)聴牌はもっとも残り枚数が多い形(たいていはリャンメン待ちかその変形)
を選択し、リーチを必ずかける(裏ドラが乗るため)
(4)相手のリーチはこちらが2シャンテンより遅い場合は全て無視
・・・という棒テン・即リー・タコツッパリ君AIが強かったりする。
逆に一発ウラドラなしルールだと、AIのウエイト変数を工夫した、
敵側の捨てパイ読み部分のプログラムの作成が楽しくなるのだが。
また同じAIを使っても、棒テン即リー君ばかりのAIx4人の相互対戦の場合とか、
染め屋さんAIが一人入るとか、なんちゃって鳴きの竜AIが入ってくるか、
・・・またそのAIがどこに座るかによって、対戦結果が有意(5%以上)違ってくるので、面白い。
まだまだ研究途上だけどね。
70 :
60:2005/08/23(火) 20:35:25
>>61 Javaでいいなら、ここでダウンロードできるよ。
tp://www5e.biglobe.ne.jp/~tatano/index.html
71 :
61:2005/08/25(木) 08:38:59
>>70 おお、ありがとう。思考以前に麻雀動かすだけで四苦八苦ですわ
>>68 点差の問題や残り牌の問題もあるので相当難しくなりそう。
>>69 麻雀格闘倶楽部ではライフ制の香具師がライフ切れ落ちすると次局からCPUになるが
そのCPUの下家は圧倒的に有利w
73 :
東風荘じゃ1600程度:2005/09/01(木) 11:33:02
おまいら教えてください
最強の麻雀ロジックを作るため研究を始めました。
まずポンチーカンロンなし、役もなしですべてのプレイヤーがひたすら上がりに向かうという
シミュレーションを行っているのですが、この状況で誰かが上がる確率が50%にしかなりません。
麻雀そのものにそれほど詳しくないのでこれが妥当なのかよくわからんです
次に今のアルゴリズムを書きます
74 :
東風荘じゃ1600程度:2005/09/01(木) 11:36:55
>>73 一枚引いて14枚になったら・・・
IF 聴牌
return どの牌を捨てたら一番待ちが多くなるか()
FOREACH hai IN 手牌
仮想手牌 = 手牌からhaiを取り除く
評価(仮想手牌)
return 一番評価の高かったhai
75 :
東風荘じゃ1600程度:2005/09/01(木) 11:42:30
>>74 評価関数は・・・
評価(牌の配列)
int SCORE
WHILE 順子 がある
配列から取り除いて、SCOREに順子値をプラス
WHILE 刻子 がある
配列から取り除いて、SCOREに刻子値をプラス
WHILE 両面 がある
配列から取り除いて、SCOREに両面値をプラス
・・・
という感じで重要な構成要素から点をつけています。
この両面値などを適当に調整しているのですが、この方法ではパラメータがプログラマの
マージャンの知識に依存してしまうし、仮定のような簡単な状況(役なしなど)でなくなった
場合に応用が利きません。
なにかよい方法はないでしょうか?
>>73 >ポンチーカンロンなし、役もなしですべてのプレイヤーがひたすら上がりに向かう
という状況なら
>誰かが上がる確率が50%
そんなもんだろ
>>75 >この方法ではパラメータがプログラマのマージャンの知識に依存してしまうし、
>仮定のような簡単な状況(役なしなど)でなくなった場合に応用が利きません。
詰め将棋のように今の手配から上がるまでを総当りで調べる
77 :
東風荘じゃ1600程度:2005/09/01(木) 13:03:24
>>76 >詰め将棋のように今の手配から上がるまでを総当りで調べる
これをやってしまうと10000回とかのシミュレーションが行えず(時間がかかりすぎるため)
悩んでいます。
しかし50%が妥当なのであれば、そろそろ次のステップに行こうかと思います
・ロンできるようにする
・捨て牌を見る
・役判定をいれる
くらいからはじめようかなと思っています
78 :
76:2005/09/01(木) 16:28:14
枝狩り。理想は総当りだが、実際には時間に合わせて読むようにする
それか、数牌だけとか抽象化したモデルで先にデータベース化(定跡)するとか
さらに、こちらの番やアニメーション+音声の再生時に読むとか
これが難しいなら、積み込みや手牌透視ができるインチキ対戦CPUを作る
>>78 それだととんぷうそうで勝てないんだよね・・・
80 :
デフォルトの名無しさん:2005/09/05(月) 20:11:02
>>白木
それは違うぞ
白木って誰
ブッコぬk(ry
コンピュータ対戦も可能なネット麻雀を作ったら面白いな。
対戦相手はランダムな選出だけど、運良く二人以上が選ばれたら
通しもしていいというルールで。
まあ同一IPからの接続は二人まで、と縛っとけば
CATV以外の人はそう困らんでしょう。
山に対する仕掛けが出来なければそれなりにフェアだし。
>>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枚以上積み込む)などの露骨な細工は、(露骨過ぎるので)あまりしないでほしいといわれた。
(ただ一色手方向の補正が大きくなると、大車輪・九連宝灯・緑一色などの出現頻度が高くなる...四暗刻も増える)
86 :
デフォルトの名無しさん:2005/09/09(金) 00:49:19
おまえら、PS2の麻雀やろうぜ!2でも参考にしろ
87 :
デフォルトの名無しさん:2005/09/09(金) 20:22:09
白木、出て来い
89 :
デフォルトの名無しさん:
age