チェスにはフェアリーチェスと言って、普通のルールのチェスとは異なるルールのものがあります。
また駒もフェアリーチェス独特の面白い駒があったりします。
ちなみに将棋にも大局将棋とか天竺大将棋というものがあって、駒の動きとか調べてると本当にカオスだなって感じ。
でもそういうチェスができるアプリってなかなかないんですよね。
あったとしてもチェス960(ポーン以外の並び順がバラバラになるチェス)ぐらいで、変則駒を使えるものは見たことがありません。
ということで、 Python も覚えたし、自分で作っちゃおう!
まずは先例を調査
とは言っても、さすがにゼロから作るのは難しいので、 Python でチェスのプログラムを作った人がいないか、調べてみました。
すると、なんといるではありませんか!
おお、ありがたい!これをベースにさせていただいて、プログラムを書いていきましょう。
とりあえず動かしてみる
どんな感じになってるのか、とりあえず動かして遊んでみます。
おお、すごい!
って、あれ?黒のクイーンとキングの位置が逆になってるぞ?
まあ、とりあえず動かそう。 d2 を d4 に。
黒先だと…?
ならば、 d7 を d5 に!
1歩しか動けない…
ポーンは本来最初の1手だけは2歩進めるんですが…
まあ、とりあえず動いているところを見たい。
おお、ちゃんと動いてる!わーい
(なんでこう書けば動かせると分かったかと言うと、単にソースコードを見たからです。)
でも、先ほどのリンクページの下にも書いてあったんですが、色々と問題点が残っているみたいで。
ちょうど問題点をリストアップしてくれている人もいますので、
次回からはそれらを修正しながら、プログラムがどのように動いているか見ていくことにします。
ここではとりあえずソースコードをのぞいてみましょう。
長いので、ここには貼りません。リンクからコードを見てみてください。
ソースコードを見てみる
コードは大きく二つのパートに分けられます。
ゲームの進行を制御するパートと、駒の動きを定義するパートです。
ゲームの進行制御
Game
placePieces
で盤面に駒を配置し、main
が全体の流れを制御しているようです。isCheck
はキングがチェックされているかどうかを返し、canSeeKing
が誰かがキングを攻撃しているかどうかを返します。parseInput
はキーボード入力を受け付け、printBoard
で盤面の絵をプリントしています。駒の動きの定義
各駒のクラスと、それらのの
Piece
がメインです。各駒のクラスは共通して
availableMoves
メソッドを持ち、移動可能な位置を出力しています。ポーンはちょっとややこしそう。
Piece
ではを付与し、各駒のavailableMoves
で使うためのメソッドが用意されています。ランナー(特定の方向に一直線に進む駒)をつくったり、味方駒は攻撃しないけど敵駒は攻撃できるようにしたり、などですね。
Game
のplacePieces
で、各駒のクラスをもとに駒をオブジェクトとして生成しています。
盤面は、駒の位置を表す二要素
をキーに、駒オブジェクトを値にとったとして表現されています。なぜタプルかというと、タプルはなので、辞書のキーとして使えるから。
それと辞書のキーは重複指定不可能なので、盤面上のひとつのマスにはひとつの駒しか乗らないのをうまく利用しているようです。
機能を拡張するには、オリジナルをよく知ることが大切だと思っていますので、
から、問題点を修正しつつ仕組みを理解していきます!