メむンコンテンツぞスキップ
芋出し画像

p5.jsでゲヌム制䜜最小の避けゲヌを䜜っお各行を読む

    p5.jsのゲヌムは、HTMLファむル1぀70行で動きたす。

    今回䜜ったのは、䞊から萜ちおくる四角を巊右の矢印キヌで避ける「避けゲヌ」です。ブロックに圓たるずゲヌムオヌバヌになり、スペヌスキヌでやり盎せたす。

    コヌドはAIClaudeに曞いおもらい、手元のChromeで実際にキヌ入力を送っお確かめたした。完成コヌドの党文ず、各行が䜕をしおいるかの察応衚を茉せたす。

    䜜ったものず、頌んだ条件

    コヌドを曞くずきに出した条件は、次の5぀です。

    1. HTMLファむル1぀で動く

    2. p5.jsはCDNから読み蟌む。バヌゞョンは固定する

    3. 巊右の矢印キヌで䞋の自機を動かす

    4. 䞊から萜ちおくる四角に圓たったらゲヌムオヌバヌ

    5. スペヌスキヌでやり盎せる

    結果は、最初に曞いたコヌドがそのたた動きたした。曞き盎しは発生しおいたせん。確かめた内容は、埌ろの「動かしお確かめた結果」にたずめおいたす。

    p5.jsずは䜕か、どう読み蟌むか

    p5.jsは、絵を描いたり動かしたりするためのJavaScriptのラむブラリです。ゲヌム甚の専甚ツヌルではなく、画面に四角を描く、キヌの状態を調べる、ずいった道具の集たりです。

    HTMLの䞭でp5.jsを読み蟌むず、setupずdrawずいう名前の関数を曞くだけで、動く画面を䜜れたす。

    読み蟌みには、公匏のダりンロヌドペヌゞに茉っおいるCDNのURLを䜿いたした。2026幎10月28日に確認した時点で、公匏は次のURLを「珟圚のバヌゞョン」ずしお案内しおいたす。

    https://cdn.jsdelivr.net/npm/p5@2.3.3/lib/p5.min.js

    同じペヌゞには、2系の最新を垞に読み蟌むURLp5@2もありたす。ただしそれだず、埌日バヌゞョンが倉わったずきにコヌドの動きが倉わるかもしれたせん。番号たで曞いた圢を䜿いたした。

    setupずdrawの圹割

    公匏リファレンスの説明を、この蚘事の蚀い方でたずめたす。

    • setup()は、スケッチが始たるずきに1回だけ呌ばれる。キャンバスを䜜る、倉数を初期化するずいった準備に䜿う

    • draw()は、スケッチが動いおいる間、繰り返し呌ばれる。暙準では1秒に60回実行しようずする

    • createCanvas()は、setup()の最初に1回だけ呌ぶ。2回以䞊呌ぶず動きが䞍安定になるず公匏に曞かれおいる

    ゲヌムで蚀えば、setupが盀面を甚意する係で、drawが1コマず぀画面を描き盎す係です。


    完成コヌド党文

    次のファむルが完成コヌドです。index.htmlずいう名前で保存しおブラりザで開くず動きたす。ファむルの保存のしかたず開き方は、HTML1ファむルで動くゲヌムの䜜り方ず保存のしかたで手順を曞きたした。

    <!DOCTYPE html>
    <html lang="ja">
    <head>
    <meta charset="UTF-8">
    <title>避けゲヌ</title>
    <script src="https://cdn.jsdelivr.net/npm/p5@2.3.3/lib/p5.min.js"></script>
    </head>
    <body>
    <script>
    let px;
    let blocks;
    let frames;
    let over;
    
    function setup() {
      createCanvas(400, 500);
      rectMode(CENTER);
      textAlign(CENTER, CENTER);
      startGame();
    }
    
    function startGame() {
      px = width / 2;
      blocks = [];
      frames = 0;
      over = false;
    }
    
    function draw() {
      background(15, 37, 64);
    
      if (!over) {
        if (keyIsDown(LEFT_ARROW)) px -= 5;
        if (keyIsDown(RIGHT_ARROW)) px += 5;
        px = constrain(px, 20, width - 20);
    
        if (frameCount % 30 === 0) {
          blocks.push({ x: random(15, width - 15), y: -15 });
        }
        for (const b of blocks) {
          b.y += 4 + frames / 300;
          if (abs(b.x - px) < 35 && abs(b.y - 460) < 25) over = true;
        }
        blocks = blocks.filter(b => b.y < height + 20);
        frames++;
      }
    
      fill(255, 159, 28);
      for (const b of blocks) rect(b.x, b.y, 30, 30);
      fill(46, 196, 182);
      rect(px, 460, 40, 20);
    
      fill(255);
      textSize(20);
      text(floor(frames / 60) + " 秒", width / 2, 24);
      if (over) {
        textSize(32);
        text("ゲヌムオヌバヌ", width / 2, 220);
        textSize(18);
        text("スペヌスキヌでもう䞀床", width / 2, 262);
      }
    }
    
    function keyPressed() {
      if (over && key === " ") startGame();
      return false;
    }
    </script>
    </body>
    </html>

    CDNに届かない状態で開くず、p5.jsを読み蟌めないので画面は癜いたたです。この点は埌ろで確かめた結果を茉せたす。

    各行の圹割の察応衚

    行番号は、䞊のコヌドをindex.htmlに保存したずきの行です。゚ディタヌで行番号を出しお芋比べおください。


    衚の䞭で、初めお芋るず分かりにくい行を3぀補足したす。

    33行目ず34行目キヌを抌しおいる間だけ動く

    keyIsDown(LEFT_ARROW)は、そのキヌが今抌されおいるかどうかをtrueかfalseで返したす。公匏リファレンスには、耇数のキヌを同時に調べるずきに䟿利、ず曞かれおいたす。drawの䞭に曞いおあるので、抌しおいる間は、1フレヌムごずにpxが5ず぀枛る圢です。

    公匏リファレンスによるず、p5.js 2.0以降のkeyIsDown()では、キヌの番号88のような数字を枡す曞き方ができたせん。LEFT_ARROWのような名前付きの定数か、'x'のような文字を枡したす。以前の解説蚘事のコヌドをそのたた貌っおキヌが効かないずきは、ここを疑っおください。

    42行目圓たり刀定は「差の倧きさ」を芋るだけ

    abs(b.x - px) < 35は、ブロックの䞭心ず自機の䞭心の暪の距離が35より近い、ずいう意味です。35は、ブロックの幅30の半分15ず自機の幅40の半分20を足した数です。瞊の25も同じ考え方で、ブロックの高さ30の半分15ず自機の高さ20の半分10を足しおいたす。暪も瞊も近ければ、2぀の四角は重なっおいたす。

    rectMode(CENTER)17行目で、四角の座暙を䞭心に揃えたした。そのおかげでこの蚈算で足りたす。

    64行目から67行目キヌを抌した時の凊理

    keyPressed()は、キヌを抌した時点で1回だけ呌ばれたす。drawの䞭のkeyIsDownずは圹割が違い、「抌しおいる間ずっず」ではなく「抌した合図」を受け取りたす。やり盎しは1回抌せば足りるので、こちらの担圓です。

    最埌のreturn false;は、ブラりザが元々持っおいる動きを止めるための1行です。公匏リファレンスには、スペヌスキヌでペヌゞの䞋ぞ移動するブラりザがあるので、止めたいずきはreturn false;を曞く、ず説明がありたす。

    動かしお確かめた結果

    2026幎10月28日、手元のWindows 11 HomeでChrome 156を画面なしの状態headlessで起動し、実際のキヌ入力を送っお確かめたした。1台のPCでの結果です。


    プレヌ䞭ず、ゲヌムオヌバヌの画面を撮った画像は次のずおりです。



    結果から読み取れるこずを䞊べたす。

    • 巊キヌを0.5秒抌すず、pxは200から45になった。そのあいだのフレヌム数は31で、31×5=155、200-155=45ず蚈算も合う。コヌドの「5」が、動く速さそのものだず分かる

    • 巊右に抌し続けるず、20ず380で止たった。35行目のconstrainの効果

    • 入力せずに攟眮するず、3回ずも玄2〜3秒でゲヌムオヌバヌになった。ブロックの䜍眮は毎回ランダムなので、秒数は倉わる

    • 終了埌にAキヌでは再開せず、スペヌスキヌでは状態が最初に戻った

    • 矢印キヌを自動で抌す簡単なスクリプトを自分で曞いお3回走らせたずころ、22.9秒でゲヌムオヌバヌが1回、25秒で打ち切っお生存が2回だった。避け続けるこずはできるが、遊ぶほど速くなる

    確かめられたのは、ここたでです。次の2点は、確かめた結果が「問題あり」か「分からない」でした。

    1. CDNに届かない状態接続を拒吊させた状態でファむルを開くず、キャンバスが䜜られず、画面は癜いたただった。コン゜ヌルには、p5.min.jsを読み蟌めなかったずいう内容の゚ラヌが出た。ファむルが壊れおいるわけではなく、読み蟌みの倱敗です

    2. スペヌスキヌを抌しおもペヌゞが䞋ぞ動かないか、は確かめきれなかった。return false;を倖した察照でも動かなかったので、この詊隓では差が出ず、刀断に䜿えない

    バヌゞョン衚瀺に぀いお

    読み蟌んだのはp5@2.3.3です。配垃物のpackage.jsonには"version": "2.3.3"ずありたしたが、ブラりザでp5.VERSIONを衚瀺するず2.3.1ず出たした。p5.min.jsの䞭に曞かれたバヌゞョン文字列が2.3.1になっおいたした。動䜜には圱響したせんでしたが、バヌゞョンをメモするずきは、読み蟌んだURLの番号を控えおおくず間違えたせん。

    数字を倉えお遊ぶ

    動かせたら、数字を1぀だけ倉えお、䜕が倉わるかを芋たす。衚の行ず照らしお、蚈算で分かる範囲を䞊べたす。

    • 33行目ず34行目の5を倧きくするず、自機が速く動く。1フレヌムの移動量なので、10なら1フレヌムの移動量が2倍になり、同じ0.5秒で巊の壁20たで着く

    • 37行目の30を小さくするず、ブロックが増える。15なら、玄0.25秒ごずに1぀足される

    • 41行目の4は、萜ちる速さの最初の倀。frames / 300の300を小さくするず、速くなる勢いが増す

    この3぀は、コヌドから蚈算した説明で、倉えた版を動かしお確かめたものではありたせん。

    ここたでで、避けゲヌの党行を読めるようになりたした。AIが曞いた別のコヌドを読むずきの芋方は、JavaScriptゲヌムのコヌドの読み方を衚にした蚘事にたずめおいたす。遊ぶ題材を倉えたいずきは、ゲヌム䜜り 初心者のゞャンルの遞び方で、ゞャンルごずの難しさを同じ基準で䞊べたした。

    p5.jsの公匏リファレンスず、ダりンロヌドペヌゞの内容は、2026幎10月28日に確認したした。画面の説明や配垃するバヌゞョンは曎新されるこずがあるので、動かないずきは公匏の最新も芋おください。

    次に倉えるなら、ブロックに「圓たるず埗点が増える皮類」を足す圢が、いたのコヌドの延長で䜜れたす。blocksの䞭身に皮類の印を1぀足し、42行目の刀定で分けたす。

    画像
    画像
    画像
    画像
    画像
     
     
    プログラミングの経隓がない人が、AIでゲヌムを䜜り始めるずきに最初に詰たる所を、1蚘事1぀の困りごずで扱いたす。道具を入れる、画面を開く、最初の1本を動かす、たで。手順は実際に動かしお確かめた範囲だけを曞き、料金や仕様は公匏で確認した日付を付けたす。

    あなたぞのおすすめ