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

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

スポンサーサイト

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

つ、遂にAIの基本完成

 つ、遂に将棋の基本AIが完成しましたヽ(●´ε`●)ノ 本日までに追加した機能としては、以下の2つです。

①王手を判定する
②合法手を生成する


 ①の王手を判定するについては、『王の座標に移動できる敵駒があるか?』という考えのもと、そのままコーディングした。王(玉)の座標についてはこの盤面の仕様で、盤面は駒のポインタ配列でできていて、それぞれの駒がどの座標にいるかという情報を持っているので、盤面を初期化するときにこの変数のポインタを保存してあるので、ポインタを参照することで座標は簡単に知ることができます。まぁ分かりにくいと思うので↓を参照。。。

//駒構造体
typedef struct KOMA{
char kind;//種類
char xy;//座標
bool nari;//成り状態
char owner;//所有者
}KOMA;

//盤面クラス
class BOARD{
private:
KOMA *table[121];//駒のポインタテーブル
KOMA koma[121];//上下左右に厚さ1の壁を設けている
char *ou_xy[2];//王の玉の駒構造体の座標へのポインタ



(省略)
};


言葉では説明が難しかったので簡単なソースを付けてみましたが言いたいことが分かってもらえたでしょうか?王は盤面から排除されることがないので、最初にこのようにポインタとしておくと、移動しても簡単に王の座標を知ることができるのです。これにより、この王の座標に移動できる相手の駒を探すことにより王手かどうかを判断することができます。


 次に②合法手を生成するについては、まず合法手とは、ルールに従って移動できる手及び置ける手です。また、王手がかかっている場合は王手を回避することのできる手が合法な手です。
 王手がかかっていない場合は、お得意関数ポインタ配列を使って『A座標の駒はB座標に移動できる』『K駒をB座標に置くことができる』というものを全てリストアップする関数が既に用意してあるので、そのリストを連結するだけです。
 王手がかかっている場合については、王手がかかっていない場合についてその中で『その手を打った次の手で相手に王が取られないか?』について判断し、王手がかかっていない場合が回避できた場合なのでそれをリストに追加していくだけです。

 この辺については、まだまだ改善する必要があると思うがこの2つの関数により、探索の中で合法手が存在しない場合は『詰み』と判断できるようになったので、

ようやく一応のAI完成

となった。




次回予告:詰め将棋の基礎
に入れたらイイな~頑張ります。。。



↓現在2つのランキングに参加しています↓
現在18位
現在2位
スポンサーサイト

コメントの投稿

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

トラックバック

トラックバックURLはこちら
http://hitsujiai.blog48.fc2.com/tb.php/22-5f62bf9b

[エンターテインメントのこと]よくわからなかった将棋の思考アルゴリズムいろいろ

というわけで自分で考えてもよくわからなかったので、グーグル大先生経由でいろんな人に教えを請うことにしました。 YSS(山下将棋システム) http://www32.ocn.ne.jp/~yss/book.html うさぴょん 将棋プログラムの作り方 http://homepage1.nifty.com/Ike/usapyon/HowToMakeSho

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