マガジン

ワンボタンゲームの作り方:押すだけで成立する遊び

遊びをつくる

執筆にClaudeを使用しています。

キーボードとタッチの二つの入力が、同じ駒のジャンプにつながる様子を描いたイラスト。
記事のテーマをもとに制作したAI生成イラスト。

ワンボタンゲームとは、キーボードの1キーまたはタップ1種類だけで操作が完結するゲームです。入力が一つに絞られているぶん、プレイヤーが覚えることはほぼゼロになります。同時に、作る側にとっても「押したとき・離したとき・長押し中」の3状態しか扱わないため、入力処理のコードが単純になるという利点があります。 ただし、シンプルな入力がそのまま面白さにつながるわけではありません。ボタン一つで成立する遊びを設計するには、「何が変化し、何をプレイヤーが判断するか」を丁寧に決める必要があります。この記事では、ワンボタンゲームの設計の考え方から、ブラウザで動くHTMLゲームとして実装するときの具体的な手順まで、順を追って説明します。

この記事の目次
  1. ワンボタンで面白くなる仕組みを理解する
  2. 設計で決めるべき四つの要素
  3. HTMLとJavaScriptで実装する手順
  4. 失敗しやすいポイントと対策
  5. 完成後の公開と磨き方
  6. 次の行動

ワンボタンで面白くなる仕組みを理解する

ワンボタンゲームが成立するのは、「押す」という単純な行為が、ゲーム内の何らかの連続的な変化と結びついているからです。代表的な構造は三つあります。

タイミング型は、画面上で何かが動いており、プレイヤーは「今だ」というタイミングで押します。ジャンプ・射撃・停止など、動きに対して介入する感覚が楽しさになります。古典的なフラッピーバード系やリズムゲームの一部がこの構造です。

蓄積型は、ボタンを押し続けている時間がパワーや距離に変換されます。ゴルフゲームのパワーゲージ、弓を引き絞る動作などが典型です。「どこで離すか」が判断の核になります。

切り替え型は、ボタンを押すたびに状態が反転します。右向き・左向きを交互に切り替えながら障害物をよける、重力の向きを反転させるなど、押すことで世界の法則が変わります。

この三つは組み合わせることもできますが、最初の一作は一つの構造に絞るほうが設計しやすいです。複数を混ぜると「今何が起きているか」がプレイヤーに伝わりにくくなります。

設計で決めるべき四つの要素

構造を選んだあとは、次の四点を具体化します。ここが曖昧なままコードを書き始めると、後から大きく直すことになります。

1. 変化し続けるもの

ボタンを押す前から何かが動いていなければ、タイミングや判断が生まれません。キャラクターが自動で前進する、ゲージが一定速度で増減する、障害物が近づいてくる――こうした「ほうっておくと変化し続けるもの」を必ず一つ置きます。

2. ボタンが何を変えるか

変化し続けているものに対して、ボタンがどう介入するかを決めます。「加速させる」「反転させる」「固定する」など、動詞一語で言い切れる介入が明快です。「なんとなく影響する」設計は避けます。

3. 失敗条件

ワンボタンゲームの緊張感は、失敗条件がはっきりしていることで生まれます。「この線を超えたら終わり」「この敵に当たったら終わり」のように、視覚的にわかりやすい条件にします。

4. 上達の余地

ワンボタンでも、慣れるほど上手くなる構造が必要です。障害物の速度が徐々に上がる、パターンが複雑になるなど、初回クリアより2回目のほうが良い結果が出る仕掛けを入れます。これがなければ、ゲームではなくランダムな抽選になってしまいます。

HTMLとJavaScriptで実装する手順

ブラウザゲームとして作る場合の基本的な実装の流れを示します。

ステップ1:入力を受け取る

スペースキーとタップを同時に拾う処理を最初に書きます。キーボードとタッチの両方に対応することで、スマートフォンでもプレイできます。

javascript
let pressing = false;

document.addEventListener('keydown', (e) => {
  if (e.code === 'Space') pressing = true;
});
document.addEventListener('keyup', (e) => {
  if (e.code === 'Space') pressing = false;
});
document.addEventListener('touchstart', () => { pressing = true; });
document.addEventListener('touchend', () => { pressing = false; });

