Python Kivyでゲームを作る

みんなのPython勉強会で[LT](https://www.slideshare.net/JunOkazaki1/kivy-81706171)を行った内容を元に再構成しています。

内容としてはPyconJP2017の発表で削ったネタになります。
Kivy（Python）でどんなゲームが作れるかの説明と実際に作る際に参考になりそうなゲームのソースコードを載せています。



# ゲームを作るメリット

よく言われるメリットは以下の感じです。

+ アルゴリズムの勉強
+ プログラミング言語の理解をみにつける
+ コンピュータのしくみを理解する
+ 比較的改良しやすい
+ 自動操作などでAIの学習に使えるかも

また個人的にはゲームは画面などに結果が反映されるので学習意欲がわきやすいというものがあります。



# 代表的なゲームエンジンについて

おそらく日本で最もポピュラーなものは以下の３つだと思います。
優れた機能、充実した日本語訳のマニュアル、豊富なサンプルとアセットがあります

+ Unity（C#）
+ UnrealEngine4	（BulePrints/C++）
+ Amazon Lumberyard （C++）

ただし個人的には画面のレイアウトなど覚えることも多いのでプログラミングに特化した学習をしたいという人には不向きかもしれません。

またゲームエンジンは他にもたくさんの種類がありcocos2d,Godot Engine,Game maker といったものもあります。


## UnrealEnginePythonについて

UnrealEngine4をPythonで動かそうということをしている人もいます。
EuroPython2017で[AAA GAMES WITH UNREAL ENGINE 4 AND PYTHON](https://ep2017.europython.eu/conference/talks/aaa-games-with-unreal-engine-4-and-python)という公演内容で発表もされています。

+ 開発元の会社でのEuroPython2017での[発表紹介ページ](https://www.20tab.com/articles/videos-europython-2017-rimini/)
+ EuroPython2017での[発表動画(youtube)](https://www.youtube.com/watch?v=_38csFR5Hrw)
+ github:https://github.com/20tab/UnrealEnginePython

日本でも導入の仕方についての解説記事があります。
[UnrealEnginePythonをちょっとだけ試す](http://imoue.hatenablog.com/entry/2017/03/06/014226)

## Godot Engine のGD Scriptについて
フリーのゲームエンジンであるGodot Engineの開発言語の一つである[GD Script](http://docs.godotengine.org/en/stable/learning/scripting/gdscript/gdscript_basics.html)もPythonライクの形式で書けるそうです。

またこれとは別にPythonでの対応も進んでいるようです。C++のAPIをCythonを使用してアクセスするようです。EuroPython2017で公演もしています。


+ [BETA RELEASE FOR PYTHON SUPPORT](https://godotengine.org/article/beta-release-python-support)

+ [Githubでのコード](https://github.com/touilleMan/godot-python/releases)

+ EuroPython2017での[発表動画(youtube)](https://www.youtube.com/watch?v=SK0BtxHROdg)

# Pythonのゲームをつくるライブラリ

Pythonでゲームを作るライブラリはいくつか出ています。
以下がよく聞かれるものの一覧です。

+ Pygame
+ Kivy
+ KivEnt 
+ Pyglet
+ Renpy
+ Tkinter

各ライブラリの紹介ですが、
Pythonでゲームを作るライブラリーに関してはPygameが一番ポピュラーかと思います。
日本でもたくさんの紹介がblogなどにあります。

Kivyに関しては省略します。
PygameとKivyはともにSDL2を介して動いているのでできることはあまり変わらないです。
といいますかKivyは以前のバージョンではpygameを介してSDL2を動かしていました。


[KivEnt](http://www.kivent.org/)はKivyの派生でKivyを元にしたゲームライブラリです。国内での使用例はおそらくないと思います

[Pyglet](https://ja.wikipedia.org/wiki/Pyglet)は使用したことがないのでよく分かってないので詳細はリンク先のwikipediaのページを見てください。

Renpyはノベルゲームを作成するライブラリーで海外でノベルゲームを作成する際はよく使用されているみたいです。
日本でも使用してゲームを作成されている方もいます。

TkinterはPythonをインストールする際についてくる標準ライブラリです。インストールが簡単なのでPythnでプログラミングの勉強をする際に使用されることがよくあるようです。ゲームで使用する場合いですと[12歳からはじめる ゼロからの Pythonゲームプログラミング教室](https://www.rutles.net/products/detail.php?product_id=775)という書籍が出版されています。

# Pythonで作れるゲームについて

![図1.png](https://qiita-image-store.s3.amazonaws.com/0/11002/cacc986c-8afe-6956-3330-aec40ae38fd0.png)


+ スーパーファミコンレベル
+ 2Dカジュアルゲームの作成が多い
+ 3Dは得意ではない

作れるゲームですがスーパーファミコン時代の2Dカジュアルゲームならできます。
昨今の3DのリアルタイムのFPSの様なゲームの作成は描画処理の問題があり難しいです。


# Pygameでの参考書籍

Pygameに関しては日本語の書籍があります

![図2.jpg](https://qiita-image-store.s3.amazonaws.com/0/11002/c2848923-e196-4716-2d92-ddbbd214045f.jpeg)


+ ゲームを作りながら楽しく学べるPythonプログラミング
（https://www.amazon.co.jp/dp/B06XRQS8PN/）
+ マインスイーパー、テトリスなどゲームのアルゴリズムの解説も載っています


ただしこの書籍、 オンデマンドプリントなので書店にはおかれてないです。
Amazonで印刷かKindleでの販売しか入手できません。
ゲームはアルゴリズム自体は変わらないのでそういう意味では中古で本や他の言語のゲームのチュートリアルみてもできるかと思います。


# Kivyで作成できるゲームについて

+ 国内では書籍/サイトともに完成したものがあまりない
+ 海外では書籍でいくつか紹介されている
+ 公式サイトのギャラリー（https://kivy.org/#gallery）でいくつか紹介されている。


公式サイトでは紹介されていないGithubで公開されているKivyで作成されたゲームを以下で紹介します。


# 暗記系
![図3.png](https://qiita-image-store.s3.amazonaws.com/0/11002/002d0017-e1b5-d2db-0d3a-e91697b285ef.png)


+ https://github.com/sot-iris/AstronautTraining
+ 表示された複数の数字を覚えて記入するゲーム

# マインスイーパー


![図4.png](https://qiita-image-store.s3.amazonaws.com/0/11002/29fef56e-bcd1-5ba1-1665-f24f3cab9a76.png)


https://github.com/pipy/minesweeper
Python2系のみ動作
出来に難がある

# 2048

## パターン1

![図5.png](https://qiita-image-store.s3.amazonaws.com/0/11002/c80a37ff-e551-6d2d-9c29-5c6b57d9e6a0.png)

https://github.com/tito/2048

Kivyのコアディベロッパーの　Mathieu Virbelが開発
2048のクローン
そこそこ話題になった

## パターン2

![図6.png](https://qiita-image-store.s3.amazonaws.com/0/11002/62d9c13a-cc8e-b72b-563a-def0d3241b5e.png)

https://github.com/mvasilkov/kb/tree/master/6_2048
書籍（Kivy Blueprints）のサンプルコード
2048のクローン

# Floppy Birdのクローン

## KivyBird

![図7.png](https://qiita-image-store.s3.amazonaws.com/0/11002/d126bceb-fe2c-d4aa-ccd9-17da3d0c50ab.png)


https://github.com/mvasilkov/kb/tree/master/7_KivyBird
書籍（Kivy Blueprints）のサンプルコード

## FlappyKivy
![図8.png](https://qiita-image-store.s3.amazonaws.com/0/11002/3054a43d-e92a-f5e9-7103-d9a1a57a3dae.png)

https://github.com/undercase/FlappyKivy


# シューティングゲーム

![図9.png](https://qiita-image-store.s3.amazonaws.com/0/11002/2a92393c-1548-c761-8f7f-ba315f2e96e8.png)

日本の方が作成
https://torina.top/detail/308/
https://bitbucket.org/toritoritorina/kvgames

# シューティングゲーム

![図10.png](https://qiita-image-store.s3.amazonaws.com/0/11002/c7e5c16c-ca25-bde3-8ace-d992da4fd9ee.png)

https://github.com/mvasilkov/kb/tree/master/9_ShootEmUp

書籍（Kivy Blueprints
）のサンプルコード

# インベーダーゲーム

![図11.png](https://qiita-image-store.s3.amazonaws.com/0/11002/cd0274f5-0c74-e991-6ad3-4d3f7f11dd7e.png)

https://github.com/robertour/kivy-book-examples/tree/master/Chapter_05_code

書籍（Kivy - Interactive Applications and Games in Python Second Edition）のサンプルコード


# オセロ

![図12.png](https://qiita-image-store.s3.amazonaws.com/0/11002/0c7cf715-2197-e3d5-9210-170589562a8f.png)

https://github.com/PrestaMath/reverse_tile

Python2.7でのみ実行
Kv Languageで作成されていない

## テトリス

# 1

![図13.png](https://qiita-image-store.s3.amazonaws.com/0/11002/7f2531b7-5876-44c4-7019-1bd02108c381.png)


https://github.com/mmueller/tetrivy

テトリスはブロックの消去などのアルゴリズムの関係ですこし内容が難しいです


# 2
![図14.png](https://qiita-image-store.s3.amazonaws.com/0/11002/2be4efc0-ae27-c4d6-32dc-9713415867ce.png)


https://github.com/zyqzyq/tetris-kivy

スタート画面や音楽もついている

## Life game

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Game Of Life in Kivy <a href="https://t.co/96i7Tag9CI">https://t.co/96i7Tag9CI</a> <a href="https://twitter.com/YouTube?ref_src=twsrc%5Etfw">@YouTube</a>さんから</p>&mdash; okazaki jun (@dario_okazaki) <a href="https://twitter.com/dario_okazaki/status/949777169240113152?ref_src=twsrc%5Etfw">2018年1月6日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


https://github.com/SinOverCos/Kivy-Python---Game-of-Life


日本の方でも作られた方がいるみたいです。

https://github.com/yukirin/LifeGame-kivy

## ブロック崩し

https://github.com/kn2322/breakout-clone

https://github.com/rkibria/yapyg