初心者向けのPythonゲームプログラミング入門講座(第1回:pythonライブラリを使える開発環境をパソコンにインストールしよう)

プログラミング入門講座

どうも、こんにちは、だんなです。

2020年、プログラミング教育が小学校で必修化されることをきっかけに、本業システムエンジニアのだんなが息子に簡単なプログラミング(Python:パイソン)を教えているうちに、自分もだんだんスイッチが入ってしまい約30年ぶりにゲームを作ってみたくなりました

本業はゲーム屋さんではありませんので、ゲームが大好きな小学生の息子から「ここの動きがおかしい」とか「こうしないと面白くない」などの意見をもらいながら、プログラムを作っていく過程をブログ記事に残していきます。今から子供にプログラミングを教えたい、親子で一緒に学んでみたい方にもpythonのインストールから進められるお勧めの入門記事になると思います。

だんな
だんな

このゲームプログラミング入門講座では、pythonライブラリを使って開発ができる環境をパソコンにインストールして、プログラムを作って行きます。

ちなみに私は、Windows10のパソコンにAnaconda(アナコンダ)という開発ツールをインストールして進めていきます。

第1回のゲームはコチラ「回転寿司くん君ゲーム」です。

初心者向けのPythonゲームプログラミング入門講座(第1回 pythonライブラリを使える開発環境をパソコンにインストールしよう)
誰に向けての記事なのか
  • 簡単なプログラミングを作ってみて、すごく楽しいと思った方
  • 配布されているライブラリを使って、アレコレ試してみたい方
記事の内容は何か
  • Python開発環境(Anaconda)を使ってプログラムを実行します。
  • pygameライブラリを使ってゲームを作る入門過程を記事にしていきます。
  • 疑問点があれば、コメントやtwitterに書いてくれればお答えします
記事を読むメリットは何か
  • 100万種類以上あるpythonの各種ライブラリを使える実行環境を構築。
  • pythonのプログラム言語で簡単なゲームを作る入門過程を覚えられます。

本業のシステムエンジニアの皆さんがプログラミングをする場合と同じように、少し面倒な準備が必要になりますが、このゲームプログラミング入門講座では「すべて無料で」プログラム実行できます。

実行手順は以下の3点となります。

プログラム実行までの手順

(準備①) pythonの開発環境(Anaconda)のインストール
(準備②) ゲーム作成用ライブラリpygameのインストール

入門① Anaconda付属のプログラムエディタ(Spyder)を開く。
入門② Spyderでプログラムを書く。または、ダウンロードしたファイルを開く。
入門③ Spyderで実行ボタンを押す。

それでは、(準備①) (準備②) の部分を進めていきます。pythonの開発環境インストール作業は最初に一度だけやればよいので、毎回行う必要はありません。



(準備①) pythonの開発環境(Anaconda)のインストール

最初にAnacondaという名前の開発環境を準備します。私たちシステムエンジニアの職場では、開発に使うパソコンやツール全般を指して何でもかんでも「開発環境」と呼ぶクセがあります。たいへん便利な言葉です。

1. Anacondaのダウンロード

Anacondaとは、一言で言うと「らくらくpython開発インストーラ」です。あちこちからインストーラをかき集めずとも、一撃インストールで開発環境が作れてしまいます。以下のサイトから、インストーラをダウンロードして実行して下さい。

Anacondaのダウンロード https://www.anaconda.com/distribution/

ダウンロードしたインストーラ(私のWindows10環境では「Anaconda3-2019.10-Windows-x86_64.exe」)を実行します。その後は、以下のようにボタンを押し進めて下さい。

これで、Anacondaのインストールは完了です。

(準備②) ゲーム作成用ライブラリpygameのインストール

Anacondaをインストールした段階で、1,500個以上のpythonライブラリがインストールされているそうです(数えてはいませんが)。このゲームプログラミング入門講座では、Anacondaのインストーラには含まれていないゲーム作成用の「pygame(パイゲーム)」というライブラリを使いたいので、別途インストールします。

