ガイスターアプリ開発(1) 導入・駒を配置する画面(テキスト)

ガイスターというボードゲームがあります。

お互いが相手の駒が何かわからない状態で取り合うという心理戦の側面を兼ねたゲームです。

「いいオバケ」(青)と「悪いオバケ」(赤)の 2 種類の駒を手前の 8 マスに 1 個ずつ好きな順に配置できます。

相手の青を全部取るか、自分の赤を全部取らせるか、自分の青を相手の陣地の特定のマスから外に出すことが勝利の条件となります。


今回からこのガイスターを Python と pygame を使って作っていく様子を連載したいと思います。

pygame について役に立つ日本語のサイトがあります。

【Pygame入門】ゲームプログラミング【Python】 | 西住工房


pygame のインストール・画面表示

まずは pygame をインストールします。

$ pip install pygame

これでimport pygameして使えるようになります。


ウィンドウを表示するコードは以下のようになります。

main.py
1
import sys
2
3
import pygame
4
from pygame.locals import *
5
6
# ウィンドウサイズ
7
DISP_SIZE = (600, 600)
8
9
# 色の設定
10
IVORY = (240, 227, 206)
11
12
def main():
13
pygame.init() # 初期化
14
screen = pygame.display.set_mode(DISP_SIZE) # 画面作成
15
pygame.display.set_caption('Geister') # タイトルバーの表示
16
17
while True:
18
screen.fill(IVORY) # 背景色塗りつぶし
19
pygame.display.update() # 画面更新
20
21
# イベントハンドリング
22
for event in pygame.event.get():
23
# 閉じるボタン
24
if event.type == QUIT:
25
pygame.quit() # pygame 終了
26
sys.exit() # プログラム終了
27
28
if __name__ == '__main__': main()

ところでset_modeの第二引数にFULLSCREENを指定するとフルスクリーン表示できます。

コマンドライン引数を受け付けて表示変更できるようにすると、このようになります。

main.py
1
...
2
def main():
3
pygame.init()
4
args = sys.argv
5
_flag = FULLSCREEN if len(args) == 2 and args[1] == 'f' else 0
6
screen = pygame.display.set_mode(DISP_SIZE, _flag)
7
...

これでpy main.py fのようにするとフルスクリーンになります。


駒配置画面の作成

ゲームを始める前に駒をどのように配置するか、それぞれのプレイヤーに決めてもらうための画面を作ります。

いろいろ描くので、ひとつの関数にまとめて別のモジュールに置きます。

draw.py
1
import pygame
2
from pygame.locals import *
3
4
def setup():
5
pass
main.py
1
...
2
import draw
3
...
4
def main():
5
...
6
while True:
7
screen.fill(IVORY)
8
draw.setup()
9
pygame.display.update()

テキストを描画

駒の配置を決めてほしい旨をテキストとして画面上に描いてみます。

pygame ではテキストに日本語フォントを使うこともできます。

使用できるフォントの一覧はprint(pygame.font.get_fonts())で表示できます。

テキストを描くには、まずフォントを指定して、renderメソッドで内容を指定し、

blitメソッドで位置を指定します。

main.py
1
...
2
def main():
3
...
4
font = pygame.font.SysFont('hg丸ゴシックmpro', 16)
5
6
while True:
7
...
8
draw.setup(screen, font, 1)
9
...
draw.py
1
...
2
def setup(screen, font, turn):
3
'''
4
screen : pygame.display.set_mode
5
font : pygame.font.SysFont
6
フォント
7
turn : int
8
先攻(0)か後攻(1)か
9
'''
10
assert turn == 0 or turn == 1, 'draw.setup の引数 turn は 0, 1 の値を取ります'
11
_text = font.render(
12
('先' if turn == 1 else '後') + '攻の駒の配置を決めてね(↓自分側 ↑相手側)',
13
True, (0, 0, 0))
14
screen.blit(_text, (20, 20))

ここまででプログラムを起動するとこのようになります。

テキスト表示

はグリッドや決定ボタンの描画をしていきます。

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

では👋