Python でつくるガイスター、連載第 5 回です。
は初期盤面を生成して描画しました。今回は駒の移動とターン交代の画面を用意します。
ガイスターでは相手の駒が見えてはいけないので、
ターン交代のたびに引継ぎのための画面を表示します。
駒の移動
駒をクリックしたときに行先を表示し、それをクリックするとその場所に移動するようにします。
まずは行先を表す円を描画します。
draw.py1...2def dest(screen, pos, board):3'''4駒の行先を円で表示する56screen : pygame.display.set_mode7pos : tuple <- (int, int)8駒の位置9board : dict <- {(int, int): Piece}10駒の位置とオブジェクト11'''12for _pos in board[pos].covering_squares(pos):13# 自分の駒を除外14if not (tuple(_pos) in board and board[tuple(_pos)].side == board[pos].side):15_coord = np.asarray(_pos)*SQUARE_SIZE + MARGIN + SQUARE_SIZE/216pygame.draw.circle(screen, LAWNGREEN, [int(c) for c in _coord], int(PIECE_SIZE/2))17...
LAWNGREEN
は色の定数で、定数をまとめてある別モジュールに定義してあります。
pygame.draw.circle
の引数には中心の座標と半径を指定します。
これを、駒をクリックしたときに表示します。
main.py1...2def main(screen, font, font_small, orders, move_snd):3# ボード描画に渡すパラメータ4# 0 - 先攻, 1 - 後攻, 2 - 終了後5_turn = 06# マウス選択中の駒の位置7_selecting_pos = None8# 動かし終わった9_move_finished = False10...1112while True:13screen.fill(IVORY)14# 盤面15draw.board(screen, _board, _turn)16if _selecting_pos is not None:17# 行先18draw.dest(screen, _selecting_pos, _board)19pygame.display.update()2021# イベントハンドリング22for event in pygame.event.get():23...24# マウスクリック25if event.type == MOUSEBUTTONDOWN:26# 左27if event.button == 1:28_mouse_pos = event.pos29_square_pos = tuple(mouse.chcoord(_mouse_pos))30if _move_finished: continue31if _square_pos in _board and _board[_square_pos].side == _turn:32# 駒を選択したとき33_selecting_pos = _square_pos34else:35# 行先を選択したとき36if (_selecting_pos in _board37and _square_pos in _board[_selecting_pos].covering_squares(_selecting_pos)):38# 駒の移動39move_snd.play()40_board[_square_pos] = _board[_selecting_pos]41del _board[_selecting_pos]42# 移動完了43_move_finished = True44_selecting_pos = None45...
ターン交代
次にターン交代の画面を用意します。
まずは引継ぎ画面を描画する関数を定義します。
draw.py1...2def confirmation(screen, font, font_small, turn):3'''4手番交代の確認画面を表示する56screen : pygame.display.set_mode7font, font_small : pygame.font.SysFont8フォント9turn : int <- 0 | 1100 - 次は先攻, 1 - 次は後攻11'''12assert turn == 0 or turn == 1, 'draw.confirmation の引数 turn は 0, 1 の値を取ります'13screen.fill(WHITE, (*MARGIN, 6*SQUARE_SIZE, 6*SQUARE_SIZE))14_str1 = ('先' if turn == 0 else '後') + '攻のターンだよ'15_str2 = '画面をクリックしてね'16_str3 = '動かし終わったらスペースキーを押してね'17_text1 = font.render(_str1, True, BLACK)18_text2 = font.render(_str2, True, BLACK)19_text3 = font_small.render(_str3, True, BLACK)20screen.blit(_text1, DISP_SIZE/2-(len(_str1)*32/2, 32))21screen.blit(_text2, DISP_SIZE/2-(len(_str2)*32/2, -32))22screen.blit(_text3, DISP_SIZE/2-(len(_str3)*16/2, -32*4))23...
盤面を白い矩形で覆い隠し、その上にテキストを描いています。
プレイヤーは駒を動かし終わったらスペースキーを押してこの画面を表示し、
もう一方のプレイヤーが画面をクリックするとそのプレイヤーに交代することになります。
game.py1...2def main(screen, font, font_small, orders, move_snd, chturn_snd):3# ボード描画に渡すパラメータ4# 0 - 先攻, 1 - 後攻, 2 - 終了後5_turn = 06# 次の番を確認する画面を表示するときに渡すパラメータ7# 0 - 先攻, 1 - 後攻, 2 - なし8_next = 09...1011while True:12...13if _next == 0 or _next == 1:14# 交代確認画面15draw.confirmation(screen, font, font_small, _next)16...1718# イベントハンドリング19for event in pygame.event.get():20...21# マウスクリック22if event.type == MOUSEBUTTONDOWN:23# 左24if event.button == 1:25_mouse_pos = event.pos26_square_pos = tuple(mouse.chcoord(_mouse_pos))27# 確認画面のクリック28if _next == 0 or _next == 1:29_next = 230continue31...32# キー33if event.type == KEYDOWN:34...35# Space キー36if event.key == K_SPACE:37if _move_finished:38# ターン交代39chturn_snd.play()40_turn = (_turn+1)%241_next = _turn42_move_finished = False43...
ゲーム開始直後も確認画面を表示するために、_next = 0
としています。
は勝利条件を判定して、勝者を表示するところまでやりたいと思います。
読んでくださってありがとうございました。
では