pygame は、ビデオゲームを製作するために設計されたクロスプラットフォームのPythonモジュール集であり、Pythonでコンピュータグラフィクスと音声を扱うためのライブラリを含んでいる。pygameは、SDL ライブラリの上に構築されており、C言語のような低水準の機構を使わずにリアルタイムのコンピュータゲームを開発できるようにするための配慮がなされている。これは、計算量の多い関数(主にグラフィクス処理)のほとんどはゲームロジック自体から切り離せるという想定にもとづいており、それがPythonのような高水準言語をゲーム開発に使用することを可能にしている。

ウィキペディア(Wikipedia) https://ja.wikipedia.org/wiki/Pygame

pythonライブラリは、以下のようにコマンドプロンプトを起動してコマンドを入力することでインストール作業を進めます。Anacondaのアプリフォルダからコマンドプロンプトを起動します。

pip install pygame

これで、pygameライブラリのインストールは完了です。

入門① Anaconda付属のプログラムエディタ(Spyder)を開く。

インストール準備が終わったら、プログラムを書いたり実行したりするAnaconda付属のプログラムエディタ(Spyder)を開きます。

プログラムエディタについては、いろんな種類の無料ツールがダウンロードできるようになっていますので、Spyderが合わない方や環境構築に自信のある方は探してみて下さい。ちなみに私は、仕事の開発では「eclipse」と「Visual Studio Code」をメインで使っています。

入門② Spyderでプログラムを書く。または、ダウンロードしたファイルを開く。

初回は、私だんなが作成してアップロードしたファイルをダウンロードして実行してみましょう。アップロード先は、GitHub(ギットハブ)というサイトになります。
https://github.com/mat-tun-neo/kaitenzushi-kun

GitHub(ギットハブ)は、ソフトウェア開発のプラットフォームであり、ソースコードをホスティングする。コードのバージョン管理システムにはGitを使用する。Ruby on RailsおよびErlangで記述されており、アメリカのカリフォルニア州サンフランシスコ市に拠点を置くGitHub社によって保守されている。

ウィキペディア(Wikipedia) https://ja.wikipedia.org/wiki/GitHub

GitHubのアップロード先から、以下の手順でzip圧縮ファイルをダウンロードして下さい。

ダウンロードが終わったら、自分の好みの場所に解凍して下さい。解凍したフォルダをSpyderで表示して、いよいよプログラムを実行していきます。

画面右の「ファイルエクスプローラー」を使って、解凍したkaitenzushi-kunフォルダにたどり着いて下さい。

実行するpythonのプログラムファイル「kaitenzushi-kun.py」をダブルクリックして、画面左のエディタに表示させて下さい。

入門③ Spyderで実行ボタンを押す。

さて、いよいよゲームプログラムを実行します。メニューより「実行」→「プロファイル」をクリックして下さい。(「F10」キーを押しても同じことが可能です。)

無事、回転寿司くんゲームが表示されましたか?

え?回転寿司くんが しょぼーん(´・ω・`)寿司くん に変わっている?はい、それで合っています。回転寿司くんは、キャラクター原作者の@asahaさんのご好意で動画のアップを許可いただいたキャラクターになりますので、プログラム配布の際には しょぼーん(´・ω・`)寿司くん に変更させてもらっています。こちらもカワイイでしょ?

ちなみに、ゲーム画面で「ESC」キーを押すとエディタ画面に戻れます。初めてSpyderを使う方は徐々に使い方に慣れていきましょう!

次回の入門講座では、回転寿司くんゲームのプログラムの各部分がなぜそのような動作をするのかを解説しようと思っています。お楽しみに!

from pygame_functions import *
from random import random

