オセロの探索(深さ優先探索)について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
学生A

オセロの探索(深さ優先探索)について

#1

投稿記事 by 学生A » 14年前

立て続けに質問ごめんなさい。学生Aです。
また、オセロの話題に戻るのですが…
やはり、http://dixq.net/forum/viewtopic.php?f=3 ... ナンスが大変だと思い
http://hp.vector.co.jp/authors/VA015468 ... クトを作り直しました
AI以外は、結構うまく作れましたが、探索のところでつっかえてしまいました。

プロジェクトファイル↓ ダウンロードパス「otl」
http://www1.axfc.net/uploader/Sc/so/256123

問題は、このプロジェクトファイルの「computer.cpp」の「computer_think_main」関数で、これを「main.cpp」から呼ぶときに、n=0以外を引数にして呼ぶと、評価値に変なゴミみたいなものが入ります。
main.cppでcomputer_think_main(&ban[0],1);と書いた場合
4,3に置いた後、自作のdebug関数で、hyoukatiを調べると、評価し終わった後のhyoukatiが

コード:

-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
-1000,-1000,-1000,53,-1000,46,-1000,-1000,-1000,-1000,
-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,45,36,
となります。
中段の53と46は想定の動作なのですが、右下の45,36が問題で、ここは本来は盤面の外を表すために付加した領域で、-1000以外の評価値が入ることは許されない領域です。なぜこのようなゴミデーターがはいってしまうのでしょうか。

また、もう一つ質問があるのですが、探索関数はこのような方針で間違っていないでしょうか。間違っていたら指摘お願いします。

学生A

Re: オセロの探索(深さ優先探索)について

#2

投稿記事 by 学生A » 14年前

すいません。何かリンクがおかしくなってしまいました。
私の書いた前のソースは、
http://dixq.net/forum/viewtopic.php?f=3&t=8871
で、参考にしたページは、
http://hp.vector.co.jp/authors/VA015468/platina/algo/
です。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: オセロの探索(深さ優先探索)について

#3

投稿記事 by softya(ソフト屋) » 14年前

こういう場合は、直接ソースコードに異常値が代入されたらブレークさせる方法があります。

ソースコードでhyoukatiの値変更の直後に
if( hyoukati[98] == 45 ) {
DebagBreak();
}
と埋め込んでもよいでしょう。

あるいはデータブレイクを使います。
「方法 : データ ブレークポイントを設定する (ネイティブのみ)」
http://msdn.microsoft.com/ja-jp/library ... .100).aspx

&hyoukati[98]をデータブレークのアドレスにしてみてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

学生A

Re: オセロの探索(深さ優先探索)について

#4

投稿記事 by 学生A » 14年前

softya(ソフト屋)さん、返信ありがとうございます。
>データブレイク
なるほど、そんな機能がVS2010にあったのですね!
しかし、使ってみようとしましたが、デバッグ>ブレークポイントの作成>新しいデータブレークポイントが選べない状況です。
開発環境を管理者権限で起動したり、プログラムを実行中に選ぼうとしてみたりしましたが、選べませんでした。

↓こんな状況です。
画像

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: オセロの探索(深さ優先探索)について

#5

投稿記事 by softya(ソフト屋) » 14年前

一度デバッグを開始する必要があると思います。
なので、一度main直後にブレークで止めてください。
そうすれば選べる思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

学生A

Re: オセロの探索(深さ優先探索)について

#6

投稿記事 by 学生A » 14年前

返信ありがとうございます。
ブレークポイントを作って、デバッグを実行した後だと、選択することが出来ました。
おかげで原因らしきものが分かりましたが、その原因が分からないという状況です。

原因はGloval.cppのflip_line関数の

コード:

stack[sp++]=~~
で、そのspが-2となっているからです。
現在、spが-2となってしまう原因を探しています。

----------------------------------------------------------------
ちなみに、現在の最新のソースは
http://www1.axfc.net/uploader/Sc/so/256315.zip
です。前回からstackの仕様とundoの仕様が主に変わりました。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: オセロの探索(深さ優先探索)について

#7

投稿記事 by softya(ソフト屋) » 14年前

先ほど同じでspにデータブレイクを仕掛けます。
出来たブレークポイントの条件にsp<0を書き加えてください。 → ブレークポイントのウィンドウで変更できます。
こうすればspがマイナスになるとブレークします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

学生A

Re: オセロの探索(深さ優先探索)について

#8

投稿記事 by 学生A » 14年前

ありがとうございます!!
バグを潰すことが出来ました!

潰すに至った経緯は以下のとおりです。

spにデータブレイクを仕掛けたところ、どうやらundoが多く呼ばれすぎているということが分かりました。
tansaku関数の中で、undo();が呼ばれすぎているので、tansaku関数を再び書き直しました。
これによって、undo();が呼ばれる箇所は一カ所になりましたが、バグは残ったままでした。
更にデバッグを続けていると、putable配列が何かおかしいと思い、そこをチェックしてみました。
まず、putable配列をアップデートするupdate_putable関数の中の、

コード:

flip(&com_ban[0],com_turn,i,FALSE)
という記述が誤っており、正しくは

コード:

flip(&com_ban[0],com_now_turn,i,FALSE)
でした。ずっと、コンピューターの色の石ばかり置いてても意味がありませんでした(涙)

また、putable配列という変数自体も誤りで、
これをグローバル変数として宣言していたので、2個以上の葉を調べる際に、その前のupdate_putable関数によってputable配列が破壊されていました。
よって、打てないはずのところを打って、undoを繰り返していたので、spが-になってしまったという結論になりました。

最終的なソースは以下です。
http://www1.axfc.net/uploader/Sc/so/256477.zip&key=otl

softya(ソフト屋)さん、本当にありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る