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

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

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

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

PyGameについて

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

  • PyGameのWebサイト

    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のマニュアル

    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(マイナビ出版)」など。