将棋盤。
将棋盤のModelをプログラミング中。
この間、世界コンピュータ将棋選手権を観戦してきて、自分もコンピュータ将棋のプログラムを書いてみたいなぁ、と思っていたり。
あんまり詳しく調べていなくて、ざっと眺めた程度なのがうさぴょんの育て親こと池さんの書いたJava将棋のアルゴリズム。
ただ、最初の方を見ていて、「こ・れ・は、、、、!」というか、(あくまでJavaプログラムとして評価して)とんでもなくひどいプログラム。
というか、Cでプログラムするとしたってもうちょいまともな書き方をしそうなもの。
ポインタとかを習う前のCプログラマがもうホント力技で書いたような・・・
速さを優先するために読みやすさを犠牲にするというのは、ある程度しょうがないのかもしれないけれど、正直こういったプログラムを見ると、関数呼び出しのオーバヘッドなんかよりもメモリのコピーとかアルゴリズムそのものの功罪の方が大きいと思うのだけれど・・・
(実際に測ったことないから、確実なことは言えないけれど。)
それにしても、160ページのプログラムはすごい・・・
電車で読んでいたんだけれど、思わず柱に頭をぶつけた^^;
void initKanagomaValue() {
for (...) {
for (...) {
for (...) {
for (...) {
for (...) {
for (...) {
...
}
}
}
}
}
}
}
どうしてこうなった!
#そういえば、定数類をinterfaceで定義して、そのinterfaceをclassでimplementsする(実際には何も実装しない――実装(というか定義)はinterfaceですでに行われている!)ことで、共通の定数をclassに持たせるって手法、初めて見た・・・
#JavaのimplementsはCのincludeじゃないってのに・・・
#オブジェクト指向的に、明らかに「意味」がおかしい・・・
もっとも、他のプログラムは流石にこうじゃないんだろうな、と思いたい。
まぁ、ソースが結構転がっているから、実際に読んでみればいいだけなんだけれど。
・・・それはさておき、冒頭の話に戻って。
ということで、現在、将棋盤を表現するclass群をプログラミング中。
速度よりも読みやすさ・変更のしやすさ・バグの入りにくさを重視して作っていこうと最初は思ったんだけれど、変更のしやすさについてはすでに断念OTL
というのも、最初は全部interfaceで切っていこうと思ったんだけれど、将棋盤をモデル化して単純にしようとすると、意外と例外的な処理が多くて、これがなかなか難しい・・・
例えば、「一手指す」という動作を見ても、「駒台から駒を打つ」のか「盤上の駒を進める」のか、というので、「駒台から駒を打つ」なら「駒の種類」と「打つ場所」、「手番(先手か後手か)」を指定する(一例として)のに対し、「盤上の駒を進める」場合には「動かす駒の位置」と「動かす場所」、「成る/不成」を指定する(一例として)で、同じinterfaceに切れない・・・
それぞれ専用のmethodを用意するのが筋ではあるけれど(どちらも「将棋盤」の振る舞いの一つだから)、その場合今度は「一手戻す」のが面倒になりそうな。
まぁ、そんなこんなでいろいろと悩みながら(結局、正解がないので。速度を優先するなら、それは言語ごとに暫定的な解があるんだろうけれど)、まったりとプログラミングしてたりします。
将棋盤のModel自体は、あともうちょいといったところ。
(全然テストしてないから、バグだらけだろうけれど。)
ちなみに、こんな感じの設計。
(それにしても、UMLの書き方がやっぱりよく分からない・・・もっとも、属性と操作を分けて書いてないし、privateなものは省略しているので、UMLもどきでしかないんだけれど)
これが終わったら、(Ajile的には順序が逆だけれど)テストコード書きと、Viewの作成(GUI、CUIそれぞれ)、思考部の作成とちまちま進めていこうかな、と。
Javaだから究極的には速さの壁が出てくると思うので(=同じ論理の設計でもC++などの実装に比べ弱くなる)、どちらかというと(自分自身に対するものを含めて)教育的な(そう、ETV的なw)ものになってくるかなぁ、と。
めっちゃ弱いんだろうなぁ^^;
あ、ちなみに、プログラムの名前は、なのはさん(さん付けは必須。まして魔王なんてうわ、なんだ、wせdrftgyふじこlp)や長門(プログラム名は違うっぽい?)はいるみたいなので、「さくら」にしようかな、と。
えぇ、『C.C.さくら』の。
ETV的にもwww
(一応、魔法?少女繋がりになりそうな)
それはさておき、こういうのってありそうでなかったような。
誰か作らないかなwww
(自分で作る?w)
| 固定リンク
「Shogi...」カテゴリの記事
- 王位戦第5局。(2010.08.26)
- 将棋盤@GUI関係メモ。(2010.07.25)
- 将棋の駒。(2010.07.14)
- テスト作成中。(2010.07.12)
- データクラスばかり。(2010.07.06)


コメント
はじめまして!!
自分のブログが長門として紹介されてる(笑)
6重forループですけど、kingSとkingEを同時に使う部分はよく見ると無いので、2重のループが消せて、
さらにdanとsujiのループは一次元のループにすれば半分になり2重のループになりますよね。
自分のプログラムは弱弱ですが、対戦できる日を首を洗って待ってます!(謎)
あと、アドレスは萌え将棋の駒の方ですw
投稿: ながと | 2010年5月17日 (月) 06時22分
ども、はじめまして。
6重ループは、見た瞬間に心が折れて、中身まで読んでいませんでした・・・
まぁ、ボチボチとやっていくつもりなんで、よろしくお願いします。
萌え将棋駒・・・これはいいですねぇ。
成ると顔が赤らむのかぁw
投稿: やまいも | 2010年5月17日 (月) 22時56分
はじめまして!
さん付け必須といわれると、自分はつけてないので困ってしまいますが、まだまだ名前負けしているので、次は強さを求めて行こうと思っています。
投稿: かず@なのは | 2010年5月18日 (火) 02時58分
はじめまして〜
>さん付け必須といわれると、自分はつけてないので困ってしまいますが
まぁ、そこは生みの親の特権ですw
投稿: やまいも | 2010年5月18日 (火) 23時59分