Python でつくるガイスター、連載第 6 回です。
は駒の移動と手番の交代を実装しました。今回は勝敗の判定と表示をしていきます。
勝敗判定
勝敗の条件を関数で定義します。
game.py1...2def win_req(taken, board, side, moved):3'''4side が勝利条件を満たすか5-> bool67taken : list <- [{'R': int, 'B': int}]8取った駒9board : dict <- {(int, int): Piece}10ゲームボード11side : int <- 0 | 112先攻(0), 後攻(1)13moved : bool14side が今駒を動かしたか15'''16assert side == 0 or side == 1, 'game.win_req の引数 side は 0, 1 の値を取ります'17if not moved:18# 赤を4つ取らせた19if taken[(side+1)%2]['R'] == 4:20return True21else:22# 青を4つ取った23if taken[side]['B'] == 4:24return True25# 青が盤外に出た26if side == 0 and ((0, -1) in board or (5, -1) in board):27return True28if side == 1 and ((0, 6) in board or (5, 6) in board):29return True30...31def main(screen, font, font_small, orders, move_snd, chturn_snd):32...33# 取った駒 [{'R': int, 'B': int}]34_taken_pieces = [{'R': 0, 'B': 0}, {'R': 0, 'B': 0}]35# 勝者36# 0 - 先攻, 1 - 後攻37_winner = -138...
取った駒の色とその数を変数_taken_pieces
に代入して、引数に渡します。
判定のタイミングは、駒を動かし終わったときにしますので、
マウスイベントの内部です。
game.py1...2def main(screen, font, font_small, orders, move_snd, chturn_snd, win_snd):3...4while True:5...6# イベントハンドリング7for event in pygame.event.get():8...9# マウスクリック10if event.type == MOUSEBUTTONDOWN:11# 左12if event.button == 1:13...14if _square_pos in _board and _board[_square_pos].side == _turn:15# 駒を選択したとき16_selecting_pos = _square_pos17else:18# 行先を選択したとき19if (_selecting_pos in _board20and _square_pos in _board[_selecting_pos].covering_squares(_selecting_pos)):21# 行先が相手の駒のとき22if _square_pos in _board and _board[_square_pos].side != _turn:23_taken_pieces[_turn][_board[_square_pos].color] += 124# 駒の移動25move_snd.play()26_board[_square_pos] = _board[_selecting_pos]27del _board[_selecting_pos]28# 移動完了29_move_finished = True30# 勝利判定31if win_req(_taken_pieces, _board, _turn, True):32win_snd.play()33_winner = _turn34if win_req(_taken_pieces, _board, (_turn+1)%2, False):35win_snd.play()36_winner = (_turn+1)%237_selecting_pos = None38...
自分が駒を動かした瞬間に相手が勝つ場合(相手の悪いおばけをすべて取ったとき)もあるので、
条件分岐は2つになっています。
画面に勝者を表示
次に勝敗が決まったときに画面に結果を表示します。
表示するものを関数で定義します。
draw.py1...2def win_message(screen, font, side):3'''4勝敗の結果を知らせるメッセージを表示する56screen : pygame.display.set_mode7font : pygame.font.SysFont8フォント9side : int <- 0 | 110'''11assert side == 0 or side == 1, 'draw.win_message の引数 side は 0, 1 の値を取ります'12_str = ('先' if side == 0 else '後') + '攻の勝ち!'13_text = font.render(_str, True, BLACK)14_margin = (DISP_SIZE-(3*SQUARE_SIZE, SQUARE_SIZE))/215screen.fill(WHITE, (*_margin, 3*SQUARE_SIZE, SQUARE_SIZE))16screen.blit(_text, DISP_SIZE/2-(len(_str)*32/2, 32/2))17...
勝者が決まったときにこれを描画します。
さらに、その画面でスペースキーを押すと隠れていたすべての駒の色を表示するようにします。
game.py1...2def main(screen, font, font_small, orders, move_snd, chturn_snd, win_snd):3...4while True:5...6# 盤面7draw.board(screen, _board, _turn)8...9# 勝敗10if _winner == 0 or _winner == 1:11draw.win_message(screen, font, _winner)12...13# イベントハンドリング14for event in pygame.event.get():15...16# キー17if event.type == KEYDOWN:18...19# Space キー20if event.key == K_SPACE:21if _winner >= 0:22# 開示23_winner = 224_turn = 225...
_winner = 2
は勝敗の表示を消すため、
_turn = 2
はすべての駒を開示するためのものです。
これでガイスターが遊べるようになりました!
コードは GitHub からどうぞ。
読んでくれてありがとうございました。
では