3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

CYBIRD Advent Calendar 2024Advent Calendar 2024

Day 1

GASとChatGPTで簡単なゲームを作ってみる

Last updated at Posted at 2024-11-30

はじめに

CYBIRD Advent Calendar 2024 1日目担当の @cy_hinano_imai です。
サイバードには2023年に新卒入社し、現在はイケメンシリーズの1タイトルでクライアント兼サーバーエンジニアとして開発/運用を担当しています。
今年も参加しようと準備していたので、すごい勢いで1日目を取りにきました。:dove::heart_exclamation:

概要

最近GASを触る機会が増えたので、GASでゲームも作れるのかな?と思ってChatGPTに聞いてみました。
(ChatGPT 4o mini)
スクリーンショット 2024-11-22 15.12.35.png
スクリーンショット 2024-11-22 15.12.46.png
こんな感じの返答が返ってきました。シンプルなゲームであれば作れるみたいです。

そこで、ChatGPTに「GASでブラウザベースの簡単なゲームを作りたい」と聞いてみると、作成に必要なコードを全部出力してくれます。なんて便利なんだろう。

作成してみる

以下は、ある程度端を折っていますが、ほぼChatGPTからのコピペです。

HTML ファイルの例:

index.html
<!DOCTYPE html>
<html>
<head>
  <title>クリックゲーム</title>
  <style>
    body {
      font-family: Arial, sans-serif;
      text-align: center;
    }
    #score {
      font-size: 30px;
      margin-bottom: 20px;
    }
    #clickButton {
      padding: 10px 20px;
      font-size: 20px;
    }
  </style>
</head>
<body>
  <h1>クリックして点数を増やそう!</h1>
  <div id="score">スコア: 0</div>
  <button id="clickButton">クリック!</button>

  <script>
    var score = 0;
    var scoreElement = document.getElementById('score');
    var button = document.getElementById('clickButton');

    button.onclick = function() {
      score++;
      scoreElement.innerText = "スコア: " + score;
    };
  </script>
</body>
</html>

Google Apps Script のコード例:

javascript
function doGet() {
  return HtmlService.createHtmlOutputFromFile('index');
}

以上をGASで作成し、動作確認(WEBアプリとして公開)までしてみます。

WEBアプリとして公開してみる

  • GASのエディタの上部にある「デプロイ」ボタンをクリックして、「新しいデプロイ」をクリック
  • 「種類の選択」から「ウェブアプリ」を選び、右下のデプロイボタンをクリック
  • ウェブアプリのURLが生成されると思うので、そのURLにアクセスすると、作成したゲームがブラウザに表示される

今回はこんな感じ。
スクリーンショット 2024-11-22 16.00.15.png
時間制限もまだついていないので、ボタンをクリックする度にスコアが増えます。ゲームとはいえど、本当に最低限の要素しか入っていません。

これで完成!とは流石に言えないので、時間制限だけでも追加してみましょう。

時間制限付きにしてみる

今度はChatGPTに「GASで時間制限付きのブラウザクリックゲームを作ってください」と注文してみます。

以下も、ある程度端を折っていますが、ほぼChatGPTからのコピペです。

HTML ファイルの例:

index.html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>クリックゲーム</title>
  <style>
    body {
      font-family: Arial, sans-serif;
      text-align: center;
      margin-top: 50px;
    }
    #game-container {
      margin-top: 20px;
    }
    #click-button {
      padding: 20px 50px;
      font-size: 20px;
      cursor: pointer;
      border: none;
      background-color: #4CAF50;
      color: white;
      border-radius: 5px;
    }
    #score {
      font-size: 24px;
      margin-top: 20px;
    }
    #timer {
      font-size: 24px;
      margin-top: 20px;
    }
    #end-message {
      font-size: 30px;
      color: red;
      margin-top: 30px;
    }
  </style>
</head>
<body>
  <h1>クリックゲーム</h1>
  <p id="timer">時間制限: 10秒</p>
  <div id="game-container">
    <button id="click-button" onclick="handleClick()">クリック</button>
  </div>
  <p id="score">スコア: 0</p>
  <p id="end-message" style="display: none;">ゲーム終了!</p>

  <script>
    let score = 0;
    let timer = 10;
    let timerInterval;
    let gameEnded = false;

    // タイマーのカウントダウン
    function startTimer() {
      timerInterval = setInterval(function() {
        timer--;
        document.getElementById('timer').innerText = "時間制限: " + timer + "";
        if (timer <= 0) {
          clearInterval(timerInterval);
          endGame();
        }
      }, 1000);
    }

    // ゲームの開始
    function startGame() {
      gameEnded = false;
      score = 0;
      timer = 10;
      document.getElementById('score').innerText = "スコア: " + score;
      document.getElementById('end-message').style.display = "none";
      document.getElementById('click-button').disabled = false;
      startTimer();
    }

    // クリック処理
    function handleClick() {
      if (gameEnded) return;
      score++;
      document.getElementById('score').innerText = "スコア: " + score;
    }

    // ゲーム終了
    function endGame() {
      gameEnded = true;
      document.getElementById('click-button').disabled = true;
      document.getElementById('end-message').style.display = "block";
    }

    // ページ読み込み時にゲームを開始
    window.onload = function() {
      startGame();
    }
  </script>
</body>
</html>

Google Apps Script のコード例:

javascript
function doGet() {
  return HtmlService.createHtmlOutputFromFile('index');
}

以上です。こちらも動作確認(WEBアプリとして公開)までしてみます。

WEBアプリとして公開してみる

  • GASのエディタの上部にある「デプロイ」ボタンをクリックして、「新しいデプロイ」をクリック
  • 「種類の選択」から「ウェブアプリ」を選び、右下のデプロイボタンをクリック
  • ウェブアプリのURLが生成されると思うので、そのURLにアクセスすると、作成したゲームがブラウザに表示される

今回はこんな感じ。
スクリーンショット 2024-11-28 12.41.38.png

ブラウザを開いた時点でゲームが開始し、制限時間を過ぎると下に「ゲーム終了!」と出て、ボタンもクリックできないようになりました。

初回よりはいい感じです。ついでにindex.htmlにどこが何の処理なのか、コメント文もつくようになりました。結構ありがたいです。

まとめ

私はゲームのアイデアを出すのが苦手なので、ChatGPTにはアイデア出しや基盤の作成をやってもらっています。
「土台だけ作ってもらって、後付けしていく」という流れを気に入っていまして、気が向いた時にバージョンアップさせてみるというのが、エンジニアとしての息抜きにちょうど良いです。
GASなら手間をかけることなく動作の確認もできますし、ChatGPTがサンプルコードの提供もしてくれる(しかもコメントつき!)ので、初めてHTMLを触る人の勉強や、苦手意識の払拭に良いかもしれませんね。:santa:

最後に

CYBIRD Advent Calendar 2024 2日目は @chikako_ikeda さんの「Android15の録画検出機能を試した話」です!
お楽しみに!

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?