○Pythonのゲーム開発ライブラリPyGameを使ってみよう

今回はちょっと実用処理から離れてPythonでゲームを作ってみよう。Pythonにはさまざまなライブラリが用意されており、その中にはゲーム開発に特化したライブラリもある。今回はPyGameと呼ばれるライブラリの使い方を紹介する。PyGameで迷路ゲームを作ってみよう。

PyGameで迷路ゲームを作ったところ

○PyGameについて

今回利用するPyGameはゲーム開発に特化したライブラリだ。クロスプラットフォームに対応しており、Windows/macOS/Linuxでゲームを動かすことができる。SDLというクロスプラットフォームのマルチメディアライブラリをベースに開発されており、高度なゲームを手軽に作れるような仕組みとなっている。

PyGameのWebサイト

PyGameをインストールするには、以下のコマンドを実行する。今回は執筆時点の最新版である2.1.2を指定してインストールしてみよう。

python3 -m pip install pygame==2.1.2

○PyGameはじめの一歩

それでは、PyGameのはじめの一歩として一番簡単なプログラムを作ってみよう。以下のプログラムを「hellogame.py」という名前で保存しておこう。

import sys, random

import pygame

from pygame.locals import *

# ゲーム画面を初期化 --- (*1)

pygame.init()

screen = pygame.display.set_mode((600, 400))

white = (255,255,255)

black = (0,0,0)

# 繰り返し画面を描画 --- (*2)

while True:

# 背景と円を描画 --- (*3)

screen.fill(black) # 背景を黒で塗りつぶす

pygame.draw.circle(screen, white, (300,200), 150) # 円を描画

# 画面を更新 --- (*4)

pygame.display.update()

# 終了イベントを確認 --- (*5)

for event in pygame.event.get():

if event.type == QUIT:

pygame.quit()

sys.exit()

IDLEからプログラムを実行するか、コマンドラインから「python3 hellogame.py」を実行しよう。すると、以下のように円が1つ描画される。

一番簡単なプログラム

正しくプログラムが動いたら、何が書かれているのかプログラムを確認しよう。

(*1)ではゲーム画面を初期化する。(*2)以下の部分では繰り返し画面を描画する。こうして一番簡単なプログラムを見ると分かるのだが、ゲーム画面というのは常に更新されている。それで、while文を使って画面を描画し続けるように指定する必要がある。

(*3)では、背景と円を一つ描画する。(*4)ではupdateメソッドを呼び出して画面の更新を指示する。

なお、ゲームでは画面を描画するのに加えて、キーボードを押したとか、ウィンドウを閉じたなどのイベントを処理する必要がある。そこで、(*5)のように、どんなイベントが起きたのかを確認する処理を入れる。

以上が、PyGameでゲームを作る際の基本となる。画面に円を描くだけの簡単なプログラムだが、PyGameを使う上でポイントとなる要素が含まれていた。これらの基本さえ押さえてしまえば、あとは応用となる。

○PyGameのマニュアルについて

なお、PyGameのマニュアルを見ると、どんなメソッドが用意されているのかを確認できる。例えば上記(*3)の円を描画するcircleメソッドは、「draw」のリンクの中にある。pydraw.drawのページを見ると、長方形を描画するrectメソッド、線を描画するlineメソッドなどが利用可能だと分かる。

PyGameのマニュアル

○迷路ゲームを作ろう

それでは、実際に迷路ゲームを作ってみよう。ここでは、迷路を自動生成する。そして、プレイヤーがその迷路に隠された宝を見つけることを目的としたゲームを作ってみよう。

100行と少し長いので、プログラム全体はこちらのページに配置した。プログラムを「maze.py」という名前で保存したら、次のコマンドを実行しよう。

python3 maze.py

すると、以下のような迷路ゲームの画面が表示される。左上の赤い丸がプレイヤーで、右下のオレンジ色の部分に宝が配置されている。カーソルキーでプレイヤーを動かして宝を目指そう。

迷路ゲームを実行したところ

