- 締切済み
プログラミングによるオセロゲームの作成について
今オセロゲームをCで作成中なので、先ほども質問したのですが、 http://hp.vector.co.jp/authors/VA015468/platina/algo/2_2.html のサイトのminiMax法の実装法ですと最終的な戻り値は評価値ですよね? 一番いい評価値の場所にコマを置くためには結局そのx.y座標が必要だと思うのですが、どこからそのx.y座標を最終的に得るのでしょうか? ご教授願います
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- LEVELUP100
- ベストアンサー率40% (183/453)
突如として割り込んでしまいすみません。 疑問点があるのであれば書籍を参考にするのはいかがでしょう? >リバーシのアルゴリズム C++&Java対応―「探索アルゴリズム」「評価関数」の設計と実装 (I・O BOOKS) [単行本] >http://www.amazon.co.jp/%E3%83%AA%E3%83%90%E3%83%BC%E3%82%B7%E3%81%AE%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0-C-Java%E5%AF%BE%E5%BF%9C%E2%80%95%E3%80%8C%E6%8E%A2%E7%B4%A2%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E3%80%8D%E3%80%8C%E8%A9%95%E4%BE%A1%E9%96%A2%E6%95%B0%E3%80%8D%E3%81%AE%E8%A8%AD%E8%A8%88%E3%81%A8%E5%AE%9F%E8%A3%85-I%E3%83%BBO-BOOKS/dp/4875934289/ref=sr_1_1?ie=UTF8&qid=1392115035&sr=8-1&keywords=%E3%83%AA%E3%83%90%E3%83%BC%E3%82%B7%E3%81%AE%E4%BD%9C%E3%82%8A%E6%96%B9 第3章に探索アルゴリズムとして、ここの部分でMinimaxアルゴリズムをはじめとして複数が紹介がされています。 第4章が評価関数を扱っています。 リバーシの開発を行うのであれば必読と思います。 立ち読みで内容を確認してみてください。
- kmee
- ベストアンサー率55% (1857/3366)
構造体を使って、bestの値だけでなく、その座標も返せばいいのでは。 途中の計算では、評価点だけを見ればいいです。
- cametan_42
- ベストアンサー率62% (163/262)
Cじゃないんですが、このページか Scheme言語(Lisp言語)によるミニマックス法の解説: http://www.geocities.jp/m_hiroi/func/abcscm43.html あるいはこのページ Python言語によるミニマックス法の解説: http://www.geocities.jp/m_hiroi/light/pyalgo24.html が参考になるんじゃないでしょうか。
- Tacosan
- ベストアンサー率23% (3656/15482)
best を更新するときに「どこに置いたのか」を覚えておく.
補足
回答ありがとうございます。 bestを更新するときにどこに置いたのかを覚えておくために、仮にxとy座標を覚える変数にそれを代入して、再帰関数で最終的に一番浅い階層の親の座標をコマとして置きたいのですが、どのようにすればいいかわかりません。 下のようにmini_max_x,mini_max_yを関数外で宣言して記憶するようにしたのですが、これでは一番下の階層の子節点の座標が表示されてしまいます。 しかしうまくいくような実装法が考えられませんでしたので、よろしければどのようにすればよいかお教えください。 ________if(turn == 先手 && best < val){ __________best= val; __________mini_max_x = j; __________mini_max_y = i; ________} ________if(turn == 後手 && best <-val){ __________best= -val; __________mini_max_x = j; __________mini_max_y = i; ________}
- ok-kaneto
- ベストアンサー率39% (1798/4531)
一般的には「おける場所すべてに総当たり方式でおいてみる」でしょうね。 評価関数の戻り値に評価値、引数に置く場所の座標を与えます。 で、すべての組み合わせの座標を試してみて最大の効果を得られる場所の座標を記録しておきます。
補足
回答ありがとうございます。質問の仕方が悪かったので訂正します。 今ネットを参考にしつつ自分で作った関数があるのですが、下のようなもので オセロ盤をxxx[SIZE][SIZE];でSIZE 8と定義してあります。 allDireCheckでは、渡された座標がおくことができるなら置き1を返すという処理をするものです。 この関数内でx,y座標を記憶し最終的に返すとなるとどこにどのように書けばよいかわかりません。 おおまかに教えてくださるとうれしいです。 int Minimax(手番 turn, 先読みの深さ depth){ __int val,best; __/* 葉の場合、評価値を返す */ __if(depth == 0) return eval(); __best = -1000000; __for(int i = 0 ; i < SIZE ; i++) { ____for(int j = 0 ; j < SIZE ; j++) { ______if( allDireCheck(turn,j,i) ){ ________val = Minimax(次の turn, depth-1); ________if(turn == 先手 && best < val) best= val; ________if(turn == 後手 && best <-val) best=-val; ________盤面を1手戻す; ______} __return best; }
補足
回答ありがとうございます。 構造体はわかるのですが、関数の中でどのように実装すればよいかわかりません。 よろしければお教えいただけないでしょうか