「 ↑ 2手目に ライオンキャッチ されてしまう手が1つでもあるときの、1手目の手のことよ」
「 その手を指した後の、相手の手を すべて調べないといけないよな☆」
「 1 ply 読みでは、それが自殺手かどうかは 分かんないもんな☆」
「 ↑ じゃあ 2手目に ライオンキャッチ があったとしよう☆」
「 自殺手というのは 2手目の将来を見てきて、1手目に戻ってきたときに 初めて分かることなので、
自殺手というのは 後ろ向き探索 で初めて分かる手ということだぜ☆
わかりやすく言うと くまさんが森の奥へ入っていくとき前向き探索、 くまさんが森の奥から戻ってきているとき後ろ向き探索 だぜ☆」
「 リムーブか……☆ 将棋の指し手生成で 手をリムーブというのは聞いたことないが 考えてみるかだぜ☆」
「 ↑ とりあえず 玉は 8方向動けるので、 この8個の中の一番良い手を選ぼうとするんだぜ☆
で、問題が起こるのは……☆」
「 ↑ 6方向が塞がれていて、あいにく 自殺手と2手目後に分かる2方向にだけ動けるときだぜ☆
この2方向には、-9999点が付いていようと、他の手が -10000点なら 比較すれば 一番良い手だぜ☆」
「 指し手には -32768 ~ 32767
という点を付けるのが一般的だぜ☆
-32700 点ならリムーブ、とか 符牒(ふちょう) を予め決めておくならいいかもしれないな☆」
「 pub const VALUE_TO_REMOVE: i16 = -32700;
を定義しましょう!」
「 じゃあ 王さんが動く前は 必ず 自殺手判定 してから 探索したら どうだぜ☆?」
「 自殺手が起こるのは 王さんが 動いたときだけではないぜ☆」
「 じゃあ 王さんと、ピンされている駒が動くときは 自殺手判定 したらどうだぜ☆?」
「 ピンされている駒が どれかを知っているためには 盤面を走査するか、何らかの方法を取っておく必要があるな☆」
「 ↑ 簡単なケースでは、自分の王さんから レイ(直線の光線)を飛ばすだけでいけるんだが……☆」
「 ↑ 駒が2つあれば ピンではなくなるぜ☆
もちろん、相手の駒が途中にいても ピンではなくなるぜ☆」
def scan_for_pinned_piece():
pinned = None
for square in all_west_of_king:
if friend in square:
if pinned is None:
pinned = friend
else:
return None
elif opponent in square:
if opponent is sliding_piece:
return pinned
elif:
return None
return None
「 ↑ ピンされている方向は分かっているのだから、1手指さずに 移動方向をリムーブできないだろうか……☆」
「 ↑ バーティカルなピンには、バーティカルに動いていいということだぜ☆」
「 だったら Onw discovered check は、1手読み で防げそうだな☆ 前向き探索 だぜ☆」
「 なんか きふわらべのプログラム、駒を選んで動かす、みたいに なってないのな☆」
「 ↑ とりあえず 盤上をスキャンして 自分の駒を探すかだぜ☆」
「 ↑ そして 自分の駒を 見つけたら……☆
この駒は ピンされていない駒としような☆」
「 作った 指し手 は すぐ指すのではなく、いったん溜めることにするぜ☆」
「 ↑ 歩 は1マスしか進めないが、敵陣に入るときは 成るか 成らないかを選べることに気を付けろだぜ☆
敵陣の一番奥には進むには成る必要があるぜ☆」
「 ↑ 香 は突き当りまで進めるぜ☆ 途中下車もあり☆ 敵陣に入るときは 成るか 成らないかを選べることに気を付けろだぜ☆
敵陣の一番奥には進むには成る必要があるぜ☆」
「 ↑ 桂 は 2つのマスのどちらかに ワープできると思えだぜ☆ 敵陣に入るときは 成るか 成らないかを選べることに気を付けろだぜ☆
敵陣の一番奥、また奥から二段目には進むには成る必要があるぜ☆」
「 ↑ 銀 は5方向に進めるが、敵陣に入るとき、または敵陣から出るときに 成るか 成らないかを選べることに気を付けろだぜ☆
盤の端から外に出れないのは 分かるな☆」
「 ↑ 金 は6方向に進める☆ 成れない☆ 盤の端から外に出れないのは 分かるな☆
と、杏、圭、全 も同じ☆」
「 ↑ 玉は 8方向に動ける☆ 成れない☆ もちろん 壁の外には出れないぜ☆」
「 ↑ 角は 4方向に突き当りまで進めるぜ☆ 途中下車もあり☆ 敵陣に入るときは 成るか 成らないかを選べることに気を付けろだぜ☆」
「 ↑ 飛は 4方向に突き当りまで進めるぜ☆ 途中下車もあり☆ 敵陣に入るときは 成るか 成らないかを選べることに気を付けろだぜ☆」
「 ↑ 馬は 4方向に突き当りまで進めるぜ☆ 途中下車もあり☆ 成れない☆
また、4方向に1マス進めるぜ☆」
「 ↑ 竜は 4方向に突き当りまで進めるぜ☆ 途中下車もあり☆ 成れない☆
また、4方向に1マス進めるぜ☆」
「 ↑ 17個の動きがあれば、あとは組み合わせのはずだぜ☆」
「 ↑ それぞれに 名前を付けることで プログラミングを始めることができるぜ☆」
「 ↑ 1手戻すのに 後ろに飛ぶ ケーマ も やっぱ 要るぜ☆」
「 これだけあれば 各駒の メイク ア ムーブメント は作れるかだぜ☆」
「 駒の動きを、さっきの 西だの東だの言っていた部品で 組み立てろだぜ☆」
「 じゃあ 3つ足して 13種類の駒の動きを作ればいいんだぜ☆」
「 駒の方だけ こう動ける、とアピールしても ダメなんじゃないかだぜ☆?
現局面に どう駒が置かれているか、にも よるだろ☆」
「 ↑ どこかにある駒が、どこかの升に移動することを 局面に尋ねるわけだが……☆
答えてほしいのは……☆」
「 ↑ スペースがあるか、 自分の駒があるか、 相手の駒があるか、 それとも 何もないかだぜ☆」
「 あっ、まだ だぜ☆
成るか どうかの判定が 加味されてないぜ☆」
「 成ってない駒が 敵陣3段に入るときと、敵陣3段から出るときだぜ☆」
「 移動前でも、移動後でも、どっちかに敵陣が からんでいれば いいのよ」
「 移動する前から 成る条件が成立しているケースと、移動した後で 成る条件が成立するケースがあるのかだぜ☆」
「 あと、先手か 後手かで 駒の東西南北が変わるんだが……☆」
「 ↑ ひとまず 符号は 将棋では一般的な これに固定しようぜ☆」
//! Square is shogi coordinate. file*10+rank.
//!
//! North
//! 91 81 71 61 51 41 31 21 11
//! 92 82 72 62 52 42 32 22 12
//! W 93 83 73 63 53 43 33 23 13 E
//! E 94 84 74 64 54 44 34 24 14 A
//! S 95 85 75 65 55 45 35 25 15 S
//! T 96 86 76 66 56 46 36 26 16 T
//! 97 87 77 67 57 47 37 27 17
//! 98 88 78 68 58 48 38 28 18
//! 99 89 79 69 59 49 39 29 19
//! Source
//!
//!
//! North
//! 00 01 02 03 04 05 06 07 08 09
//! 10 11 12 13 14 15 16 17 18 19
//! 20 21 22 23 24 25 26 27 28 29
//! E 30 31 32 33 34 35 36 37 38 39 W
//! A 40 41 42 43 44 45 46 47 48 49 E
//! S 50 51 51 53 54 55 56 57 58 59 S
//! T 60 61 62 63 64 65 66 67 68 69 T
//! 70 71 72 73 74 75 76 77 78 79
//! 80 81 82 83 84 85 86 87 88 89
//! 90 91 92 93 94 95 96 97 98 99
//! Source
//!
「 ↑ 香車も 歩も 同じかだぜ……☆?
同じなら プログラムは使い回さないとな☆」
「 ↑ 桂馬は 歩、香とは 奥から2段目も必ずならないといけないところが 違うな☆」
「 ↑ 銀は 奥から3段目にいるときだけ、4段目でも成れるという おまけ が付くぜ☆」
「 ↑ 角は 非敵陣にいるとき、後ろ向きの動きでは成れないぜ☆」
「 非敵陣にいるとき、敵陣で成れるぜ☆ 敵陣にいるとき、どこでも成れるぜ☆」
「 ↑ 馬は いつでも どこでも プロモーションできるかどうかは 気にしなくていい☆ できない☆」
「 きふわらべちゃん、王さまを ただ捨てしてはいけないのよ」
「 2手指してみて、相手が わたしの らいおん を取ったら 自殺手なのではないか☆?」
「 ↑ 木構造の探索には、行き と 帰り があるわけだぜ☆」
「 この 帰り のとき、 らいおんきゃっち されてしまった、 という情報が必要だぜ☆」
「 ↑ 相手は4手後に こっちの玉を取るし、
こっちは4手後に 玉を取られるのが 分かるぜ☆」
「 らいおんきゃっち ができるときでも、 らいおんきゃっち 以外の手を指しているようでは、詰んでいるとはいえない☆
1手詰めは 必ず 1手詰めしなければいけないぜ☆」
「 らいおんキャッチが 1 付いているときは 評価値を最低にしようぜ☆
他に指す手がなければ それを選ぶぐらいで☆」
「 局面評価値 = -30000 + らいおんきゃっち数
ぐらいでいいか……☆」
「 逆に らいおんきゃっち数 が 2 のときは 必ずその手を指すべきじゃない?」
「 局面評価値 = 30000 + らいおんきゃっち数
ぐらいでいいか……☆」
<次の記事へ>
Crieitは個人で開発中です。
興味がある方は是非記事の投稿をお願いします! どんな軽い内容でも嬉しいです。
なぜCrieitを作ろうと思ったか
また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!
こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください!