チェスアプリ開発(13) コードの整形

Python プログラムで動かすフェアリーチェスアプリ開発、連載第 13 回です。

はチェスの特殊ルールのひとつ、キャスリングを実装しました。

これで通常のチェスは問題なくできるようになったので、今回はコードの整形をしていきます。


駒クラスのコンストラクタの引数

現時点では、駒の生成時に色と名前を指定しています。

ところが、駒の名前(name)は駒の色の情報(color)と駒の省略表記(abbr)の組み合わせから成り立っています。

そのため、駒の名前を別個で定義する必要はありません。

pieces.py
1
class Piece:
2
def __init__(self, color, name):
3
def __init__(self, color):
4
self.name = name
5
self.position = None
6
self.color = color
7
self.name = color + self.abbr
8
...
9
...
10
11
class Pawn(Piece):
12
...
13
def __init__(self, color, name, direction):
14
def __init__(self, color, direction):
15
self.name = name
16
self.color = color
17
self.direction = direction
18
self.name = color + self.abbr
19
...

これによって、駒インスタンス生成時の引数がひとつ減って、色だけになります。


コードを圧縮

定義されてはいるものの明らかに使われていないコードがあるので削除します。

pieces.py
1
class Piece:
2
...
3
def is_valid(self, startpos, endpos, color, gameboard):
4
if endpos in self.available_moves(startpos[0], startpos[1], gameboard, color=color):
5
return True
6
return False
7
...
8
def available_moves(self, x, y, gameboard, color):
9
print("ERROR: no movement for base class")
10
...
11
...
12
13
...
14
def available_moves(self, x, y, gameboard, color=None):
15
def available_moves(self, x, y, gameboard):
16
if color is None:
17
color = self.color
18
...

available_moves()は各駒のクラス内で定義されているので、親クラスのPiece内部で定義する必要はありません。

駒のクラス内でavailable_moves()を定義しなかった場合にこのコードが作動するのだと思いますが、それはすぐに気づくことだと思います。

あと、available_moves()の引数のcolorにはつねにself.colorが使われているので、

引数にとる必要がないということで削除しています。


また、is_valid()は他には1箇所にしか使われていないので、available_moves()で代用してしまいます。

main.py
1
def can_see_king(self, kingpos, piecelist, gameboard):
2
...
3
for piece, position in piecelist:
4
if piece.is_valid(position, kingpos, piece.color, gameboard):
5
if kingpos in piece.available_moves(*position, gameboard):
6
return True

変数名・関数名の変更

変数名・関数名キャメルケースをスネークケースに変更し、一部はわかりやすい名前に変更します。

knightList()leaper()にします。

(フェアリーチェスの世界では、ナイトのように駒を跳び越すことができる駒を leaper といいます。)


駒色の変数名

駒色はもともと、WHITE = "W", BLACK = "B"と変数として定義されていて、これが使われているのですが、

変数の名前は1文字にしてもよく、そのほうが簡単なので、これを変更します。

pieces.py
1
WHITE = "W"
2
W = "W"
3
BLACK = "B"
4
B = "B"
5
...
6
class Pawn(Piece):
7
...
8
def available_moves(self, x, y, gameboard, color=None):
9
...
10
if (((self.color == WHITE and y == 1)
11
if (((self.color == W and y == 1)
12
or (self.color == BLACK and y == 6))
13
or (self.color == B and y == 6))
14
and (x, y + 1*self.direction) not in gameboard
15
and (x, y + 2*self.direction) not in gameboard):
16
answers.append((x, y + 2*self.direction))
17
...

main.pyでも変更を反映させます。


ちょっとしたことですが、開発のしやすさが変わってくると思います。

自分で0からやるなら、最初からある程度ルールをきめてコーディングをするといいのかもしれませんね。

はいよいよフェアリーチェスの実装に入っていきます!

お読みいただきありがとうございました。

ではまた👋