麻雀のロジックについて研究しませんか?
麻雀ゲームなんかで強い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 :
デフォルトの名無しさん:2005/10/31(月) 00:35:54
age
90 :
名前は開発中のものです。:2005/11/25(金) 19:01:36 ID:/aObainy
(´・ω・`)
92 :
名前は開発中のものです。:2006/06/16(金) 15:06:48 ID:gys/BJwI
age
93 :
名前は開発中のものです。:2006/06/22(木) 04:21:40 ID:2BUVy0Re
age
AI同士を対戦させるプログラムを作ってみようかなあ。
し よ う
基本は、
>>7のMJSimと同じ。
・AI同士のみの対戦。
・東風荘ルール。
・東風荘のログを出す。
・AIは、.netで作る。作るの楽だし、開発環境無料だし。
・勝敗は、東風戦200回以上の合計得点で決める。
・「勝敗」にほとんど関係のない(めったに現れない)ルールは無しにする(役満、チャンカンなど)。
MJSimは、AIに「普通の麻雀」をさせようとして作るのが難しくなっている気がする。
麻雀のルールを、AIが作りやすい形に変えてしまえばいいのではないか。
まあ、できるかどうかわからん。
1ヶ月たって音沙汰が無ければ頓挫したと思ってくれ。
1月経った訳だが
96 :
名前は開発中のものです。:2006/11/11(土) 10:51:40 ID:bfMsKF2A
東風荘の代打プログラムを作って、100試合ほど打たせてみた。
安定Rが1100しかなかった(´・ω・`)
実装した機能は以下の通り。
・普段は単純に聴牌一直線。具体的には、シャンテン数を落とさずに
受け入れが広くなるように切る。ドラおよびドラ付近は評価を高めに。
・鳴きは役牌のみ。
・残り山枚数が20枚以下になると、形式聴牌を取りにいく。
・相手から先制リーチが入ると、現物→字牌→筋の順でベタオリ。
ベタオリ機能外した方がよくねえか?
98 :
96:2006/11/11(土) 14:19:21 ID:bfMsKF2A
>>97 そうかなあ。
ベタオリ機能を実装してから、成績がだいぶ安定したから
必須機能だと思ってたけど・・・
ベタオリする条件を先制リーチと別に、もういくつか設定してみたらどう?
たとえば残り山数が少なく、シャンテン数が高いとか
切れる牌が危険牌だらけとか上がれそうもなかったら、ベタオリ。
まだ、山数が十分あるとか、シャンテン数が低いとか、切れる牌の危険度が
低かったら続行するとか。
100 :
96:2006/11/13(月) 09:22:52 ID:duDFKbMP
>>96からさらに100試合ほど打たせてみた。
すると、その100試合の安定Rが1650で、
>>96の100試合と合わせた計200試合の安定Rが1450に。
まだまだ試合数が少ないから断言はできないけど、
今までは運が悪すぎたのかなあ。
とりあえずは旧上ランの入り口である、R1600を目指して
がんばります(`・ω・´)
勝ちが安定しないって、ようは運任せで、アルゴリズム関係なしなんでは?
シャンテン数が高いときはベタオリにして、
それ以外のときは
ゆるくオリるような打ち方がいいんではないかと。
つまり、現物、字牌、筋、
リーチ者が序盤に切った牌の周りなどを
安全そうな牌としといて、
安全そうな牌かつシャンテン数を落とさない牌を打つようにする。
さらに精密にやるなら安全度を点数化するといいかも。
やっぱりベタオリは改善の余地があると思う。
勝ってるときはベタオリ、負けてるときは、続行とか。
あとは鳴きが役牌のみってところかな?
チンイツとかホンイツとかトイトイとか、いくつかの役に対して、シャンテン数計算して、
いくつ以下ならその手を目指してチーポンを積極的に行うとかはどうだろうか。
104 :
96:2006/11/19(日) 22:34:00 ID:t1T5Qf2N
みなさんレスありがとうございます。
平日は忙しい上に、PCがつかえない環境にいるため、
返事ができなくてすみません。
ところで、他にも東風で代打プログラムを
動かしてみたいという方はいらっしゃいませんか?
もし、代打プログラムを作ってみたいが、とつげき東北さんが配布されている
MJexeIO.dllを使ってもスキルが足らずに作成できない・めんどくさいという方が
おられましたら、僕が作成したプログラムでよければ公開させていただきます。
今のところ搭載している機能・特徴は以下のとおりです。
1.とつげき東北さんが配布されているMJexeIO.dllに皮をかぶせて使いやすくしています。
具体的には、
○画面から情報を取得する関数を自作の関数の中で適切によびだしているため、
プログラマ自身が画面から情報を取得する関数を呼び出すタイミングに頭を悩ませる必要はありません。
画面から取得された情報は、自作の構造体(手牌構造体やプレイヤー構造体など)に格納されます。
○自分の順番が回って来た時にどの牌を切るかを返す関数、チーやポンをするかどうか尋ねられた時に
鳴くかどうかを決定する関数のみを実装すれば、自分の思い通りに動く代打プログラムが作れます。
2.一度起動すれば、プログラムを終了するか、東風が回線落ちするまで、延々と打ち続ける機能を搭載しています。
3.自分の手牌のシャンテンを計算する機能、場に見えている牌の枚数を数える機能、有効牌を計算する機能
(ここでいう有効牌とは、自分の手牌のシャンテン数を下げる牌を意味します)、4人の捨て牌を時間順に並べる機能
(この機能により、MJexeIO.dllのSimulateOrder関数に付きまとっていた、切られた牌の順序決定不可能性の問題
を回避できます)など、代打プログラムを作成する上で、必要と思われる機能を搭載しています。
(時間があれば、自分の手牌の役を認識する機能を搭載する予定です。)
4.僕自身はプログラミングを趣味としているただの学生ですので、スキル的な問題により、ソースコードは汚いですし、
上記機能の処理速度も速くはありません。デバッグは十分に繰り返したつもりですが、バグがないことを保障できません。
>>104 興味あり。公開してほしいな。
まあ、俺は代打プログラムを作れるような頭は持ち合わせていないが。
うちは、代打ちじゃなくて全部オリジナルで作ってるんで、
プログラム自体は必要ないけど、アルゴリズムとか、
どんなことをやってるかソース中にコメントとかあれば見てみたい。
作ってるのはエロゲなんで、強い思考ルーチンはいらないんだけど。
しかし、こんなにいるんや。
こんなこと考える人!
やっぱ、パラメタ、重みつけ。
あと、ひたすら統計になるんかなー?
統計取るなら聴牌思考の指向性についても考えたほうがいいんじゃないかな
具体的には棒聴即リールーチンと期待値計算して遠回りしても高い手を和了るルーチンのどちらが強いか
ってのを東風かなにかで実戦に投入しながら統計をとるってことで
でも、麻雀の統計として具体的に何局ほどサンプルをとればいいんだろうか…
20万局ぐらい?
109 :
96:2006/12/28(木) 20:24:12 ID:IWNuZXZH
>>100からさらに改良を加えて、200試合ほど打たせてみたところ、
安定Rが1600付近まで上昇しました。
特に、好調だった80試合を見ると、安定Rが1900強に。
改良点は以下のとおり。
<聴牌に向かっているとき>
今まで:面子手のみ。
↓
改良版:チートイツも組み込んだ。
<ベタオリ時>
今まで:2人が同時に攻めてきた場合、自分から反時計に見て
近い方しか警戒していなかった。
↓
改良版:他家それぞれに警戒係数という指標を導入し、
複数他家の攻撃にも正確にベタオリできるようにした。
<状況判断>
今まで:他家からリーチがかかったときのみベタオリ
↓
改良版:他家のリーチだけでなく、食い仕掛けにも対応。
また、自分の手がよければ、先制されても攻めるようにした。
<牌効率>
今まで:シャンテン数を下げない牌を一枚切る。
その際に、内側の牌・ドラ・ドラソバに高評価を与えていた。
改良版:一打一打ごとにモンテカルロシミュレーションを行い、もっとも手牌のあがりへの
寄与が低い牌を切るようにした。
110 :
名前は開発中のものです。:2006/12/29(金) 18:27:19 ID:sGXeTFgC
カルネージハート(或いは、FF12のカンビット)のように
みんながアルゴリズムを組みやすいアプリケーションがあればいいと思った。
麻雀がうまくてもプログラムなんて組めないって人多いだろうし。
麻雀は、カルネージと違って、サブサンプション的にどうこうするってものでないからな
アルゴリズムというよりむしろ統計処理か
まあ、パネルプログラミング的なインターフェイスはあったら面白いかも
>>109 研究用にソース欲しいんですけどオープンソースですか?
113 :
96:2006/12/29(金) 21:53:15 ID:DWfKfu8r
>>112 僕のしょぼいソースでよければ公開させて頂きますよ。
言語はCです。
ただ、あくまで東風代打ツールとして作ってるんで、
研究用には使えないかと思います。
>>104で書いたんですけど、反応が薄かったんで、放置してました(笑)
>>113 ありがとうございます。
リアルでも使える代打ちプログラムを作りたいと思ってるので助かります。
115 :
96:2006/12/29(金) 22:17:26 ID:DWfKfu8r
>>115 いろいろ改良を重ねているうちに、ソースが汚くなってきたので、
ちょっと整理に時間がかかるかと思います。
明日の夜には間に合うと思いますので、
申し訳ありませんが、それまでお待ちください。
そんなことより、ちょいと聞いてくれよ、
>>1よ。
昨日、あるホテルで高島易断の鑑定会やったんです。鑑定会。
そしたらなんか人がめちゃくちゃ少なくガラガラなんです。
で、よく見たらなんか貧乏臭い客がいて、「運勢鑑定3000円ですよね」、とかほざいてるんです。
もうね、アホかと。馬鹿かと。
お前らな、運勢鑑定如きで普段来てない高島易断に来てんじゃねーよ、ボケが。
御祈祷だよ、御祈祷。
なんか親子連れとかもいるし。一家4人で高島易断か。おめでてーな。
よーしパパ運勢鑑定頼んじゃうぞー、とか言ってるの。もう見てらんない。
お前らな、3000円やるから帰ってくれと。
高島易断ってのはな、もっと金持ちが来るべきなんだよ。
テーブルの向かいに座った奴に因縁話吹っかけてもおかしくない、
乗せるか逃げられるか、そんな雰囲気がいいんじゃねーか。女子供は、すっこんでろ。
で、やっと別の客が来たと思ったら、そのうちの一人がまた、3000円ですよね、とか言ってるんです。
そこでまたぶち切れですよ。
あのな、3000円の鑑定なんてきょうび流行んねーんだよ。ボケが。
得意げな顔して何が、3000円の、だ。
お前は本当に3000円の鑑定を受けに来たのかと問いたい。問い詰めたい。小1時間問い詰めたい。
お前、3000円の鑑定って言いたいだけちゃうんかと。
高島易者の俺から言わせてもらえば今、高島易者の間での最新流行はやっぱり、
年間36万円の因縁切りの御祈祷、これだね。
2年分72万円。これが通の頼み方。
御祈祷ってのは金がまとまって入る。そん代わり手間が掛からない。これ。
で、それに1年分100万円の特別祈祷。これ最強。
しかしこれを勧めるとと次からカモ(客)に警戒されるという危険も伴う、諸刃の剣。
素人にはお薦め出来ない。
まあお前ら貧乏人は、近所の神社でオミクジでも引いてなさいってこった。
高島易断について■part3
http://hobby8.2ch.net/test/read.cgi/uranai/1155287091/l50
117 :
96:2006/12/31(日) 06:46:41 ID:57FmFyf5
ありがとうございます ノ
119 :
96:2006/12/31(日) 14:39:40 ID:57FmFyf5
乙
121 :
96:2007/01/07(日) 01:59:23 ID:GOuBSiwa
全然反応がないです・・・(´;ω;`)ブワッ
>>121 難しい分野だから仕方ないね。
俺も面白そうと思ってやろうとしたけど、すぐに(数学的な?)壁にあたってしまった。
面白そうではあるけど、敷居が高いねえ。
123 :
96:2007/01/07(日) 08:39:12 ID:GOuBSiwa
>>123 現時点の僕のプログラムは安定Rが1600程度ですが、
まだ高校数学以上の数学は一切用いてないです。
数学よりも、バックトラッキングや再帰関数といった
プログラミングの知識の方がはるかに重要じゃないかと思います。
もちろん、強いプログラムにしていく過程で数学の壁にあたることに
なるとは思いますが、ひとまず動かしてみて、思考ルーチン部分の
パラメータをいじるなどして感覚をつかめばソースコードの理解も
早まるんじゃないかと思います。
ちなみに、前からの課題であった役認識・点数計算プログラムを実装しました。
次はこのプログラムをいかに思考ルーチンに組み込むかが課題です。
このプログラムによって期待値の概念を思考ルーチンに導入することが
可能になるので、上手に組み込めば飛躍的に強くなるんじゃないかと期待してます。
>>123 高校数学すらおぼつかないので・・・
また、うぷしてもらったソースを理解して改造していくのは難しそうだし、悪いけどそれはあまり楽しそうでない。
まずは、もっと単純なところから、
例えば、1人麻雀でテンパイに向かうだけのプログラムとかからはじめようかと思う。
車輪の再発明って言われるかもしれないが、この場合はプログラミング自体が「遊び」なので。
みんながスーパーマリオの1面をプレイするように、みんなが通っていいかなと。
その後で、参考にさせてもらうとおもう。
今日初めてここ着たけど、とりあえずソース読ませてもらったよー
別の麻雀ソフトでも対応できるようにデータ取得部分と思考部分が分離されてると思ってたから、
あんまり分離されてなさそうなのが意外だったかも。
ぶっちゃけデータ取得部を流用させてもらおうと思ってたから残念
ちなみに、正直Cで変数いじりしかまともにできない俺にはいまいちわからんw
もうしばらくしたらAI作りはじめられると思うからその時はよろしくっ
126 :
96:2007/02/12(月) 15:20:17 ID:IDAaCxE5
やっと修論を書き終えることができました!
三徹の影響で頭がぼーっとしているため、日本語が変かもしれませんが、ご容赦くださいw
>>124 確かに趣味で行う以上は「楽しさ」が最優先ですもんね。
僕も作る作業自体が楽しいので、車輪の再発明だらけです。
実際、MJexeIO.exeで提供されている機能以外は全部一から実装しましたし。
>>117でソースを公開した後、シャンテン数計算のルーチンを改良したのですが、
その結果、今までの5倍くらい計算時間を短縮することができ、
あらのHPやcomjong.comで紹介されているアルゴリズムよりも高速化することができました。
こういう些細なことでも進歩が見られると楽しいものです。
>>125 こちらこそよろしくです!
データ取得部は関数単位で分けてあるので、ある程度分離されてはいると思うのですが・・・
少なくとも、データ取得部と思考部がごちゃまぜになっているということはないはずです。
まあ正直な話、僕自身も変数いじりくらいしかできないので、そこら辺のことはよく分からないんですけどね(笑)
もう少し具体的に意見を頂ければ、修正もできるかと思います。
>>126 あれ、今見てみたらちゃんと分離されてますね、何勘違いしたんだろw
とりあえず入試が終わるまで全然手つけられなさそうな今日この頃ですorz
明日入試なんだけど受かる気しないやorz
128 :
名前は開発中のものです。:2007/03/25(日) 17:39:09 ID:/+ddsj91
見にいったけどひどくレベルが低くないか?
テンパイチェックすら組めなそうな人ばっかりに見える
130 :
名前は開発中のものです。:2007/03/27(火) 18:23:15 ID:AcanRDec
131 :
名前は開発中のものです。:2007/06/17(日) 16:57:24 ID:rBhd2fbQ
>>117のソース、興味ある。
誰か上げてくれないか。
aaa
133 :
リンク:2007/09/30(日) 19:03:23 ID:IMLVX+zL
134 :
名前は開発中のものです。:2007/10/04(木) 21:01:57 ID:HFnYJuJ5
せのたんは仮性包茎だったけど太めで包皮の上からカリが分かるプックリ型で良チンだったよ
135 :
名前は開発中のものです。:2008/04/18(金) 23:45:53 ID:ZXDlZmWL
まだこのスレがあったwww
136 :
名前は開発中のものです。:2008/04/27(日) 15:51:10 ID:7kUIsgPs
137 :
名前は開発中のものです。:2008/07/27(日) 01:30:55 ID:FAVGJPP8
あげ
さげ
139 :
名前は開発中のものです。:2008/10/19(日) 00:59:04 ID:7mqKFfWk
140 :
名前は開発中のものです。:2009/02/25(水) 01:01:10 ID:B3OIG4R1
純粋に役判定だけしてくれるライブラリって無いですかね。
作った
>>139 面白そうなことしてますね、HP見たけどどこまで進んでるか不明だった。
麻雀AI持ってるから、その上で動くAI作ってもいいけど。
いつ頃そのようなことができる?
ただし、C++のみRubyは覚える気ないのよ~~、 Winにも入れる気がなかったりして・・・
144 :
名前は開発中のものです。:2009/08/18(火) 20:45:23 ID:O344lzLj
あげてみる
145 :
名前は開発中のものです。:2010/07/04(日) 10:22:21 ID:5u/6soF2
天鳳shirou_0のタメツモタメロン逆切れ粘着ストーカー最強
まだやってんのかこのスレ(w
真面目にロジック組もうとすると、
すぐ組合せ的爆発を起こすんだよな。
最近はリソースが豊富なだけに、
落ちるまでが長いからけっこう始末が悪い。
しかも定跡らしき手法がないんだコレが。
ジン・ラミーなんか麻雀よりだいぶ簡略化されてるが、
SE研修で「ジン・ラミーの上がり判定」を課題にしたら、
けっこう高給取りのはずの中級SEが二人掛りで二日かかっても
論理設計すらできずにギブアップした(w
プロダクション・システムを適当にでっち上げて
学習で鍛えるのがまだしも現実的だが、
所ジョージが言うように
『麻雀の必勝法は 素早いチョンボである
人が見てないうちに 勝手に自模っちゃう』
が結局いちばん効果的だと思う。
サマをするAIとか、AIの意味ねえから…w
>>147 いいこと言った(w
だけど、AIって基本「相手が誰か分からない」っつー
前提があるじゃん?
相手の癖とか考慮できないわけだし、
コンビ打ちとかされたら、
不完全記憶ゲームだから解がない可能性だってあるわけだ。
AIで特定の条件で有効なシステムが組めたとして、
それって本当に意味あんのか?っつー話になんねぇ?
>>148 そういう人間っぽい戦略をするAIはある意味夢だよねw
でも、無作為な相手を対象としたAIでも価値はあると思う。
もし無作為な相手を対象として、平均的に強いAIが組めたら、
それより強いAIを組むために使えるじゃないかw
150 :
名前は開発中のものです。:2010/07/05(月) 20:46:50 ID:KmfV60ed
>>149 > そういう人間っぽい戦略をするAIはある意味夢だよねw
待て待て。まず、
・プレイヤーの個人認証をする(過去の対戦記録から
対策を練ってくる)。
・戦略に名前とキャラを与える(プレイヤー側のハンデに
ならないように、条件を同じにする)。
つーところから始めたらどうだろう。
一人のAIをこのスレの住人でフルボッコにするシステムを作って、
住人の打ち筋から学習するわけですな。
でも、まず戦略上の有意で重要なパラメータが何かが分からないと思うんだ。
ベタ降り 早上がり 大物狙い
ぐらい大雑把なのは思いつくけどさ。
ジン・ラミーは
・半端なカードがあっても合計十点以下なら上がれる
・逆ノックというルールがある
とかでゲーム性を高めているんだが、
麻雀では
・手が揃わないと上がれない
・とにかく他の奴より早く、あるいは同時に上がらないと点にならない
の二点をめぐる攻防がキモになってくる。
そこから、
・基本は早上がり
・早すぎても安かったらおいしくないので、
どこまで待ってどこまで点数を上げるかが重要
・誰かが牌を抱えてたり底に沈んでたりするとダメだから
待ちを拡げるかどうかも配慮する必要があるし、
相手の手を読むことも考えたほうがいい(ヒッカケも
この一種)。
・役に対する好みは確率にも相性にもかかわってくるので、
どう利いてくるか今のところ不明
あたりを念頭に大雑把に組んでみりゃ
プロトとしてはよさそうに思う。
153 :
名前は開発中のものです。:2010/08/11(水) 16:30:46 ID:NAUDnXxM
上げる
154 :
名前は開発中のものです。:2010/09/15(水) 23:47:50 ID:aG+O5gjD
155 :
名前は開発中のものです。:2010/10/17(日) 01:57:31 ID:2TPZ9K5W
156 :
名前は開発中のものです。:2011/01/22(土) 01:12:24 ID:oi0iQAjA
ここまで反応なしw
158 :
名前は開発中のものです。:2011/06/12(日) 08:11:26.10 ID:PMFpryTR
>>146 >SE研修で「ジン・ラミーの上がり判定」を課題にしたら、
>けっこう高給取りのはずの中級SEが二人掛りで二日かかっても
>論理設計すらできずにギブアップした(w
それSEの能力が足りないだけじゃん
159 :
名前は開発中のものです。:2011/06/13(月) 02:53:05.59 ID:IP0E3i88
できるだけ、自然に見えるようにイカサマする。
レベルによって1~5個ほど島からツモり、必要な牌を1つとり、もどす。
最も必要な牌がわかるならイカサマ無しでも強いと思う
たしかにw
最も必要な牌が分からなくても、必要な牌は分かるよね。
シャンテン数が上がるか否かの判定だけでも十分。
点数の期待値とか一切考えず、シャンテン数が上がればその中からランダムで決めるって操作だけでも、
>>159のイカサマをされれば十分きつい。
上がってしまえば、相手がどんなに高めを狙おうと関係ないし。
そのイカサマが何の役に立つの?
んなもの知らんよ。
最も必要な牌が分かるならイカサマ無しでも強いって言ってたから、
イカサマするのに最も必要な牌が分かる必要はないと反論しただけ。
シャンテン数判断を組み込めるってのが十分高いハードルだからなー
イカサマいらなくなるでしょ
>シャンテン数判断を組み込めるってのが十分高いハードルだからなー
お前にとってシャンテン数の判定が高いハードルなら、麻雀ロジックを考える上で何なら出来るんだよ…。
自分で作れなかったとしても、シャンテン数判定プログラムなんてググればソース付きで見つかるだろ。
上がり判定アルゴリズムが正しく作れるなら
普通シャンテン数判定も出来るわなぁ
それは別だと思うが
あ
170 :
名前は開発中のものです。:2013/01/20(日) 15:45:30.96 ID:x/ZxDQc7
い
171 :
名前は開発中のものです。:2013/09/16(月) 10:12:11.07 ID:VxCxAcyw
age
0.優劣判定の準備
param[][14]を用意
1.今のシャンテン数、アガリチェック
tehai[14]に対して、シャンテン数計算。
-1ならアガリ役チェックに移る。
2.打牌毎のシャンテン数チェック
ある牌を切ったtehai[13](14通り)それぞれに対して、シャンテン数計算。
基本的には1のシャンテン数から変化しない打牌が正着。
1のシャンテン数との差をparamに保存。
マイナスならシャンテン戻しになる打牌。
3.受け入れ、有効牌チェック
さらに、34通りの牌をツモった時を想定したtehai[14]それぞれに対して、シャンテン数を計算。
シャンテン数が減る牌種がいわゆる有効牌。
有効牌の種類数をparamに保存。
また、実際の数を数え上げ、paramに保存。
また、シャンテン数が-1の時(受け入れ=待ちの時)、
そのアガリ翻数(MAX)を計算し、paramに保存。
さらに、アガリ翻数*枚数を足し合わせ、paramに保存。
4.安全度
完全安全牌>ノーチャンスアンコ牌>…
それぞれ該当するなら1,該当しないなら0を入れて、paramに次々に保存。
5.総合判断
できたparam行列に対して、係数により重み付けを行う。
シャンテン数は最重要なので20倍、など。順目やリーチ者の数が増えていくと安全度の重みが増し、
危険な場面ではシャンテン数の重要度を超えるようにする。
174 :
173:2014/10/04(土) 14:13:38.26 ID:csngvuvA
ポイントは、オリの局面で安全度で同点首位の2択になったような場合、
自然と手牌をぐちゃぐちゃにしない打牌が選ばれるところ。
例
2件リーチ
456mの5mと6mが完全安牌で100ポイント
受け入れポイント的に微差で6mが高得点
パラメータの調整にあたって、今後、機械学習を導入する方針。
少しずつパラメータを変えたAI同士を戦わせて、成績が良いほうを残していく方法を考案中。
何かご意見あればお願いします。
捨て牌選択時の役判定はかなり重要
特に鳴いた後
混一色一択で鳴いたのに形テン狙いのまま字牌を切りまくるクソAIとかw
あるいは手が確定できる鳴きしかやらないというのもゲーム的にはアリだけど
終盤になると有効牌の残り枚数も無視できない
もひとつ、振りテンチェックも地味に効く…見逃ししないならそれほどでもないか