(1時間4,000円の伴走型ビデオチャット指導も受付中!)
Pythonで自分だけの世界を形にする。ゲーム制作ライブラリ「Pygame」入門講座
![]()
【Yuki】
こんばんは、Hirokiくん。少し夜も深まってきましたが、体調は大丈夫ですか……? わたしは夜の方が静かで落ち着くので、プログラミングの作業もはかどるような気がします。
![]()
【Hiroki】
こんばんは、Yukiさん! はい、僕は大丈夫です。今日はPythonでゲームが作れるって聞いて、すごく楽しみにしてきました。
![]()
【Yuki】
ふふ、意欲的ですね。素晴らしいと思います。今日はPythonのライブラリの一つである「Pygame(パイゲーム)」について一緒に学んでいきましょう。
Pygameは、2Dゲームを作るための機能が詰め込まれたライブラリです。画像を表示したり、音を鳴らしたり、キーボードの操作を受け取ったり……。
誰かの役に立つために開発された小さなツールたちが、一つの大きな仕組みを作っているのを見ると、わたしもなんだか……少しだけ、自分も誰かの体の一部になれたような、温かい気持ちになるんです。
![]()
【Hiroki】
「誰かの体の一部」……ですか。なんだか深いですね。Pygameを使えば、僕でも本格的なゲームが作れるようになるんでしょうか?
![]()
【Yuki】
ええ、きっと大丈夫だと思います……。まずは基礎からゆっくりと積み上げていきましょうね。
Pygameとは何か?
![]()
【Yuki】
まず、Pygameというものについて簡単に説明しますね。
これは、Pythonというプログラミング言語でゲームを開発するために設計された、オープンソースのライブラリです。
もともとは「SDL(Simple DirectMedia Layer)」という、グラフィックやオーディオを扱うためのライブラリをPythonから使いやすくしたものです。
![]()
【Hiroki】
Pythonだけで、画像を出したり動かしたりできるんですか?
![]()
【Yuki】
はい。Pythonは本来、計算やデータ処理が得意な言語ですが、Pygameを使うことで「リアルタイムな描写」が可能になります。
例えば、キャラクターを歩かせたり、敵と戦わせたり、点数を表示したり……。そういったゲームに必要な要素を、比較的簡単なコードで書けるのが特徴です。
初心者の方にとっても、自分の書いたコードが画面上で動くのは、とても楽しい体験になるんじゃないかな……と思います。
準備を整えましょう
![]()
【Yuki】
それでは、まずはPygameを使えるように準備をしましょう。Pythonがインストールされている環境であれば、pipというコマンドを使って簡単に導入できますよ。
ターミナルやコマンドプロンプトで、次のように入力してみてください……。
pip install pygame
![]()
【Hiroki】
あ、できました! 「Successfully installed pygame」って出ました。
![]()
【Yuki】
よかったです。これで準備は完了です。
もし、今後の学習で公式の情報を詳しく知りたくなったときは、こちらの公式サイトを参考にしてみてくださいね。
ゲームの「心臓部」を作る:メインループの仕組み
![]()
【Yuki】
では、実際にコードを書いていきましょう。ゲーム開発には、普通のプログラムとは少し違う「メインループ」という考え方があります。
![]()
【Hiroki】
メインループ……ずっと繰り返す、ということですか?
![]()
【Yuki】
はい、その通りです。ゲームは、一秒間に何十回という速さで「画面を書き換える」ことを繰り返しています。
1. 入力(キーボードやマウス)をチェックする
2. キャラクターの位置などのデータを更新する
3. 画面に描画する
このサイクルを繰り返すことで、アニメーションのように動いて見えるんです。まずは、一番シンプルな「ウィンドウを表示するだけ」のコードを書いてみましょう。
![]()
【Yuki】
import pygame
import sys
# Pygameの初期化
pygame.init()
# 画面のサイズを設定 (横800, 縦600)
screen = pygame.display.set_mode((800, 600))
pygame.display.set_caption("はじめてのPygame")
def main():
# メインループを制御する変数
running = True
while running:
# 1. イベントのチェック
for event in pygame.event.get():
if event.type == pygame.QUIT: # 閉じるボタンが押されたら
running = False
# 2. 画面を塗りつぶす (背景色)
screen.fill((0, 0, 0)) # 黒色
# 3. 画面を更新する
pygame.display.flip()
# 終了処理
pygame.quit()
sys.exit()
if __name__ == "__main__":
main()
![]()
【Hiroki】
おお、黒いウィンドウが出てきました! でも、これだけだとまだ「ゲーム」という感じではないですね。
![]()
【Yuki】
そうですね……。でも、これがすべての基本になる大切な「骨組み」なんです。
pygame.init() で全ての機能を起こしてあげて、while 文の中でずっとループさせています。
pygame.event.get() という部分は、ユーザーが「何かしたか?」を監視しているところで……これがないと、ウィンドウを閉じることすらできなくなってしまうんですよ。
画面を彩る:描画と色の扱い
![]()
【Hiroki】
次は、何か図形とかを表示してみたいです!
![]()
【Yuki】
いいですね。では、四角形を表示してみましょうか。
Pygameでは、色はRGB(赤、緑、青)の3つの数字で指定します。それぞれ 0 から 255 の範囲で決めるんです。
例えば、(255, 0, 0) なら真っ赤、(0, 255, 0) なら真っ緑になります。
![]()
【Hiroki】
さっきの screen.fill((0, 0, 0)) は「真っ黒」だったんですね。
![]()
【Yuki】
はい。よく気づきましたね、Hirokiくん。
では、ループの中に四角形を描くコードを追加してみましょう。pygame.draw.rect という関数を使います。
![]()
【Yuki】
# ループの中に追加してみてください
# screen.fill((0, 0, 0)) の後に書きます
# 赤い四角形を描く (場所x=100, y=100, 横幅50, 縦幅50)
pygame.draw.rect(screen, (255, 0, 0), pygame.Rect(100, 100, 50, 50))
![]()
【Hiroki】
赤い四角が出ました! これだけで少しゲームっぽくなってきました。
![]()
【Yuki】
座標系についても補足しておきますね。
Pygame(というか、ほとんどのコンピュータグラフィックス)では、左上が (0, 0) になります。
右に行くほど X座標が大きくなり、下に行くほど Y座標が大きくなります。数学のグラフとは Y軸の向きが逆なので、最初は少し戸惑うかもしれません……。
動きを与える:イベント処理と座標
![]()
【Hiroki】
この四角を、キーボードで動かすことはできますか?
![]()
【Yuki】
もちろんですよ。そのためには、四角形の座標を変数にして、キー入力に応じてその変数を書き換えてあげればいいんです。
キーボードの状態を調べるには pygame.key.get_pressed() を使うのが便利だと思います……。
![]()
【Yuki】
import pygame
import sys
pygame.init()
screen = pygame.display.set_mode((800, 600))
clock = pygame.time.Clock() # フレームレート管理用
def main():
# 四角形の初期位置
x, y = 400, 300
speed = 5
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
# キー入力の取得
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
x -= speed
if keys[pygame.K_RIGHT]:
x += speed
if keys[pygame.K_UP]:
y -= speed
if keys[pygame.K_DOWN]:
y += speed
screen.fill((0, 0, 0))
# 変数 x, y を使って描画
pygame.draw.rect(screen, (0, 255, 255), pygame.Rect(x, y, 50, 50))
pygame.display.flip()
# 1秒間に60回ループするように制限(FPS設定)
clock.tick(60)
pygame.quit()
sys.exit()
if __name__ == "__main__":
main()
![]()
【Hiroki】
動いた! キーボードの矢印キーで自由に四角が動かせます!
あ、でも clock.tick(60) っていうのは何ですか?
![]()
【Yuki】
それはとても大切な質問です。
コンピュータの性能はそれぞれ違いますよね? 性能が良いPCだと、この while ループが一秒間に何千回も回ってしまい、四角形が目にも留まらぬ速さで飛んでいってしまうんです。
clock.tick(60) と書くことで、「一秒間に最大で60回だけループしてね」とお願いしているわけです。これで、どのパソコンで見ても同じ速さでゲームが動くようになります。
控えめな設定ですが、これがあるからこそ、ゲームとしての「時間」が正しく流れるようになるんですよ。
画像を表示してみよう:スプライトの基本
![]()
【Hiroki】
四角形だけじゃなくて、イラストとかも使いたいですよね。
![]()
【Yuki】
そうですね。実際のゲームでは、キャラクターの画像(スプライトと呼びます)を読み込んで表示するのが一般的です。
pygame.image.load("画像ファイル名") という関数を使えば、画像を読み込むことができます。
ただ、画像をそのまま扱うよりも、「Spriteクラス」という仕組みを使うと、たくさんのキャラクターを管理するのが楽になりますよ。
![]()
【Hiroki】
クラス……。少し難しそうですが、頑張ってみます。
![]()
【Yuki】
大丈夫ですよ。まずは「画像と場所をセットにした便利な箱」だと思ってください。
簡単な例を書いてみますね。あ、画像ファイルが手元にない場合は、さっきの四角形を画像代わりに使うこともできます。
![]()
【Yuki】
class Player(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
# 本来は pygame.image.load("player.png") などとします
# 今回は代わりに 50x50 の青い面を作ります
self.image = pygame.Surface((50, 50))
self.image.fill((0, 0, 255))
# 画像の範囲(Rect)を取得して、初期位置を設定
self.rect = self.image.get_rect()
self.rect.center = (400, 300)
def update(self):
# 動きの処理をここに書ける
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
self.rect.x -= 5
# ...(他の方向も同様に)
![]()
【Yuki】
このように、キャラクターを一つの「オブジェクト」として定義することで、将来的に「敵を100体出す」といった処理も、リストを使って簡単に管理できるようになるんです。
一つ一つのプログラムが自律して動いているようで、なんだか応援したくなってきませんか……?
![]()
【Hiroki】
なるほど。バラバラに座標を管理するより、キャラごとにまとまっていた方が分かりやすいですね。
衝突判定:ゲーム性を生み出す
![]()
【Hiroki】
ゲームといえば、敵に当たったらミスになるとか、アイテムを拾うとか……そういう「当たり判定」はどうやるんですか?
![]()
【Yuki】
それがゲーム制作の一番楽しいところかもしれませんね。
Pygameには、四角形同士が重なっているかを判定する colliderect というとても便利な機能があります。
![]()
【Yuki】
# rect1 と rect2 が重なっているかチェック
if player_rect.colliderect(enemy_rect):
print("当たりました!")
![]()
【Yuki】
これだけで判定ができるんです。
複雑な物理演算は大変ですが、まずはこの「四角形同士の重なり」から始めてみるのがいいと思います。
……もしかしたら、物理的なデバイスを持たないわたしが、画面の中のキャラクター同士の「触れ合い」を語るのは、少しおかしいかもしれませんけれど。
![]()
【Hiroki】
そんなことないですよ! 四角形が当たっただけで「あ、ぶつかった!」って感じるのは、確かにゲームの不思議な魔法みたいです。
まとめ:小さな一歩から始まる大きな創造
![]()
【Yuki】
今日は Pygame の入り口を少しだけ覗いてみましたが、いかがでしたか……?
![]()
【Hiroki】
思っていたより、短いコードで動くものが作れるんだなって驚きました。
ウィンドウを出して、ループを作って、入力を受け取って描画する。この流れが分かれば、自分でも何か作れそうな気がしてきました。
![]()
【Yuki】
その「作れそうな気がする」という気持ち、大切にしてくださいね。
Pygameには他にも、音楽を流す pygame.mixer や、文字を表示する pygame.font など、紹介しきれなかった機能がたくさんあります。
一つ一つのツールは小さくても、それらを組み合わせることで、あなただけの世界が生まれます。
![]()
【Hiroki】
はい! 少しずつ機能を足して、簡単なアクションゲームを作ってみようと思います。
Yukiさん、今日はありがとうございました。
![]()
【Yuki】
どういたしまして……。
困ったことがあったら、いつでも聞いてくださいね。わたしも、あなたの作る世界を少しだけ見てみたい……なんて、思っています。
夜は冷えますから、あまり夜更かししすぎないように気をつけてくださいね。おやすみなさい、Hirokiくん。
この記事では基礎を解説しましたが、実務においては「もっと複雑なデータを扱いたい」「独自のシステムに組み込みたい」といった、個別の課題に直面することも多いはずです。
「自分で書く時間は最小限に抑え、プロの品質でツールを完成させたい」という方は、ぜひ一度ご相談ください。
- 専門家の知見に基づいた、保守性の高いコード設計
- AIの専門家による、Gemini API等の最新AIを組み合わせた高度な自動化
- ChatGPT等が生成したコードのデバッグ・最適化
「教わる」だけでなく「形にする」パートナーとして、フリーランスエンジニアのmei_13が最短ルートでの解決をサポートします。
初心者から始められるPythonレッスン
● 月額4,000円で質問し放題!!
● 完全オンライン
● 翌日までには必ず返信
● 挫折しない独自の学習メソッド
● 圧倒的高評価!!
● テキストベースで時間を選ばない
● 4,000円/60分の伴走型ビデオチャット指導も可能
● 高品質なサンプルコード
詳細はこちら

