Python プログラムで動かすフェアリーチェスアプリ開発、連載第 13 回です。
はチェスの特殊ルールのひとつ、キャスリングを実装しました。これで通常のチェスは問題なくできるようになったので、今回はコードの整形をしていきます。
駒クラスのコンストラクタの引数
現時点では、駒の生成時に色と名前を指定しています。
ところが、駒の名前(name)は駒の色の情報(color)と駒の省略表記(abbr)の組み合わせから成り立っています。
そのため、駒の名前を別個で定義する必要はありません。
pieces.py1class Piece:2def __init__(self, color, name):3def __init__(self, color):4self.name = name5self.position = None6self.color = color7self.name = color + self.abbr8...9...1011class Pawn(Piece):12...13def __init__(self, color, name, direction):14def __init__(self, color, direction):15self.name = name16self.color = color17self.direction = direction18self.name = color + self.abbr19...
これによって、駒インスタンス生成時の引数がひとつ減って、色だけになります。
コードを圧縮
定義されてはいるものの明らかに使われていないコードがあるので削除します。
pieces.py1class Piece:2...3def is_valid(self, startpos, endpos, color, gameboard):4if endpos in self.available_moves(startpos[0], startpos[1], gameboard, color=color):5return True6return False7...8def available_moves(self, x, y, gameboard, color):9print("ERROR: no movement for base class")10...11...1213...14def available_moves(self, x, y, gameboard, color=None):15def available_moves(self, x, y, gameboard):16if color is None:17color = self.color18...
available_moves()
は各駒のクラス内で定義されているので、親クラスのPiece
内部で定義する必要はありません。
駒のクラス内でavailable_moves()
を定義しなかった場合にこのコードが作動するのだと思いますが、それはすぐに気づくことだと思います。
あと、available_moves()
の引数のcolor
にはつねにself.color
が使われているので、
引数にとる必要がないということで削除しています。
また、is_valid()
は他には1箇所にしか使われていないので、available_moves()
で代用してしまいます。
main.py1def can_see_king(self, kingpos, piecelist, gameboard):2...3for piece, position in piecelist:4if piece.is_valid(position, kingpos, piece.color, gameboard):5if kingpos in piece.available_moves(*position, gameboard):6return True
変数名・関数名の変更
変数名・関数名キャメルケースをスネークケースに変更し、一部はわかりやすい名前に変更します。
knightList()
はleaper()
にします。
(フェアリーチェスの世界では、ナイトのように駒を跳び越すことができる駒を leaper といいます。)
駒色の変数名
駒色はもともと、WHITE = "W", BLACK = "B"
と変数として定義されていて、これが使われているのですが、
変数の名前は1文字にしてもよく、そのほうが簡単なので、これを変更します。
pieces.py1WHITE = "W"2W = "W"3BLACK = "B"4B = "B"5...6class Pawn(Piece):7...8def available_moves(self, x, y, gameboard, color=None):9...10if (((self.color == WHITE and y == 1)11if (((self.color == W and y == 1)12or (self.color == BLACK and y == 6))13or (self.color == B and y == 6))14and (x, y + 1*self.direction) not in gameboard15and (x, y + 2*self.direction) not in gameboard):16answers.append((x, y + 2*self.direction))17...
main.py
でも変更を反映させます。
ちょっとしたことですが、開発のしやすさが変わってくると思います。
自分で0からやるなら、最初からある程度ルールをきめてコーディングをするといいのかもしれませんね。
はいよいよフェアリーチェスの実装に入っていきます!お読みいただきありがとうございました。
ではまた