このpressingという変数一つが、ゲーム全体の入力状態になります。ゲームロジックはこの変数だけを参照すればよく、入力まわりのコードがここに集約されます。

ステップ2:ゲームループを作る

requestAnimationFrameを使ったループで、毎フレームの更新と描画を行います。

javascript
function loop(timestamp) {
  update(timestamp);
  draw();
  requestAnimationFrame(loop);
}
requestAnimationFrame(loop);

updateの中でゲームの状態(座標・速度・スコア・ゲームオーバー判定)を更新し、drawでCanvasに描画します。この二つを分けておくと、後からデバッグしやすくなります。

ステップ3:変化し続けるものを実装する

タイミング型を例にとると、キャラクターが重力に従って落下し、ボタンを押すと上昇する、という動きは次のように書けます。

javascript
let y = 200, vy = 0;
const gravity = 0.4;
const jumpForce = -7;

function update() {
  vy += gravity;
  if (pressing) vy = jumpForce; // タイミング型の場合
  y += vy;
}

蓄積型ならpressingがtrueの間だけゲージを増やし、falseになった瞬間にゲージの値をアクションに変換します。切り替え型ならkeydownイベントでgravityの符号を反転させます。

ステップ4:失敗判定とリスタートを入れる

失敗条件に達したらゲームを止め、再度ボタンを押したら最初から始まる、というサイクルを入れます。

javascript
let gameOver = false;

function update() {
  if (gameOver) return;
  // 通常の更新処理
  if (y > canvas.height || y < 0) {
    gameOver = true;
  }
}

document.addEventListener('keydown', (e) => {
  if (e.code === 'Space' && gameOver) {
    resetGame();
  }
});

リスタートを「同じボタンで行う」ことで、プレイヤーは手を動かさずにすぐ再挑戦できます。これはワンボタンゲームの体験として自然な流れです。

失敗しやすいポイントと対策

難易度の調整を後回しにしない。 変化の速度や障害物の間隔は、作っている本人には簡単に感じがちです。初めてプレイする人に試してもらう前に、速度の数値を変数として外に出しておき、すぐ調整できる状態にしておきます。

フィードバックが薄い。 ボタンを押したとき、画面や音で「何かが変わった」と伝えられないと、操作している実感が持てません。視覚的な変化(色・エフェクト・揺れ)を少なくとも一つ入れます。Web Audio APIを使えば、コードを数行追加するだけで押したときの音が鳴らせます。

スコアがないと上達が見えない。 何秒生き残ったか、何点取ったかを画面に表示することで、次回への目標ができます。ハイスコアをローカルストレージに保存するだけでも、繰り返しプレイの動機になります。

モバイルでの誤タップ。 タッチデバイスでプレイすると、スクロールが発生してゲームが中断されることがあります。touchstartとtouchmoveでevent.preventDefault()を呼び、ページのスクロールを止めておきます。ただし、これを使うにはaddEventListenerの第3引数で{ passive: false }を指定する必要があります。

完成後の公開と磨き方

ゲームが動くようになったら、単一のHTMLファイルとして書き出せる状態か確認します。外部ファイルへの参照がある場合はZIPにまとめ、画像や音声を同梱します。アソバースではHTMLファイルとZIPファイルの両方を直接投稿できるため、完成したらそのままアップロードして公開できます。

公開後は、プレイされた結果をもとに難易度を見直します。ワンボタンゲームは仕組みが単純なぶん、数値の微調整が体験に直結します。最初の公開はあくまで「プレイヤーに触れてもらうための第一版」として、フィードバックを得てから改善するサイクルを回すのが現実的です。

次の行動

まず構造(タイミング型・蓄積型・切り替え型)を一つ選び、「変化し続けるもの」と「ボタンが変えるもの」を1行ずつ言葉で書き出してから、コードを書き始めてください。設計が言葉で言い切れない段階でコードに進むと、途中で迷子になりやすくなります。完成したゲームはアソバース(https://aso-verse.com)にHTMLまたはZIPで投稿し、実際に遊んでもらいながら磨いていきましょう。