SCREEN_X = 1200             # 画面 横サイズ (ピクセル)
SCREEN_Y = 600              # 画面 縦サイズ (ピクセル)
PLAYER_ALLIMAGE = 27        # プレイヤー アニメーション全コマ数
PLAYER_MOVELEN = 16         # プレイヤー 動く幅 (ピクセル)
PLAYER_SPEED = 35           # プレイヤー 動く速さ (ms)
PLAYER_WIDTH = 192          # プレイヤー 横サイズ (ピクセル)
PLAYER_HEIGHT = 160         # プレイヤー 縦サイズ (ピクセル)
PLAYER_SCALE = 1.5          # プレイヤー 画像の拡大率
PLAYER_Y = 380 - PLAYER_HEIGHT * PLAYER_SCALE - 20    # プレイヤー 初期Y位置 (ピクセル)
RAIL_Y = 312                # レール 初期Y位置 (ピクセル)
DISH_MOVELEN = 5            # お皿 動く幅 (ピクセル)
DISH_WIDTH = 250            # お皿 横サイズ (ピクセル)
DISH_HEIGHT = 113           # お皿 縦サイズ (ピクセル)
DISH_SCALE = 1.2            # お皿 画像の拡大率
DISH_NUM = 5                # お皿 スプライトの枚数
DISH_APPEAR = 0.1           # お皿 出現率
DISH_VALUE = 100            # お皿 1枚の得点
DISH_X = DISH_WIDTH * (-1)  # お皿 初期X位置 (ピクセル)
DISH_Y = RAIL_Y - DISH_HEIGHT / 3 + 10  # お皿 初期Y位置 (ピクセル)
KAIKEI_KETA = 6             # 会計スコア 桁数(=画像の枚数)
KAIKEI_X = 500              # 会計スコア 初期X位置 (ピクセル)
KAIKEI_Y = 0                # 会計スコア 初期Y位置 (ピクセル)
KAIKEI_WIDTH = 39           # 会計スコア 横サイズ (ピクセル)
METER_ALLIMAGE = 6          # お客メーター アニメーション全コマ数
METER_SCALE = 1             # お客メーター 画像の拡大率
METER_X = 550               # お客メーター 初期X位置 (ピクセル)
METER_Y = 430               # お客メーター 初期Y位置 (ピクセル)

screen = screenSize(SCREEN_X, SCREEN_Y)
setBackgroundImage("images/bg_kaitenzushi.jpg")

# レール初期描画
all_rails = []
for i in range(2):
    rail = makeSprite("images/rail.jpg")
    if i==0:
        rail.x = SCREEN_X * (-1)
    else:
        rail.x = 0
    moveSprite(rail, rail.x, RAIL_Y)
    showSprite(rail)
    all_rails.append(rail)

# お皿初期描画
all_dishes = []
for i in range(DISH_NUM):
    dish = makeSprite("images/dish" + format(i, '02') + ".png")
    dish.x = DISH_WIDTH * (-1)
    dish.y = DISH_Y
    moveSprite(dish, dish.x, dish.y)
    showSprite(dish)
    all_dishes.append(dish)

# 満足メーター初期描画
meter = makeSprite("images/good0.png")
for i in range(METER_ALLIMAGE - 1):
    addSpriteImage(meter, "images/good" + str(i + 1) + ".png")
transformSprite(meter, 0, METER_SCALE)
moveSprite(meter, METER_X, METER_Y)
showSprite(meter)

# プレイヤー初期描画
player = makeSprite("images/aji000.png")
for i in range(PLAYER_ALLIMAGE - 1):
    addSpriteImage(player, "images/aji" + format(i + 1, '03') + ".png")
player_x = SCREEN_X / 2
transformSprite(player, 0, PLAYER_SCALE)
moveSprite(player, player_x, PLAYER_Y)
showSprite(player)
left = False
right = False

# スコア更新の関数
def kaikei(n):
    j = 0
    for i in range(KAIKEI_KETA):
        if KAIKEI_KETA - len(str(n)) > i:
            kaikei = makeImage("images/a.jpg")
        else:
            kaikei = makeImage("images/" + str(n)[j] + ".jpg")
            j += 1
        screen.blit(kaikei, (KAIKEI_X + KAIKEI_WIDTH * i, KAIKEI_Y))

# ループ初期値
nextFrame = clock()
playerImgNo = 0
score = 0
kaikei(score)
dish_appearflg = 0
meter_level = 0
game_continue = True

