指し手差分生成

指し手を局面情報から逐次生成するのではなくて、局面情報を書き換える際に古い局面の指し手と局面の差分から新しい局面の指し手を作るというアイデアです・・・おそらく。
十数倍だか数十倍(どっちだったか忘れた)速くなる by 激指教授

  • 具体的方法?
    • 40枚それぞれの駒にIDを与えて管理し、それぞれを動かす指し手を別々に管理する。
    • 但し、持駒を打つ手は別に逐次生成する。
    • 先手が指した際は後手の指し手を更新、後手が指した場合は先手の指し手を更新と1手おきに先後入れ替えて指し手を更新する。
    • 各駒種ごとに指し手更新関数を用意し、更新直前の二つの指し手に対して、移動元移動先に利いていた駒、動かした駒、取った駒が更新対象。
    • この際、利きが更新されてから利きを参照しないように工夫が必要。(利きの更新直前に更新必要IDを保存する?それなら一手ごとに更新しても一緒?)
    • 王手に対する応手の際は差分生成が有効でない。しかし、さらに2手先のために王手無視になる指し手も更新しておく必要がある。
    • 王に対する利きを遮っている駒の処理をどうするべきか?最終的に指し手とする前にその駒が動けるか確認すればいいが、遅いか?(影利きデータがあればそうでもない?)

  • ちゃぱのデータ構造(これで実装できそう?)
/* 駒 */
typedef int Koma;
 
/* 駒個別管理用構造体 */
typedef struct _KomaState {
	int fPos;				/* 駒の位置 */
	Koma fKomasyu;			/* 駒の種類 */
} KomaState;
 
/* 各駒個別の利き情報 bit積で特定駒の効きがあるか調べる */
typedef unsigned long long Kikibit;
typedef unsigned int KageKikibit;
 
typedef struct _KikiData {
	Kikibit fSeme;
	KageKikibit fSemeKage;
	Kikibit fUke;
	KageKikibit fUkeKage;
} KikiData;
 
/* 局面最小情報 */
typedef struct _Kyokumen {
	Koma fBan[BANARRAYSIZE];		/* 盤面情報 */
	int fSemeMochiKoma[MKOMA_SYU];	/* 攻め方の持ち駒 */
	int fUkeMochiKoma[MKOMA_SYU];	/* 受け方の持ち駒 */
	int fTeban;			/* 手番 */
#define SEMEKATA	(1)	/* 攻め方 */
#define UKEKATA	(-1)	/* 受け方 */
} Kyokumen;
 
typedef struct _EachKomaPos {
	int fBan[BANARRAYSIZE];		/* 盤面情報 */
	int fSemeMochi[MKOMA_SYU][HU_MAX];	/* 各持ち駒 局面の持ち駒数からスタック的に使用 */
	int fUkeMochi[MKOMA_SYU][HU_MAX];
} EachKomaPos;
 
/* 局面情報構造体 */
typedef struct _KyokumenData {
	Kyokumen fKyokumen;		/* 局面 */
	KomaState fEachKoma[KOMAKAZU];	/* 駒個別管理配列 */
	EachKomaPos fEachKomaPos;		/* 各場所の個別駒情報 */
	KikiData fKiki[BANARRAYSIZE];	/* 利き駒情報 */
} KyokumenData;
 

タグ:

+ タグ編集
  • タグ:

このサイトはreCAPTCHAによって保護されており、Googleの プライバシーポリシー利用規約 が適用されます。

最終更新:2008年06月03日 21:25
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。