
今オセロゲームをCで作成中なので、先ほども質問したのですが、
http://hp.vector.co.jp/authors/VA015468/platina/ …
のサイトのminiMax法の実装法ですと最終的な戻り値は評価値ですよね?
一番いい評価値の場所にコマを置くためには結局そのx.y座標が必要だと思うのですが、どこからそのx.y座標を最終的に得るのでしょうか?
ご教授願います
A 回答 (5件)
- 最新から表示
- 回答順に表示
No.5
- 回答日時:
突如として割り込んでしまいすみません。
疑問点があるのであれば書籍を参考にするのはいかがでしょう?
>リバーシのアルゴリズム C++&Java対応―「探索アルゴリズム」「評価関数」の設計と実装 (I・O BOOKS) [単行本]
>http://www.amazon.co.jp/%E3%83%AA%E3%83%90%E3%83 …
第3章に探索アルゴリズムとして、ここの部分でMinimaxアルゴリズムをはじめとして複数が紹介がされています。
第4章が評価関数を扱っています。
リバーシの開発を行うのであれば必読と思います。
立ち読みで内容を確認してみてください。
No.3
- 回答日時:
Cじゃないんですが、このページか
Scheme言語(Lisp言語)によるミニマックス法の解説:
http://www.geocities.jp/m_hiroi/func/abcscm43.html
あるいはこのページ
Python言語によるミニマックス法の解説:
http://www.geocities.jp/m_hiroi/light/pyalgo24.h …
が参考になるんじゃないでしょうか。
No.2
- 回答日時:
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;
________}
No.1
- 回答日時:
一般的には「おける場所すべてに総当たり方式でおいてみる」でしょうね。
評価関数の戻り値に評価値、引数に置く場所の座標を与えます。
で、すべての組み合わせの座標を試してみて最大の効果を得られる場所の座標を記録しておきます。
この回答への補足
回答ありがとうございます。質問の仕方が悪かったので訂正します。
今ネットを参考にしつつ自分で作った関数があるのですが、下のようなもので
オセロ盤を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;
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
グラフの交点の求め方(Excel)
-
マインクラフト(pc版)で座標...
-
WM_NCHITTESTの流れ
-
Fortranで直交座標から極座標変...
-
Excel VBA で自在に図形を変化...
-
エクセルである点からの距離で...
-
MFCでボタンを押して図形を操作...
-
3次元空間上の2つの座標から...
-
ガウシアンフィルタのCプログラム
-
回転する矩形同士の当たり判定...
-
<T>とは何ですか
-
ClientToScreen
-
VB6のPrinter.ScaleWidth に対...
-
「アイテムは収集されました」...
-
コントロールの書式設定で、“コ...
-
エクセルで作った新しいウイン...
-
ダイアログの上のテキストボッ...
-
VB.NET2005 TextBox 高さ(Heig...
-
連続で印刷すると画像が更新さ...
-
VBにて指定した通りにExcelの列...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
グラフの交点の求め方(Excel)
-
マインクラフト(pc版)で座標...
-
3次元空間上の2つの座標から...
-
シーケンサー(PLC?)で制...
-
ダイアログ内コントロールの位...
-
エクセルで回転する座標の出し方
-
ワード上Shapeの位置情報を統一...
-
始点、終点の二つの座標と半径...
-
Excel VBA で自在に図形を変化...
-
C言語で制作するピラミッドアー...
-
C言語 配列で座標
-
閉図形の座標の配列が右回りか...
-
ガウシアンフィルタのCプログラム
-
任意点を中心とした回転
-
c言語でキーボードから2点の座...
-
3D→2Dの座標変換で、スクリーン...
-
求積表の計算方法
-
以下のプログラムは重心を求め...
-
複数の回転する長方形の衝突判定
-
直線上にある点の座標の求め方
おすすめ情報