[Python]pipからゲームをインストールして遊んでみた

# Motive
RaspberryPiにデフォルトでPythonGamesとしてゲームプログラミングが内蔵されているのですが、Macでも出来ないかと思って調べてみたのがきっかけです。
RaspberryPiにあるすべてのゲームは独自で作られているためそのものは完全に取得できなさそうでしたが類似のライブラリがあったので紹介します。
それは「[Free Python Games](http://www.grantjenks.com/docs/freegames/)」 で、学校教育の目的で2012年に作られたライブラリです。アメリカの中学高校でふつ〜に使われているっぽいです。


# Method

### 仮想環境構築 + 有効化

```bash
python3 -m venv venv_game
source ./venv_game/bin/activate
```

### ゲームをインストール
```bash
pip install freegames
```

### ゲームを一覧表示
```bash
python3 -m freegames list

ant
bagels
bounce
cannon
connect
crypto
fidget
flappy
guess
life
maze
memory
minesweeper
pacman
paint
pong
simonsays
snake
tictactoe
tiles
tron
```

21種類あります。

### ゲームで遊んでみる


```bash
python3 -m freegames.pacman
```

パックマンが遊べます。

![pacman](http://www.grantjenks.com/docs/freegames/_static/pacman.gif)
([Free Python Games - Main page](http://www.grantjenks.com/docs/freegames/)より)

よく見かける `-m` のオプションですがモジュール内の `main()` の中を実行するみたいです。


### もし使い方がわからない時は、、、
Free Python Gamesの[Main page](http://www.grantjenks.com/docs/freegames/)か[Github](https://github.com/grantjenks/free-python-games/)のコードから推測します。ノーヒントだと取説がないので初見で操作するのが難しいゲームがいくつか存在します。

例として`pong` (Atariが発売した卓球ゲーム。家庭用テレビゲームでは世界初。)ですが、

```Python:pong.py
#Line:86-89
onkey(lambda: move(1, 20), 'w')
onkey(lambda: move(1, -20), 's')
onkey(lambda: move(2, 20), 'i')
onkey(lambda: move(2, -20), 'k')
```

player1 は `w` `s` keyで、player2は `i` `k` でパドルの上下を操作することができます。

# Learn
[pacman](https://github.com/grantjenks/free-python-games/blob/master/freegames/pacman.py)のコードにあるコメントには練習問題が書かれています。

```Python:python
"""Pacman, classic arcade game.
Exercises

1. Change the board. (ボードを変えてみよう)
2. Change the number of ghosts. (敵キャラの数を変えてみよう)
3. Change where pacman starts. (パックマンのスタート位置を変えてみよう)
4. Make the ghosts faster/slower. (敵キャラのスピードを変えてみよう)
5. Make the ghosts smarter. (敵キャラを賢くしてみよう)

"""
```

1~4まではいいとして、最後の問題は機械学習かDeepLearningを使うなどの本格的な思索が必要そうです。


### コード改変して実装してみたいとき

```bash
python3 -m freegames copy pacman
python3 pacman.py
```

単純に敵キャラの色を赤から緑に変えてみると下記の通りとなります。

```Python:pacman.py

    #Line:126-142
    #たぶんここで敵キャラを動かしているっぽい
    for point, course in ghosts:
        if valid(point + course):
            point.move(course)
        else:
            options = [
                vector(5, 0),
                vector(-5, 0),
                vector(0, 5),
                vector(0, -5),
            ]
            plan = choice(options)
            course.x = plan.x
            course.y = plan.y

        up()
        goto(point.x + 10, point.y + 10)
        dot(20, 'green') #dot(20, 'red')

```

![output.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288206/a7ff8580-0fd6-e3b3-4a75-eb5045f06190.gif)


# Future
pythonで動かすDemoゲームを紹介しました。
上記で紹介した`Pong`のようなふたりで遊ぶゲームも簡易的に作られているのでCPUがないため、ひとりで遊びたい場合は自作でCPUを作るしかなさそうです。
てか、昔のファミコンですが敵キャラの動きとかどうやって実装していたのでしょうか:sweat_smile:


# Reference
- [Free Python Games - Main page](http://www.grantjenks.com/docs/freegames/)
- [Free Python Games - Github](https://github.com/grantjenks/free-python-games/)
- [コマンドライン (option -m ) - Python Document](https://docs.python.org/ja/3.6/using/cmdline.html#cmdoption-m)
- [pygame](https://www.pygame.org/wiki/GettingStarted)
    - 今回は使っていないです。
- [タートルグラフィックス](https://docs.python.org/ja/3.6/library/turtle.html?highlight=turtle#module-turtle)
    - Python標準のライブラリ(pip不要)。今回紹介したFree Gamesのベースライブラリ。