# メインループ
while True:
    if game_continue:
        # プレイヤーの操作判定 (入力なし)
        if not left and not right:
            if keyPressed("left"):
                playerImgNo = 0
                left = True
            if keyPressed("right"):
                playerImgNo = PLAYER_ALLIMAGE
                right = True
            player_x += DISH_MOVELEN
            moveSprite(player, player_x, PLAYER_Y)
            if player_x > SCREEN_X - PLAYER_WIDTH * PLAYER_SCALE:
                player_x = SCREEN_X - PLAYER_WIDTH * PLAYER_SCALE
    
        # プレイヤーの操作判定 (入力:左キー)
        if left:
            if clock() > nextFrame:
                playerImgNo += 1
                if playerImgNo > 26:
                    playerImgNo = 0
                    left = False
                    
                changeSpriteImage(player, playerImgNo)
                nextFrame = clock() + PLAYER_SPEED
                
                if playerImgNo > 6 and playerImgNo < 22:
                    player_x -= PLAYER_MOVELEN * PLAYER_SCALE
                    if player_x < 0:
                        player_x = 0
                else:
                    player_x += DISH_MOVELEN
                moveSprite(player, player_x, PLAYER_Y)
    
        # プレイヤーの操作判定 (入力:右キー)
        if right:
            if clock() > nextFrame:
                playerImgNo -= 1
                if playerImgNo < 0:
                    playerImgNo = 0
                    right = False
                    
                changeSpriteImage(player, playerImgNo)
                nextFrame = clock() + PLAYER_SPEED
                
                if playerImgNo > 6 and playerImgNo < 22:
                    player_x += PLAYER_MOVELEN * PLAYER_SCALE
                else:
                    player_x += DISH_MOVELEN
                if player_x > SCREEN_X - PLAYER_WIDTH * PLAYER_SCALE:
                    player_x = SCREEN_X - PLAYER_WIDTH * PLAYER_SCALE
                moveSprite(player, player_x, PLAYER_Y)
    
        # レールの描画
        for rail in all_rails:
            rail.x += DISH_MOVELEN
            if rail.x >= SCREEN_X:
                rail.x = SCREEN_X * (-1)
            moveSprite(rail, rail.x, RAIL_Y)
    
        # お皿の描画
        cnt = 1
        for dish in all_dishes:
            if dish_appearflg == 0 and dish.x == DISH_X and random() < DISH_APPEAR:
                dish.x += DISH_MOVELEN
                dish_appearflg = cnt
            if player_x > PLAYER_MOVELEN / 2:
                if (left and playerImgNo == 24) or (right and playerImgNo == 3):
                    if touching(player, dish):
                        dish.y += DISH_MOVELEN * 2
            if SCREEN_Y > dish.y > DISH_Y:
                dish.y += DISH_MOVELEN * 2
            if dish.y > SCREEN_Y:
                dish.y = SCREEN_Y
                score += DISH_VALUE
                kaikei(score)
            if dish.x > SCREEN_X:
                if dish.y == DISH_Y:
                    meter_level += 1
                    changeSpriteImage(meter, meter_level)
                    
                    # ゲームオーバー判定
                    if meter_level == METER_ALLIMAGE - 1:
                        game_continue = False
                        break
                dish.x = DISH_X
                dish.y = DISH_Y
            elif dish.x > DISH_X:
                moveSprite(dish, dish.x, dish.y)
                dish.x += DISH_MOVELEN
                if cnt == dish_appearflg and dish.x > 0:
                    dish_appearflg = 0
            cnt += 1
    else:
        pass
    
    tick(60)

以上、だんなのゲームプログラミング入門講座でした。

だんな
だんな

コチラでプログラムの解説をしています。
第1回解説:背景をスクロールさせる)
ぜひご覧ください。

pythonゲームプログラミングのおすすめの書籍

ゲームセンターあらしと学ぶ プログラミング入門 まんが版こんにちはPython(すがや みつる (著))

だんな
だんな

Pythonでゲームプログラミングをしたい方にオススメな本を紹介します。

超オススメ!
プログラミング入門講座
シェアする
だんなをフォローする


あゆすた

コメント