チェスアプリ開発(1) オリジナルのコードを解読

 

チェスにはフェアリーチェスと言って、普通のルールのチェスとは異なるルールのものがあります。

また駒もフェアリーチェス独特の面白い駒があったりします。

ちなみに将棋にも大局将棋とか天竺大将棋というものがあって、駒の動きとか調べてると本当にカオスだなって感じ。

でもそういうチェスができるアプリってなかなかないんですよね。

あったとしてもチェス960(ポーン以外の並び順がバラバラになるチェス)ぐらいで、変則駒を使えるものは見たことがありません。

ということで、 Python も覚えたし、自分で作っちゃおう!


まずは先例を調査

とは言っても、さすがにゼロから作るのは難しいので、 Python でチェスのプログラムを作った人がいないか、調べてみました。

すると、なんといるではありませんか!

chess program for python

おお、ありがたい!これをベースにさせていただいて、プログラムを書いていきましょう。

とりあえず動かしてみる

どんな感じになってるのか、とりあえず動かして遊んでみます。

コマンドライン

おお、すごい!

って、あれ?黒のクイーンとキングの位置が逆になってるぞ?

まあ、とりあえず動かそう。 d2 を d4 に。

コマンドライン

黒先だと…?

ならば、 d7 を d5 に!

コマンドライン

1歩しか動けない…

ポーンは本来最初の1手だけは2歩進めるんですが…

まあ、とりあえず動いているところを見たい。

コマンドライン

おお、ちゃんと動いてる!わーい😄

(なんでこう書けば動かせると分かったかと言うと、単にソースコードを見たからです。)

でも、先ほどのリンクページの下にも書いてあったんですが、色々と問題点が残っているみたいで。

ちょうど問題点をリストアップしてくれている人もいますので、

次回からはそれらを修正しながら、プログラムがどのように動いているか見ていくことにします。

ここではとりあえずソースコードをのぞいてみましょう。

長いので、ここには貼りません。リンクからコードを見てみてください。

ソースコードを見てみる

コードは大きく二つのパートに分けられます。

ゲームの進行を制御するパートと、駒の動きを定義するパートです。

  • ゲームの進行制御

    Game クラス オブジェクトの型、設計図のようなもの の内部に様々な メソッド クラス内で定義される関数のようなもの が入っていますね。

    placePiecesで盤面に駒を配置し、

    mainが全体の流れを制御しているようです。

    isCheckはキングがチェックされているかどうかを返し、

    canSeeKingが誰かがキングを攻撃しているかどうかを返します。

    parseInputはキーボード入力を受け付け、

    printBoardで盤面の絵をプリントしています。

  • 駒の動きの定義

    各駒のクラスと、それらの 基底クラス 継承元のクラス
    親クラス
    Pieceがメインです。

    各駒のクラスは共通してavailableMovesメソッドを持ち、移動可能な位置を出力しています。

    ポーンはちょっとややこしそう。

    Pieceでは 属性 オブジェクトが参照できるデータや処理 を付与し、各駒のavailableMovesで使うためのメソッドが用意されています。

    ランナー(特定の方向に一直線に進む駒)をつくったり、味方駒は攻撃しないけど敵駒は攻撃できるようにしたり、などですね。


GameplacePiecesで、各駒のクラスをもとに駒をオブジェクトとして生成しています。

盤面は、駒の位置を表す二要素 タプル 多数のデータを格納する、要素が変更不可能な構造 をキーに、駒オブジェクトを値にとった 辞書 キーと値が1対1に対応する形でまとめられた構造 として表現されています。

なぜタプルかというと、タプルは イミュータブルimmutable 要素が変更不可能であること なので、辞書のキーとして使えるから。

それと辞書のキーは重複指定不可能なので、盤面上のひとつのマスにはひとつの駒しか乗らないのをうまく利用しているようです。


機能を拡張するには、オリジナルをよく知ることが大切だと思っていますので、

次回から、問題点を修正しつつ仕組みを理解していきます!