デジタルこどもBASEのロゴ 特定非営利活動法人デジタルこどもBASE 📚 目次
第81回 Lv3 ⏱ 25〜35分

避けゲームを作ろう(基本)

🎯 きょうのミッション

これまでの全部を組み合わせて避けゲームの基本形を作ります。プレイヤーは横に動けて、上から落ちる赤いボールを避ける。当たったら「ゲームオーバー」。

🧠 できるようになること

  • ゲームループの「入力→更新→判定→表示」を説明できる
  • ループの速さを一定にして、安定して動かせる
  • 画面の外へ出ないプレイヤー操作を作れる

🧰 用意するもの

  • パソコン
  • ブラウザ(Chrome / Edge / Safari)
  • インターネット接続
  • このページの「▶ このページで実行」ボタン(絵もゲームもそのまま動きます)
  • Trinket(予備の実行サイト:https://trinket.io/python)

🖼 できあがり

下にいるプレイヤーを左右の矢印キーで動かして、上から落ちてくるボールを避けます。当たったらゲームオーバー。

📺 実行結果
(避けゲームのプレイ画面。ボールが落ちてくる)

🚀 やりかた

  1. プレイヤーと敵を作り、キー入力を関数に登録する。
  2. キー関数では max と min を使い、画面の外へ出ないようにする。
  3. game_loop の中を「敵を更新→当たり判定→画面を表示→次を予約」の順に書く。
  4. screen.ontimer(game_loop, 20) で1周ごとに20ミリ秒待ち、速さとCPU負荷を安定させる。
  5. 当たったら画面にゲームオーバーを表示し、return で予約を止めて終了する。

🐍 きょうのコード

Python main.py
import turtle
import random

screen = turtle.Screen()
screen.bgcolor("black")
screen.setup(500, 500)
screen.tracer(0)

player = turtle.Turtle()
player.shape("square")
player.color("cyan")
player.penup()
player.goto(0, -200)

enemy = turtle.Turtle()
enemy.shape("circle")
enemy.color("red")
enemy.penup()
enemy.goto(random.randint(-200, 200), 200)

def go_left():
    player.setx(max(-225, player.xcor() - 25))

def go_right():
    player.setx(min(225, player.xcor() + 25))

screen.onkey(go_left, "Left")
screen.onkey(go_right, "Right")
screen.listen()

def game_loop():
    enemy.sety(enemy.ycor() - 6)
    if enemy.ycor() < -250:
        enemy.goto(random.randint(-200, 200), 200)
    if player.distance(enemy) < 25:
        enemy.write("ゲームオーバー!", align="center",
                    font=("Arial", 20, "bold"))
        screen.update()
        return  # 予約をやめてゲーム終了
    screen.update()
    screen.ontimer(game_loop, 20)

game_loop()

turtle.done()
▶ Trinketを開いて動かす

このページの「▶ このページで実行」でそのまま動きます。キー操作のゲームは、絵をクリックしてからキーを押してね。Trinketを使うときは、上のコードをコピーして貼り付けます。

💡 きょうのポイント

ゲームは、短い時間の中で入力を受ける→位置を更新する→当たりを判定する→画面を表示するを何度もくりかえします。これがゲームループです。screen.tracer(0) と screen.update() で表示するタイミングを管理し、sleep で1周の速さを整えています。

🎮 チャレンジ

  • 測る:ontimer の 20 を 10、50 に変え、遊びやすさを比べよう
  • 境界テスト:左キーを押し続けても、プレイヤーが画面外へ消えないことを確認しよう
  • 難易度調整:敵の速さ6と当たり判定25を1つずつ変え、どちらが難しさに効くか記録しよう

🔁 ふりかえり

  • このゲームループの「更新」と「判定」は、それぞれどの行?
  • ontimer の待ち時間を 0 にすると、速さやパソコンの負荷はどう変わった?
  • 画面端のテストと衝突テストでは、どんな操作をすればよい?

👨‍👩‍👧 おうちの人・先生へ

  • 準備:Trinket キャンバスにフォーカスを当ててからプレイします。キーが反応しないときは、まずキャンバスをクリックします。
  • つまずきポイント:キーが反応しない場合はキャンバスをクリックします。動きが止まる場合は、screen.update() とインデントを確認します。
  • 確認順:①左右移動、②画面端、③敵の再出現、④衝突、⑤終了表示の順で、機能を1つずつテストしてください。
  • 声かけ例:「動いたら完成」ではなく、「速さ・当たり判定・遊びやすさを調整するところまでゲーム作り」と伝えると、改造の目的がはっきりします。