
「Scratchはできるようになった。次は文字でゲームを作ってみたい」
そんな小学校3年生以上の子どもたちと保護者の方へ。この記事では、Python(パイソン)とPyxel(ピクセル)でFlappy Bird風ゲームを完成まで作る流れを、順番に解説します。
「コードは難しそう」と感じるかもしれません。大丈夫です。この記事は、手順だけではなく「このコードは何をしているか」と「動かないときの直し方」をセットで説明します。
ゴールは2つです。
- 1本のゲームを最後まで完成させる
- Pythonの基礎文法をゲームの中で体験する


はじめに:PythonとPyxelを3分で理解
まずは公式情報を確認しておくと安心です。
- Python公式サイト:Welcome to Python.org
- Pyxel公式サイト:Pyxel Official
Pythonは、読みやすく書きやすい言語です。プログラミングの入門から、AIやデータ分析、Web開発まで幅広く使われています。
Pyxelは、Pythonでレトロゲームを作るための軽量ゲームエンジンです。画面サイズ、ドット絵、効果音を小さく管理できるため、子どもの最初のゲーム開発にとても向いています。
Luaの学習にもつながるようにしたい方は、Roblox Studioで学ぶLuaプログラミング入門もあわせて読むと、言語の違いが整理しやすくなります。コース全体はプログラミングスクール詳細で確認できます。
なぜ最初にFlappy Birdを作るの?

Flappy Bird風ゲームには、ゲーム制作の基本がまとまっています。
- 重力(何もしないと落ちる)
- 入力(押したら跳ぶ)
- 障害物生成(一定間隔で出す)
- 当たり判定(ぶつかったら終了)
- スコア管理(通過したら加点)
この5つは、ほかのアクションゲームでもそのまま使える重要な基礎です。
先に準備するもの
- Python 3.10以上をインストール
- ターミナルで
pip install pyxel - 作業フォルダーに
main.pyを作成
ここでのコツは「一気に全部書かない」ことです。1ステップ書いたら実行して確認、を繰り返すと、エラーを早く直せます。
先に設計図を持とう
今回のゲームは4つの部品でできています。
- 鳥の物理(落下とジャンプ)
- 土管の生成と移動
- 当たり判定(ゲームオーバー)
- スコア表示
迷ったら「今どの部品を作っているか」に戻ると、整理しやすくなります。
コード手順(少しずつ積み上げる)

