ゼロからはじめるPython 第90回 Pythonのゲーム開発ライブラリPyGameを使ってみよう
○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(マイナビ出版)」など。
今回はちょっと実用処理から離れてPythonでゲームを作ってみよう。Pythonにはさまざまなライブラリが用意されており、その中にはゲーム開発に特化したライブラリもある。今回は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(マイナビ出版)」など。