リファクタリングをPythonで実践!基本手法とコード例・注意点まで
- 1. Pythonでゲームは作れるの?
- 2. Pythonで作られたゲーム事例
- 3. Pythonでゲームを作る方法
- 4. Pythonでゲームを作るのに役立つライブラリやゲームエンジン
- 5. 実際にPythonで2Dゲームを作ってみよう
- 6. Pythonを使ったゲーム作りに役立つ書籍
1. Pythonでゲームは作れるの?
そもそも、ゲームを一個人が作ることは可能なのでしょうか? 実はNintendo Switchは SmileBASIC、 PlayStation4はPlayStation Shader Language(PSSL)と、現在は一般の人でもゲームを作成できる環境が一部の企業からは提供されています。
しかし、SmileBASICもPSSLも普段私たちが使う言葉や文章構成とは異なるため、コードを読むのも書くのも慣れるまでに時間がかかります。
それに比べてPythonは、日常私たちが使う言葉や文章構成に近いところもあり、若い方やプログラミング初心者の方でも理解しやすい言語として人気があります。
そしてPythonもSmileBASICやPSSL同様にルールに従った処理を実行できますので、Pythonでゲームを作成することは可能です。
自分のパソコン上でゲームをしたり、Webページにゲームを公開したり、ラジコンやドローン、そしてロボティクスなど、Pythonを使って様々なゲームを楽しむことができるのです。
①Pythonでゲームを作るメリット
Pythonでゲームを作るメリットにはどのようなものがあるでしょうか?
(1)比較的簡単にゲームを作成できる
本格的なゲームは、一般的にC言語などを用いて開発されます。C言語を利用しようと思うと、開発環境の構築から、プログラムの作成、コンパイル、実行と簡単なゲームを実行するにも手間がかかります。
それに比べてPythonは、Microsoft Storeから数回のクリックでインストールでき、コンパイルも不要。初心者の方でも比較的簡単にゲームを実行することができるでしょう。
(2)わからないときに参照できる情報が多い
自分で何かを作るときには必ずと言っていいほど「わからない」という問題に遭遇します。C言語などは各企業のゲーム開発で利用されているため、守秘義務の関係で私たちが手にできる情報は少ないです。
一方Pythonは、有志の方によってたくさんのサンプルコードやQ&Aが公開されています。「わからない」という時も、自分で調べたり尋ねたりできる環境が用意されているのです。
(3)配布がしやすい
そしてPythonで作ったゲームは、他のパソコンでも実行できるようにパッケージ化したり、Webページに公開が可能です。AndroidやiPhoneにもゲームアプリとして公開することも、理論上は可能です*1。
自分のパソコンでのみ実行するのであればゲームの配布にかかる費用はありませんし、Web上で公開する場合もドメインとサーバー代ぐらいで済みます*2。
簡単にプログラムを作成でき、困った時の環境もある、そして様々な形態でコストを抑えてゲームを配布できる、さらにPythonのプログラミングスキルも身に付く、これらがPythonでゲームを作るメリットといえるでしょう。
またPythonの場合は、AI(人工知能)や画像解析の要素もゲームに加えることができますので、「囲碁最強のAI、AlphaGoに勝てるか!?」や「ダンス採点ゲーム」といった今世の中にないゲームを作ることも不可能ではありません*3。
※1 WebView機能によってアプリ内でWebページを表示することで可能。もしくはKivyなどのゲームエンジンを利用。
※2 パソコンのGUIに依存するゲームは、Webで公開できません。
※3 Python用ライブラリ AlphaZeroやOpenCV、TensorFlowなどの使用が想定されます。
②ゲームを作るのに向いている言語や環境
Python以外のゲーム開発言語や環境についてご紹介します。
(1)C#
Microsoftによって開発されたC#は、ゲームエンジンのUnityやMonoGameなど多くの開発環境で利用されています。スマホのアプリについてもXamarinを利用すれば、iPhone、Android両方のアプリをC#一つの言語で開発可能。ただし、Pythonと比べると情報量が少ないので、問題解決に時間がかかりがちです。
(2)C++
1985年から利用されているC++は、プログラムの処理速度が早いことに定評があり、シューティングゲームやレースゲームなどハイスピード処理を伴うゲーム開発で利用されます。3DゲームエンジンのUnrealEngineが採用しているプログラミング言語としても有名です。
※C#とC++の処理速度比較
https://stackoverflow.com/questions/138361/how-much-faster-is-c-than-c
(3)Unity
Unityはゲームエンジンの中でも人気のある無料ソフトで、Windows、Macの両方でC#を使ってゲーム開発を実行できます。
2D、3D、AR、VRのゲームを作成し、ゲーム内課金にも対応できる実用的なゲームエンジンになります。
2.Pythonで作られたゲーム事例
実際にPythonで作られたゲーム事例をいくつかご紹介します。
・2Dゲーム Super Potato Bruh($3.99)
・3Dゲーム パイレーツ・オブ・カリビア オンライン($0)
・シンプルなオセロ
Super Potato Bruhは、横スクロールゲームの定番スーパーマリオを彷彿させるような2Dゲーム。PythonライブラリのPygameを使って作成されています。
パイレーツ・オブ・カリビア オンラインは、本格的なグラフィックスと動きが特徴的な3Dゲーム。ゲームエンジンのPanda3Dを使用して作られています。
オセロは、ゲームの基本を理解するのに役立ちます。AlphaZeroなどのAI処理を含めると面白いゲームになりそうです。
3.Pythonでゲームを作る方法
実際にPyhtonでゲームを作る方法を3つご紹介します。
①ライブラリを使う
ゲーム作成に必要な画像描画や動き・変化・文字の表示などは、ライブラリを使用すると処理が簡素化されます。1ゲームに使用するゲーム・ライブラリは、基本的に1つ選択します。コードも読みやすくなり、ゲーム開発には欠かせない要素となるでしょう。
②ゲームエンジンを使う
ライブラリより機能が充実しているものがゲームエンジンです。デスクトップやAndroid、iOSアプリとして出力してくれるものもあります。ライブラリと似た機能を持つ場合もありますので、できるだけ重複しないように選定時は注意しましょう。
③コードを書く
ゲーム用のライブラリやエンジンを使用しなくても、Pythonでゲームは楽しめます。こちらのポケモンゲームはPythonで作られていて、水タイプや草タイプなどの属性も考慮してポケモンバトルを進められます。これをベースにPokémon APIでポケモンデータをインポートすれば、ポケモンデータを手入力しなくても、たくさんのポケモンでゲームを楽しめますね。
4.Pythonでゲームを作るのに役立つライブラリやゲームエンジン
ゲーム用のPythonライブラリとゲームエンジンを5つずつ紹介します。
①ライブラリ
(1)Pygame
Pygameは、Pythonのゲーム開発で定番のライブラリです。宇宙空間を簡単に描けたり、水面の揺らぎ効果を描画したり、便利な機能が豊富に取り揃えられています。Pythonゲームの参考書でもよく使用されるライブラリですね。
(2)Kivy
Pythonのゲーム・ライブラリで最も人気があるものが、Kivyです。Kivyの特徴は、Pythonで作成したゲームをiPhoneやAndroidでもプレイできる点。KivyのプログラムをiOSやAndroid用に出力し、ネイティブに近い環境でアプリを実行できます。
ただし、高機能な反面、設定コードは他のライブラリに比べて少し多くなります。
(3)Tkinter
Tkinterは、Pyhton3.9などに標準で用意されているライブラリです。パソコンの画面上にウィンドウ枠を作成する際に利用します。
(4)Pyglet
https://github.com/pyglet/pyglet
一見すると(1)のPygameに似ているPygletですが、グラフィック処理が異なります。PygameがSDLという主に2D用画像処理を採用しているのに対して、PygletはOpenGLという3D処理可能なグラフィック処理を採用しています。
(5)Arcade
Arcadeは、Pygameと同じ2Dゲーム用ライブラリです。ただArcadeはOpenGLを採用しているため、Pygameと比べると回転や細かい動きなどの制御を可能にしています。
②ゲームエンジン
(1)Cocos2D
Cocos2Dは、2008年にアルゼンチンで始まったPython用2Dゲームエンジになります。Pygameなどのライブラリと比べると標準で用意されている機能が多く、自分であれこれゲームアクションのプログラムを考えなくてもスムーズに開発できるツールといえるでしょう。
(2)Panda3D
Panda3Dは、アトラクション用画像処理としてディズニーVRスタジオが作成したことが始まりのゲームエンジン。テーマパークのVRライドで使用されたり、オンラインゲームで使用される本格的なゲームエンジです。
(3)Pyxel
https://pypi.org/project/pyxel/
Pyxelは、レトロ調なゲームを作成する場合に適したゲームエンジンです。16色の配色と4音でゲームを構成します。標準で8つのサンプルゲームも用意されていますので、少しスピードや大きさを変えてみるなど、初心者がプログラムに馴染むためにも使えます。
(4)Godot
Godotは、2014年にアルゼンチンのエンジニアによって開発されたオープンソース型の本格的ゲームエンジンです。2D、3D、VRのゲーム開発を可能にし、開発環境もわかりやすく整備されている魅力的なツールになります。
ただし、開発言語はGDScriptというPyhtonとJavaScriptを混ぜたような言語で開発し、専用のSDKを使って開発を行います。
(5)Ren’Py
Ren’Pyは、「恋愛」を元にネーミングされている、ストーリー型ゲームエンジンです。専用のSDKとテキストエディタを使いながらゲームを作成していきます。Ren’Pyで使用する言語は、Ren’Py Language というPythonとは少し違うオリジナルの言語を使用します。
ゲームエンジンの方で画像制御や音声制御等の機能が用意されていますので、Ren’Py Languageが初めてでもスムーズに開発できるでしょう。
5.実際にPythonで2Dゲームを作ってみよう
Python初学者でも比較的読みやすいようクラス構文を使わずに、Windows環境でピンポンゲームを実行するプログラムをご紹介します。
コードは140行近くありますが、ボールとバーの動き、加点の様子などイメージ頂けると思います。
実際にコードをコピー&ペーストしてお試しください。
(前準備)
今回は、turtleというライブラリを使ってゲームを作成します。
まずは仮想環境を作成し、 turtleをインポートしましょう。
PowerShellを開いて、以下のコマンドを実行します。
python -m venv env
env\Scripts\activate
pip install turtle
*pip install turtleの際に、赤文字のエラー文が表示されるかもしれませんが、Python3 をお使いであれば以下のプログラムを問題なく実行できます。
そしてping_pong.pyファイルを作成し、以下のコードをコピー&ペーストします。
import turtle
#ウィンドウの表示
sc = turtle.Screen()
sc.title("Pong game")
sc.bgcolor("white")
sc.setup(width=1000, height=600)
#左側のバー表示
left_pad = turtle.Turtle()
left_pad.speed(0)
left_pad.shape("square")
left_pad.color("black")
left_pad.shapesize(stretch_wid=6, stretch_len=2)
left_pad.penup()
left_pad.goto(-400, 0)
#右側のバー表示
right_pad = turtle.Turtle()
right_pad.speed(0)
right_pad.shape("square")
right_pad.color("black")
right_pad.shapesize(stretch_wid=6, stretch_len=2)
right_pad.penup()
right_pad.goto(400, 0)
#ボールの表示
hit_ball = turtle.Turtle()
hit_ball.speed(40)
hit_ball.shape("circle")
hit_ball.color("blue")
hit_ball.penup()
hit_ball.goto(0, 0)
hit_ball.dx = 5
hit_ball.dy = -5
# 点数初期値
left_player = 0
right_player = 0
#点数表示
sketch = turtle.Turtle()
sketch.speed(0)
sketch.color("blue")
sketch.penup()
sketch.hideturtle()
sketch.goto(0, 260)
sketch.write("左のプレーヤー : 0 右のプレーヤー: 0",
align="center", font=("Courier", 24, "normal"))
#左側のバーの動き
def paddleaup():
y = left_pad.ycor()
y += 20
left_pad.sety(y)
def paddleadown():
y = left_pad.ycor()
y -= 20
left_pad.sety(y)
#右側のバーの動き
def paddlebup():
y = right_pad.ycor()
y += 20
right_pad.sety(y)
def paddlebdown():
y = right_pad.ycor()
y -= 20
right_pad.sety(y)
#キーボード操作の情報
sc.listen()
sc.onkeypress(paddleaup, "e")
sc.onkeypress(paddleadown, "x")
sc.onkeypress(paddlebup, "Up")
sc.onkeypress(paddlebdown, "Down")
while True:
sc.update()
hit_ball.setx(hit_ball.xcor()+hit_ball.dx)
hit_ball.sety(hit_ball.ycor()+hit_ball.dy)
#加点条件
if hit_ball.ycor() > 280:
hit_ball.sety(280)
hit_ball.dy *= -1
if hit_ball.ycor() < -280:
hit_ball.sety(-280)
hit_ball.dy *= -1
if hit_ball.xcor() > 500:
hit_ball.goto(0, 0)
hit_ball.dy *= -1
left_player += 1
sketch.clear()
sketch.write("左のプレーヤー : {} 右のプレーヤー: {}".format(
left_player, right_player), align="center",
font=("Courier", 24, "normal")
)
if hit_ball.xcor() < -500:
hit_ball.goto(0, 0)
hit_ball.dy *= -1
right_player += 1
sketch.clear()
sketch.write("左のプレーヤー : {} 右のプレーヤー: {}".format(
left_player, right_player), align="center",
font=("Courier", 24, "normal")
)
#バーに当たった時の処理
if ( hit_ball.xcor()>360 and hit_ball.xcor()<370) and (hit_ball.ycor()<right_pad.ycor()+40 and hit_ball.ycor()>right_pad.ycor()-40):
hit_ball.setx(360)
hit_ball.dx*=-1
if (hit_ball.xcor()<-360 and hit_ball.xcor()>-370) and (hit_ball.ycor()<left_pad.ycor()+40 and hit_ball.ycor()>left_pad.ycor()-40):
hit_ball.setx(-360)
hit_ball.dx*=-1
あとは python ping_pong.py を実行すればゲームが始まります。
右側は上矢印と下矢印のキー、左側はEとXのキーでバーが動きます。
バーの大きさやボールのスピードなどを変えて、プログラミング学習にお役立てください。
6.Pythonを使ったゲーム作りに役立つ書籍
Pythonのゲーム学習に役立つ参考書を3冊ご紹介します。
①Pythonでつくる ゲーム開発 入門講座
ゲーム業界で働くことを視野に入れた本参考書は、Pythonの基礎学習からすごろくゲーム、それからPygameを使ったRPGの作成までを紹介する参考書になります。
Pythonをこれから始めようと思っている方に、おすすめの一冊です。
発行 2019年7月
¥2,948
②Pythonでつくる ゲーム開発 入門講座 実践編
①でご紹介した「Pythonでつくる ゲーム開発 入門講座」の応用版になります。Pythonの基本構文などの紹介はなく、最初から最後までゲームに関する内容です。ライブラリPygameを使い、3Dカーレースや3Dシューティングまでの作成方法を紹介してくれます。
発行 2019年12月
¥3,278
③日経ソフトウェア
雑誌「日経ソフトウェア」の5月号付録にPythonゲームのチュートリアルが紹介されています。
会話形式でゲーム作成の方法が紹介されていますので、雑誌を読むような感覚でPythonのゲーム開発を学ぶことができます。
発行 2021年3月
¥1,920