宝に到達すると、以下のようなメッセージが表示されて、次のステージの異なる迷路が始まるようになっている。

宝を見つけたらゲームクリア

それでは、少しずつプログラムを確認してみよう。プログラムの冒頭で変数の初期化をしている。この迷路の列数と行数や1ブロックのサイズを増やすことで、より大きな迷路が作成されるようになっている。

maze_w = 31 # 迷路の列数

maze_h = 23 # 迷路の行数

maze = [] # 迷路データ

tile_w = 16 # 迷路の1ブロックのサイズ

それから、26行目(*1)の部分でmake_maze関数を定義している。この関数では、棒倒し法と呼ばれる迷路の自動生成アルゴリズムを利用して、自動で迷路を作成する。なお、棒倒し法について詳しい解説が、こちらに書かれているので参考にして欲しい。

そして、56行目(*2)のcheck_key関数で、プレイヤーの移動処理を以下のように定義している。これは、プログラムの(*3)の部分にあるメインループ中で、イベントを確認する(*5)でキーボードが押された時に行う処理だ。

押されたカーソルキーの左右上下(K_LEFT/K_RIGHT/K_UP/K_DOWN)を確認して、プレイヤーの座標(px, py)を変更する。そして、迷路データmazeを確認して壁ならば移動前に戻すようにしている。

# プレイヤーの移動を確認 --- (*2)

def check_key(key):

global px, py

old_x, old_y = px, py

if key == K_LEFT:

px -= 1

elif key == K_RIGHT:

px += 1

elif key == K_UP:

py -= 1

elif key == K_DOWN:

py += 1

if maze[py][px] == 2: # ゴール?

messagebox.showinfo("ゴール", "宝を見つけた")

make_maze()

if maze[py][px] != 0: # 壁ならばプレイヤーの位置を戻す

px, py = old_x, old_y

... 省略 ...

# ゲームのメインループ --- (*3)

while True:

... 省略 ...

# イベントを処理する --- (*5)

for event in pygame.event.get():

... 省略 ...

if event.type == KEYDOWN: check_key(event.key)

なお、迷路データmazeを画面に描画する処理は、ゲームのメインループ(*3)の中にある。83行目の(*4)で迷路を描画する。次のような処理となっている。これを見ると分かるが、for文を使って縦方向(y)と横方向(x)に一つずつ描画するようになっていることが分かるだろう。なお、ブロックの描画には、長方形を描画するrectメソッドを使った。

# ゲームのメインループ --- (*3)

while True:

# 迷路を描画する --- (*4)

screen.fill(black)

for y in range(0, maze_h):

for x in range(0, maze_w):

v = maze[y][x]

xx = tile_w * x

yy = tile_w * y

pygame.draw.rect(screen,

maze_color[v],

(xx,yy,xx+tile_w,yy+tile_w))

○まとめ

以上、今回は、PyGameの基本的な使い方について紹介し、実際に簡単な迷路ゲームを作ってみた。PyGameはその基本さえ押さえてしまえば、非常に手軽にゲームの開発が可能だ。ここで作成した迷路ゲームは100行ほどなので、プログラム全体を追いかけるのもそれほど大変ではないと思う。

ゲーム開発は、プログラミング技術の向上にも役立つ。楽しみながら、プログラミングスキルを磨くのにぴったりの題材だ。本稿の解説を参考に、一つ一つの処理を確認しつつ、自分でゼロから作ってみると良いだろう。

自由型プログラマー。くじらはんどにて、プログラミングの楽しさを伝える活動をしている。代表作に、日本語プログラミング言語「なでしこ」 、テキスト音楽「サクラ」など。2001年オンラインソフト大賞入賞、2004年度未踏ユース スーパークリエータ認定、2010年 OSS貢献者章受賞。技術書も多く執筆している。直近では、「シゴトがはかどる Python自動処理の教科書(マイナビ出版)」「すぐに使える!業務で実践できる! PythonによるAI・機械学習・深層学習アプリのつくり方 TensorFlow2対応(ソシム)」「マンガでざっくり学ぶPython(マイナビ出版)」など。