JavaScriptで将棋のルール その4 ~ 局面の内部表現 ~
こんばんは、ただのあほです。
今回は、JavaScript将棋盤の、
局面の内部表現がどうなっているかについて書いてみようと思います。
まず、「 Position (局面)」というオブジェクトに、
どんな情報をもたせているか、ですが、
・ 盤 Board
番兵(OUT_OF_BOARD)もいれて11×11
9×9の将棋盤のまわりに1層の番兵をおいている
・ 持ち駒 Capture
先後、駒の種類という2つの変数がインデックスになっている配列
配列の中身がもっている駒の枚数
・ 手番 turn
true が先手、false が後手
・ 歩のフラグ FuFlg
ある筋に歩があるかないかをあらわすフラグ 二歩の判定につかう
先後、筋という2つの変数がインデックスになっている配列
その筋に歩が、true ならあり、false ならない
・ 玉の位置 blackKingPos whiteKingPos
先後それぞれの玉が、どの段、筋にいるか
というふうにしています。
ま、なにはともあれ、コードを貼ってみたいとおもいます。
また、このオブジェクトのプロトタイププロパティには、
do_move 動かす
undo_move もどす
Set_default 初期配置にセット
IsControl あるマスに先後どちらかの駒の利きがあるかどうかしらべる
CanMove ある駒があるマスに動けるかどうかしらべる
CanDrop 歩、桂、香を打っていい段かどうか、二歩かどうかをしらべる
MakeLegalMoves 合法手を生成する
EvalPieceValue 駒割にもとづいて局面を評価、点数化する
といった関数をもたせています。
その中身は、長くなるので次回以降に。
それはそうと、メンバの頭文字が大文字だったり小文字だったりと統一感がないですね。
あまり意識せず適当につけていたのですが、(よくないですね)
よくみると、配列は大文字にしているというルールがありますね。
いま気づきました。どないやねん。
単語の区切りを大文字にする方法(キャメルケースというらしい)と、
_ で区切る方法(スネークケースというらしい)があるみたいですが、
基本はキャメルケースをつかって、
ある関数の中だけでつかう変数(ローカル変数でいいんでしょうか)は、
スネークケースをつかってます。
あと、do_move と undo_moveは、
やねうらおさんのブログに書いてあったものを
そのままマネしたのでスネークケースになっています。
Set_default もそれにひっぱられてスネークケースになっていて、
あと「 Set 」は大文字にするクセがあるのでそうなっています。
気になったかたは、ごめんなさい。
なんにせよ合理的なルールにのっとって変数名をつけるのがだいじなんでしょうね。
気をつけてプログラミングしていきたいと思います。
つぎは、「 局面 Position 」オブジェクトのプロトタイプにもたせた
それぞれの関数について書くことになると思います。
それでは。