ステップ1:まずは画面を出す
main.py に次を書いて実行します。
import pyxel
class App:
def __init__(self):
pyxel.init(160, 120, title="Flappy Bird Pyxel")
pyxel.run(self.update, self.draw)
def update(self):
pass
def draw(self):
pyxel.cls(12)
pyxel.text(50, 56, "flappy bird start", 7)
App()
確認ポイント:
- 水色の画面が出る
- 文字が表示される
ステップ2:鳥を表示する
import pyxel
class App:
def __init__(self):
pyxel.init(160, 120, title="Flappy Bird Pyxel")
self.bird_x = 32
self.bird_y = 60
self.bird_r = 3
pyxel.run(self.update, self.draw)
def update(self):
pass
def draw(self):
pyxel.cls(12)
pyxel.circ(self.bird_x, self.bird_y, self.bird_r, 10)
App()
確認ポイント:
- 左側に鳥(丸)が見える
ステップ3:重力を入れる
self.bird_vy = 0
update() を次のように変更します。
def update(self):
self.bird_vy += 0.2
self.bird_y += self.bird_vy
確認ポイント:
- 鳥が下に落ちる
ステップ4:ジャンプを入れる
def update(self):
self.bird_vy += 0.2
if pyxel.btnp(pyxel.KEY_SPACE) or pyxel.btnp(pyxel.GAMEPAD1_BUTTON_A):
self.bird_vy = -2.6
self.bird_y += self.bird_vy
確認ポイント:
- スペースキーで上に跳ぶ
ステップ5:土管を1本出して動かす
__init__() に追加します。
self.pipe_x = 160
self.pipe_w = 10
self.gap_y = 50
self.gap_h = 28
update() に追加します。
self.pipe_x -= 1
if self.pipe_x < -self.pipe_w:
self.pipe_x = 160
draw() に追加します。
pyxel.rect(self.pipe_x, 0, self.pipe_w, self.gap_y, 3)
pyxel.rect(self.pipe_x, self.gap_y + self.gap_h, self.pipe_w, 120, 3)
確認ポイント:
- 土管が右から左へ動く
ステップ6:土管を複数にする
__init__() に追加します。
self.pipes = []
self.frame = 0
update() の土管処理を置き換えます。
self.frame += 1
if self.frame % 45 == 0:
gap_y = pyxel.rndi(30, 70)
self.pipes.append({"x": 160, "w": 10, "gap_y": gap_y, "gap_h": 28, "passed": False})
for p in self.pipes:
p["x"] -= 1
self.pipes = [p for p in self.pipes if p["x"] > -12]
draw() の土管描画を置き換えます。
for p in self.pipes:
pyxel.rect(p["x"], 0, p["w"], p["gap_y"], 3)
pyxel.rect(p["x"], p["gap_y"] + p["gap_h"], p["w"], 120, 3)
確認ポイント:
- 土管が時間差で複数出る
ステップ7:当たり判定とゲームオーバー
__init__() に追加します。
self.gameover = False
update() の最初に追加します。
if self.gameover:
if pyxel.btnp(pyxel.KEY_SPACE):
self.reset()
return
同じく update() の後半に追加します。
if self.bird_y < 0 or self.bird_y > 119:
self.gameover = True
for p in self.pipes:
hit_x = (self.bird_x + self.bird_r > p["x"]) and (self.bird_x - self.bird_r < p["x"] + p["w"])
hit_top = self.bird_y - self.bird_r < p["gap_y"]
hit_bottom = self.bird_y + self.bird_r > p["gap_y"] + p["gap_h"]
if hit_x and (hit_top or hit_bottom):
self.gameover = True
draw() の最後に追加します。
if self.gameover:
pyxel.rect(44, 48, 72, 22, 0)
pyxel.text(64, 56, "game over", 8)
pyxel.text(54, 64, "press space", 7)
ステップ8:スコアを入れて完成
__init__() に追加します。
self.score = 0
update() の土管ループ内に追加します。
if (not p["passed"]) and (p["x"] + p["w"] < self.bird_x):
p["passed"] = True
self.score += 1
draw() に追加します。
pyxel.text(4, 4, f"score:{self.score}", 7)
コピペで動く完成形コード(このまま全部貼り付け)
下のコードを main.py にまるごと貼り付けて実行してください。
import pyxel
class App:
def __init__(self):
pyxel.init(160, 120, title="Flappy Bird Pyxel")
self.reset()
pyxel.run(self.update, self.draw)
def reset(self):
self.bird_x = 32
self.bird_y = 60
self.bird_r = 3
self.bird_vy = 0
self.pipes = []
self.frame = 0
self.score = 0
self.gameover = False
def update(self):
if pyxel.btnp(pyxel.KEY_R):
self.reset()
return
if self.gameover:
if pyxel.btnp(pyxel.KEY_SPACE):
self.reset()
return
self.frame += 1
self.bird_vy += 0.2
if pyxel.btnp(pyxel.KEY_SPACE) or pyxel.btnp(pyxel.GAMEPAD1_BUTTON_A):
self.bird_vy = -2.6
self.bird_y += self.bird_vy
if self.frame % 45 == 0:
gap_y = pyxel.rndi(30, 70)
self.pipes.append(
{"x": 160, "w": 10, "gap_y": gap_y, "gap_h": 28, "passed": False}
)
for p in self.pipes:
p["x"] -= 1
if (not p["passed"]) and (p["x"] + p["w"] < self.bird_x):
p["passed"] = True
self.score += 1
self.pipes = [p for p in self.pipes if p["x"] > -12]
if self.bird_y < 0 or self.bird_y > 119:
self.gameover = True
for p in self.pipes:
hit_x = (self.bird_x + self.bird_r > p["x"]) and (
self.bird_x - self.bird_r < p["x"] + p["w"]
)
hit_top = self.bird_y - self.bird_r < p["gap_y"]
hit_bottom = self.bird_y + self.bird_r > p["gap_y"] + p["gap_h"]
if hit_x and (hit_top or hit_bottom):
self.gameover = True
break
def draw(self):
pyxel.cls(12)
for p in self.pipes:
pyxel.rect(p["x"], 0, p["w"], p["gap_y"], 3)
pyxel.rect(p["x"], p["gap_y"] + p["gap_h"], p["w"], 120, 3)
pyxel.circ(self.bird_x, self.bird_y, self.bird_r, 10)
pyxel.text(4, 4, f"score:{self.score}", 7)
pyxel.text(4, 112, "space:jump r:reset", 1)
if self.gameover:
pyxel.rect(44, 48, 72, 22, 0)
pyxel.text(64, 56, "game over", 8)
pyxel.text(54, 64, "press space", 7)
App()
実行方法:
- ターミナルで
python main.py - スペースキーでジャンプ
Rキーでリセット
つまずきやすいポイントと対策
1. No module named pyxel が出る
pip install pyxelを実行- 複数Python環境の場合は
python -m pip install pyxelを使う
2. 画面が開いてすぐ閉じる
App()の呼び出しが最下部にあるか確認- エラーがターミナルに出ていないか確認
3. 鳥が跳ばない
pyxel.btnp(pyxel.KEY_SPACE)があるかself.bird_vy = -2.6がifの中にあるか
4. スコアが増えすぎる
passedフラグが更新されているか確認not p["passed"]の条件があるか確認
5. 難しすぎる
- 重力
0.2 -> 0.16 - ジャンプ
-2.6 -> -2.9 - 土管間隔
45 -> 55
改造アイデア(自分の作品にする)
- 鳥を丸からドット絵に変える(
pyxel.blt) - スタート画面を追加する
- ベストスコア保存を追加する
- 効果音とBGMを追加する
- 難易度を時間で上げる
まとめ
PythonとPyxelでFlappy Bird風ゲームを作ると、Scratchで学んだ考え方が「コードとして動く感覚」につながります。最初は長く見えるコードでも、部品ごとに分ければ必ず理解できます。
まずは1本完成させてください。完成した時点で、もう立派なゲーム開発者です。
Python以外の道も広げたい方は、ロブロックス(Roblox)コース詳細やAI・データサイエンスコースもオススメです。教室全体は沖縄のマインクラフト・プログラミング教室 クロスウェーブから確認できます。
教室の場所やアクセスは教室へのアクセスにまとめています。プロフィールはすずきたかまさ(鈴木孝昌)プロフィール ― 沖縄マイクラ部・クロスウェーブ代表をご覧ください。
今すぐ、LINEから無料体験を予約できます。「見学だけでもいいですか?」という問い合わせも大歓迎です。まずは一度、教室の雰囲気を体験しに来てください。
沖縄マイクラ部プログラミングスクール「クロスウェーブ」 代表:鈴木孝昌 (Google/Meta本社招待・政府PM・日本ソフトウェア大賞・マイクラカップTBS賞) 沖縄県宜野湾市伊佐2-20-15伊佐ビル2F
マイクラ部への参加方法
マイクラ部への参加を希望される方はLINEアカウントへ登録を頂くか、メールにて「webcrafts098@gmail.com」までご連絡をお願いします。
沖縄マイクラ部プログラミングスクール「クロスウェーブ」では、マインクラフトカップへの参加を目指す仲間を募集しています。子供たちへのプログラミング教育として「Python」「Scratch」「MakeCode」「JavaScript」「Unity」「Godot」などを指導しています。動画編集講座(Premiere Pro・DaVinci Resolve・CapCut)やHTML/CSSでのWeb制作講座も開催中です。
マイクラカップ参加希望の方へ
マイクラカップへの参加を希望される方は、人数把握のため以下のフォームからも申請をお願いします。申込時はマインクラフト教育版のライセンス費用が発生いたします。
開催地域
沖縄県宜野湾市
沖縄マイクラ部プログラミングスクール「クロスウェーブ」にて開催しています。
沖縄県うるま市
FMうるまにて開催しています。
FMうるま
沖縄マイクラ部について
沖縄マイクラ部は教室ではなく、親子の勉強会というスタイルで運営しています。保護者の方も一緒に参加していただけますので、お気軽にご参加ください。
お問い合わせ
お問い合わせはLINEオフィシャルアカウント、またはメール(webcrafts098@gmail.com)からお気軽にどうぞ。イベント情報は「開催イベント一覧」からご確認ください。