羊の人工知能研究 ~将棋AI開発の日々~

将棋、リバーシのAIプログラミングを中心にその開発過程及び記録を頑張って更新していきます。

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

繰り返しによるチェック

 裏返せるかどうかのチェック方法にはさまざまな方法があるが今回は繰り返しを使ったチェック方法を紹介します。

 でも、どんなチェック方法においても同じことは『挟めれば置くことができる』という超基本的なルール。←図8参照



図8:石を挟んだ状態


 これをプログラムとして実装するには次の方法が一般的ではないだろうか。まず、1方向について考えます。その1方向について調べていき、相手の石の間繰り返し最後に自分の石があれば裏返せるという関数(checkSub)を作る。←図9参照



図9:checkSubのフローチャート
増分についてはコチラで説明しています。


 次に、この関数を各方向(8方向)について呼び出す関数(check)を作れば完成である。←図10参照



図10:checkのフローチャート


 このように2つの関数を使うと簡単にチェックを作ることができる。これは1次元配列のときも②次元配列のときも、壁のある場合に使用できる方法である。

 しかし、ここでハマることが頻繁にあります。それは置いた場所の次に自分の石がある場合です。checkSubを注目すると、まず引数として置いた座標と調べる方向の増分を渡す。ここでの繰り返しは後判定になっていて、まず増分を増やすことになる。次に自分の色が来たので、繰り返しから抜けて、条件判定で裏返せる(true)という判定になってしまいます。←図11参照



図11:失敗例


 ここでこの問題を解消するには、checkSubを呼び出す時に『次の石が相手の石の場合』という条件を付ける必要がある。また、この条件を入れることで次の石のチェックはできていることになるので、checkSubを呼び出すときの座標に増分を足しておくと無駄な処理がなくなります。



図12:checkの改良版フローチャート
クリックすると大きな画像が見れます




参考ソースファイル

2次元配列の場合
board3.h [DL]
board3.c [DL]

1次元配列の場合
board4.h [DL]
board4.c [DL]



次回予告:再帰によるチェック



↓読んだらクリックお願いします↓



スポンサーサイト

ねね。
このAIって俺とどっち賢い?
いちおう、啓太のレベルはC言語でFOR文までわかります☆
二重FOR文になってくるとテンパります。

  • 2006年02月02日木
  • URL
  • けーた #-
  • 編集

ん~別に特別なAI作らなくともランダム打ちでも勝つんじゃね?なんて言ってみたりする・・・
ケイシも余裕で倒すぐらいやし☆

  • 2006年02月02日木
  • URL
  • 羊 #AN1TInro
  • 編集

コメントの投稿

URL
コメント
パスワード
秘密
管理者にだけ表示を許可する

トラックバック

トラックバックURLはこちら
http://hitsujiai.blog48.fc2.com/tb.php/4-fb1b5651
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。