Python でつくるガイスター、連載第 2 回です。
は pygame の導入とテキスト表示をしました。今回は駒の配置を決める画面の残りの要素を描画していきます。
ガイスターでの駒の開始時の並べ方はプレイヤーが自由に決めることができますが、
その位置は赤と青の 4 つずつを手前の 8 マスの中と決まっています。
8 マスを表すグリッドを描き、左クリックで赤、右クリックで青の駒をクリックしたマスに入れていくことにします。
グリッド
まずマスを表すグリッドを描画します。
グリッド描画はゲーム本番のマス目の描画にも使いたいので関数としました。
ベクトルの計算がやりやすいように NumPy を使用します。
定数は別モジュールにまとめておきます。
config.py1import numpy as np23# ウィンドウサイズ4DISP_SIZE = (600, 600)5# 色の設定6IVORY = (240, 227, 206)7BLACK = (0, 0, 0)8# マスの大きさ9SQUARE_SIZE = 9010# マージン幅11MARGIN = (np.asarray(DISP_SIZE) - 6*SQUARE_SIZE)/2
draw.py1import numpy as np23from config import *45def _grid(screen, coord, col, row):6'''7一辺が SQUARE_SIZE のマスのグリッドを描く89screen : pygame.display.set_mode10coord : tuple <- (int, int)11左上の座標12col : int13列数14row : int15行数16'''17_coord = np.asarray(coord)18for i in range(row+1):19pygame.draw.line(screen, BLACK,20_coord + (0, SQUARE_SIZE*i),21_coord + (SQUARE_SIZE*col, SQUARE_SIZE*i), 2)22for i in range(col+1):23pygame.draw.line(screen, BLACK,24_coord + (SQUARE_SIZE*i, 0),25_coord + (SQUARE_SIZE*i, SQUARE_SIZE*row), 2)2627def setup(screen, font, turn):28...29_text = font.render(30('先' if turn == 1 else '後') + '攻の駒の配置を決めてね(↓自分側 ↑相手側)',31True, BLACK)32screen.blit(_text, (20, 20))33_grid(screen, MARGIN + SQUARE_SIZE + (0, SQUARE_SIZE), 4, 2)
線分の描画にはpygame.draw.line
を使います。
引数はスクリーン、色、端点の座標、もう片方の端点の座標、太さです。
これで次のようになります。
駒
次に指定の色の駒を指定の位置に描く関数を定義します。
駒は三角形として描画します。
相手の駒なら逆三角形です。
config.py1...2# ウィンドウサイズ3DISP_SIZE = (600, 600)4# 色の設定5IVORY = (240, 227, 206)6RED = (200, 0, 0)7BLUE = (0, 0, 200)8BLACK = (0, 0, 0)9# マスの大きさ10SQUARE_SIZE = 9011# マージン幅12MARGIN = (np.asarray(DISP_SIZE) - 6*SQUARE_SIZE)/213# 駒の大きさ14PIECE_SIZE = 60
draw.py1...2def _piece(screen, color, pos, rev=False):3'''4駒を描画する56screen : pygame.display.set_mode7color : tuple <- (int, int, int)8駒の色9pos : tuple <- (int, int)10盤面上の駒の位置11rev : bool12上下反転して表示する13'''14_padding = (SQUARE_SIZE - PIECE_SIZE)/215_coord = np.asarray(pos)*SQUARE_SIZE + MARGIN + _padding16if rev:17_points = [_coord,18_coord + (PIECE_SIZE, 0),19_coord + (PIECE_SIZE/2, PIECE_SIZE)]20else:21_points = [_coord + (0, PIECE_SIZE),22_coord + (PIECE_SIZE, PIECE_SIZE),23_coord + (PIECE_SIZE/2, 0)]24pygame.draw.polygon(screen, color, _points)
pygame.draw.polygon
で多角形を描画できます。
ためしに一か所に赤駒を置いてみます。
draw.py1def setup(screen, font, turn):2...3_text = font.render(4('先' if turn == 1 else '後') + '攻の駒の配置を決めてね(↓自分側 ↑相手側)',5True, BLACK)6screen.blit(_text, (20, 20))7_grid(screen, MARGIN + SQUARE_SIZE + (0, SQUARE_SIZE), 4, 2)8_piece(screen, RED, (3, 2))
ボタン
配置を決定したあとに押す確定ボタンを描きます。
draw.py1...2def _button(screen, font, coord, size, text, disabled=True):3'''4ボタンを描画する56screen : pygame.display.set_mode7font : pygame.font.SysFont8フォント9color : tuple <- (int, int, int)10背景色11coord : tuple <- (int, int)12左上の座標13size : tuple <- (int, int)14横、縦のサイズ15text : str16中身のテキスト17disabled : bool18押せなくする19'''20_color = (160, 140, 120) if disabled else (200, 180, 160)21screen.fill(_color, (*coord, *size))22_text = font.render(text, True, BLACK)23_fsize = np.asarray(font.size(text))24screen.blit(_text, coord + (size-_fsize)/2)2526def setup(screen, font, turn):27...28_text = font.render(29('先' if turn == 1 else '後') + '攻の駒の配置を決めてね(↓自分側 ↑相手側)',30True, BLACK)31screen.blit(_text, (20, 20))32_grid(screen, MARGIN + SQUARE_SIZE + (0, SQUARE_SIZE), 4, 2)33_button(screen, font, (500, 530), (80, 50), 'OK')
fill
は矩形を描くメソッドです。
size
メソッドはテキストに必要な幅と高さを返します。
これを使ってテキストをボタンの中央に配置しています。
disabled
という引数をとっているのは、すべてを配置するまでボタンを押せないようにするため、
それを視覚的に示すためです。
ついでに左クリックで赤、右クリックで青の駒が配置できることを説明するテキストを加えておきます。
これ表示するものはすべて表示できました。
は駒をグリッドの中にマウス操作で入れていけるようにします。お読みいただきありがとうございました。
では