「Gemini CLI」を使ってみる!導入から、ゲームを作り始めるまで(作ったゲームも触れます)

「Gemini CLI」を使ってみる!導入から、ゲームを作り始めるまで(作ったゲームも触れます)

最初に未完成のゲームを貼っておきます。次回ブログ記事にてもう少し進行版を貼ります。(まだゲームとしてはいまいちですが、とりあえず動く)

操作方法だけ、PCの場合、WASDとカーソルキーで移動、パワーアップはマウスで選択です。https://test.aisgm.me/test_prog/js/002/

画像クリックでも遊べます

ポイント
・Gemini CLIはマルチモーダル機能 様な入力から新しいアプリケーションを生成など
・大規模コードベースのサポート Geminiの100万トークンという広大なコンテキストウィンドウを最大限に活用し、大規模なコードベースのクエリや編集を効率的に行えます
・運用タスクの自動化 Git操作など、日常的なDevOps関連のタスクをAIが自動化
・豊富なツール統合 Gemini CLIの大きな強みです。Imagen(画像生成・編集)、Veo(動画作成)、Lyria(音楽生成)といったメディア生成モデルを含む新しい機能をModel Context Protocol (MCP) サーバーを通じて接続できます

「Gemini CLI」が何かとか、料金とか周辺の情報は大量にあるので、その辺は割愛します。

今回はWindowsPCにインストールして、実際に動かしてJavaScriptでゲームを作成して、プロトタイプがブラウザで遊べる所まで持って行きます。

伊藤園 健康ミネラル麦茶 2L×6本

新品価格
¥1,250から
(2025/7/6 11:38時点)

導入:Gemini CLIのセットアップ

前提条件
Gemini CLIは、Node.jsバージョン18以上が必要で、
node -v コマンドを実行することで簡単に確認できます 。
入っていない場合、

node : 用語 'node' は、コマンドレット、関数、スクリプト ファイル、または操作可能なプログラムの名前として認識されません
。名前が正しく記述されていることを確認し、パスが含まれている場合はそのパスが正しいことを確認してから、再試行してくださ
い。
発生場所 行:1 文字:1
+ node -v
+ ~~~~
    + CategoryInfo          : ObjectNotFound: (node:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

って、なるのでインストールから始めます。

インストールには2種類あって、「直接実行」と「グローバルインストール」があります。

違いは、

  1. 直接実行(インストール不要):
    この方法は、一時的にCLIを試したい場合や、特定のプロジェクトでのみ使用したい場合に特に適しています。システムに永続的なインストールを行うことなく、以下のコマンドをターミナルで実行するだけでGemini CLIを起動できます
    npx https://github.com/google-gemini/gemini-cli
    npx を使用した直接実行オプションは、ユーザーが気軽にGemini CLIを試せるようにするための重要なユーザーエクスペリエンス上の配慮です。これにより、永続的なインストールを躊躇するユーザーでも、手軽にAI機能を体験でき、ツールの普及を促進します。Googleがユーザーエンゲージメントの初期段階を重視していることが伺えます。
  2. グローバルインストール(推奨):
    システム全体で gemini コマンドを永続的に利用したい場合に推奨される方法です 。これにより、どのディレクトリからでも

gemini コマンドを直接実行できるようになります。以下のコマンドをターミナルで実行してインストールします 。


npm install -g @google/gemini-cli

という事だったんですが、「npm install -g @google/gemini-cli」を実行しても動かない。
調べてみると、権限が足りていない事なので、権限を付与します。
問題無く動く場合は、次へ進みます。

1.PowerShellを管理者権限で開く
・Windowsのスタートメニューを開き、「PowerShell」と検索します。
・「Windows PowerShell」を右クリックして「管理者として実行」を選択します。

2.現在の実行ポリシーを確認する
以下のコマンドを入力し、現在の実行ポリシーを確認します:

Get-ExecutionPolicy -List

これにより、現在のスコープごとの実行ポリシーが表示されます。Restrictedとなっている場合、スクリプトの実行が無効になっています。

3.実行ポリシーを変更する
実行ポリシーを変更するには、以下のコマンドを入力します:

Set-ExecutionPolicy RemoteSigned -Scope CurrentUser

コマンドの意味
 RemoteSignedは、ローカルで作成したスクリプトを実行可能にし、インターネットからダウンロードしたスクリプトには署名が必要となる設定です。
 -Scope CurrentUserは、現在のユーザーにのみ適用する設定です。

4.変更内容を確認する
再度以下のコマンドを実行して、設定が変更されたことを確認します:

et-ExecutionPolicy -List

5.PowerShellを閉じる
設定を適用するために、PowerShellを再起動

このあと、

npm install -g @google/gemini-cli

を実行

npm error code ENOENT
npm error syscall spawn git
npm error path git
npm error errno -4058

gitが入っていないというエラーなので、入れます
既に入っている場合は、インストールが進むはずです。

Git公式ダウンロードページ
https://git-scm.com/?locale=ja

こちらでダウンロードして入れます。
gitは設定項目が多いので、細かい事を知りたい場合は、個別に調査してください。

npm install -g @google/gemini-cli

このコマンドが実行されて、無事インストールが終わると、gemini と入力するだけで対話型CLIが起動します 。
Googleのアカウントと紐付けが必要で方法を聞かれるので、Googleアカウントでログインします。
ブラウザが起動して、そこでログインすると紐付けが完了します。

初回セットアップと認証プロセス


テーマの選択: まず、好みのテーマスタイルを選択するよう求められます 。これは、CLIの視覚的な体験をカスタマイズする最初のステップです。

サインイン方法の選択: 次に、Geminiへのログイン方法を選択します 。

ブラウザ認証を選択します。
ブラウザウィンドウが自動的に開き、Googleアカウントでログインするよう促されるので、ログインすれば利用できるようになります。

これで、沢山の人がこの画面をアップロードしていると思いますが、この画面が表示されます。

後は、使うだけですが、この状態でどうやって使うの?って感じになります。
普通のチャットと同じようにチャットします。

伊藤園 おーいお茶 ピュアグリーン 600ml×24本 緑茶 ペットボトル

新品価格
¥1,794から
(2025/7/6 11:35時点)

ここから、実際のプロンプトとGeminiからの回答を、少しはしょりながら紹介していきます。

最初のコマンドは

ローグライクシューティングゲームを作成してください

ここから、やりとりです。

✦ 承知いたしました。Webベースで動作する、シンプルな2Dローグライクシューティングゲームのプロトタイプを作成しま
  す。

  まずは、コアとなるゲームの仕組みを実装します。完成後、ランダム要素やアップグレードなどのローグライク要素を追
  加していくことができます。

  計画の概要


   * アプリケーションの種類: Webベースの2Dシューティングゲーム
   * 使用技術: HTML, CSS, JavaScript (Canvas API)
   * 主な機能:
       * プレイヤー: 三角形のキャラクターをキーボード(WASDまたは矢印キー)で操作します。
       * 射撃: マウスクリックで、カーソルの方向へ弾を発射します。
       * 敵: 四角形の敵が画面の外からランダムに出現し、プレイヤーを追跡します。
       * 当たり判定: プレイヤーの弾が敵に当たると敵は消滅し、スコアが加算されます。敵がプレイヤーに触れるとゲ
         ームオーバーになります。
       * UI: 画面上に現在のスコアと、ゲームオーバー画面を表示します。
   * デザインとUX:
       * ミニマルなスタイルで、プレイヤー、敵、弾丸をそれぞれ異なる幾何学的な図形(三角形、四角形、円)で表現
         し、視覚的に分かりやすくします。
       * 直感的な操作性を重視します。

この計画で実装を進めてもよろしいでしょうか?

スマホ対応もしてください


✦ 承知いたしました。スマートフォン対応(レスポンシブデザインとタッチ操作)も考慮に入れます。

  計画を更新します。

  計画の概要 (更新版)


   * アプリケーションの種類: Webベースの2Dローグライクシューティングゲーム(PC・スマホ対応)
   * 使用技術: HTML, CSS, JavaScript (Canvas API)
   * 主な機能:
       * プレイヤー: 三角形のキャラクター。
       * 操作方法:
           * PC: キーボード(WASDまたは矢印キー)で移動、マウスクリックで照準の方向に射撃。
           * スマホ: 画面左側の仮想ジョイスティックで移動、右側の仮想ジョイスティックで照準・射撃。
       * 敵: 四角形の敵が画面の外からランダムに出現し、プレイヤーを追跡。
       * 当たり判定:
         プレイヤーの弾が敵に当たると敵は消滅し、スコアが加算。敵がプレイヤーに触れるとゲームオーバー。
       * UI:
           * あらゆる画面サイズに対応するレスポンシブなゲーム画面。
           * 画面上部に現在のスコアを表示。
           * ゲームオーバー画面を表示。
   * デザインとUX:
       * ミニマルなスタイルで、プレイヤー、敵、弾丸をそれぞれ異なる幾何学的な図形(三角形、四角形、円)で表現
         。
       * PCでもスマホでも直感的に操作できるUI。


  この更新された計画で実装を進めてもよろしいでしょうか?

はい

実行方法


 1. 作成された3つのファイル (index.html, style.css, game.js) を同じフォルダに保存します。
 2. index.html をWebブラウザで開きます。

操作方法


 * PC:
     * 移動: WASDキー または 矢印キー
     * 射撃: マウス左クリック
 * スマートフォン:
     * 移動: 画面左側をタッチして仮想ジョイスティックで操作
     * 照準・射撃: 画面右側をタッチして仮想ジョイスティックで操作

今後、このプロトタイプをベースに、以下のようなローグライク要素を追加していくことができます。


 * 経験値とレベルアップ
 * 武器や能力のアップグレード
 * 多様な種類の敵
 * ボスキャラクター
 * アイテムやパワーアップ


何か他に修正や追加したい機能はありますか?
経験値とレベルアップの機能を入れて、レベルアップで武器を増やすか、武器のレベルアップするか選べるようなシステムを入れてください

ここから対応を進めてもらって、実際のソースコードも生成された物が流れていきますが、量が多いのでここではコードを省略しています。

✦ これで、経験値、レベルアップ、武器のアップグレード機能の実装が完了しました。

  主な変更点:


   * 自動射撃: 武器は自動で発射されるようになりました。PCではマウスで照準を合わせ、スマホでは右のジョイスティ
     ックで照準を合わせます。
   * 経験値(XP): 敵を倒すとXPが手に入り、画面下部のXPバーが溜まります。
   * レベルアップ: XPが最大になるとレベルアップし、ゲームが一時停止します。
   * アップグレード選択:
       * レベルアップ時に、最大3つのアップグレード選択肢が表示されます。
       * 選択肢には、「新しい武器の入手(例:ショットガン)」や「既存武器の強化(例:連射速度アップ)」などが
         あります。
       * カードを1つクリック/タップして選択すると、ゲー``ムが再開します。

  ファイルを再度ブラウザで開いて、新しい機能を試してみてください。

という、状態で完成したと、お知らせが届きます。
省略していますが、実際にはコードなどもメッセージに入っています。

凄いのは、Geminiを実行したフォルダに自動でファイルを作って全部準備してくれます。こちらは何もしなくても完成します。
修正とかもファイルを自分で読み込んで、必要部分を自分で修正してくれます。
コードが分からなくても、ホントに作成可能です。

で、実際できあがった物を実行してみると、エラーが出たり、思ったように動作しない事も多々あるので、その現象を報告します。

実際にエラーが出て、その時のやりとりをです。

サントリー 機能性表示食品 伊右衛門 濃い味 2L×6本

新品価格
¥1,806から
(2025/7/6 11:40時点)

----------------------------------------
> レベルアップ時に次のエラーが出たので修正してください
  game.js:440  Uncaught TypeError: Cannot read properties of undefined (reading 'maxLevel')
----------------------------------------
✦ ご指摘ありがとうございます。エラー報告、大変助かります。


  エラーの原因は、レベルアップ時に武器の情報を参照するためのキーが正しく生成できていないことでした。「Basic
  Gun」という名前からbasicgunというキーを生成していましたが、正しくはbasicであるため、情報が見つからずにエラ
  ーとなっていました。


  この問題を修正するために、プレイヤーが武器を取得する際に、元のキー情報(basicやshotgunなど)も一緒に保存す
  るように変更します。これにより、武器情報を確実に見つけられるようになります。

  以下の手順で修正します。

   1. ゲーム開始時にプレイヤーへ渡す初期武器に、元のキーを追加します。
   2. アップグレード選択ロジックを、名前の代わりに新しいキー情報を使うように修正します。


  まず、startGame関数を修正します。
 ╭───────────────────────────────────────────────────────────────────────────────────────────────────╮
 │ ✔  Edit game.js:     // Reset and setup weapons... =>     // Reset and setup weapons...           │
 │                                                                                                   │
 │    529    // Reset and setup weapons                                                              │
 │    530    player.weapons = [];                                                                    │
 │    531    const basicWeapon = JSON.parse(JSON.stringify(WEAPONS['basic'])); // Deep copy          │
 │    532  + basicWeapon.key = 'basic';                                                              │
 │    533    basicWeapon.level = 1;                                                                  │
 │    534    player.weapons.push(basicWeapon);                                                       │
 │    535                                                                                            │
 ╰───────────────────────────────────────────────────────────────────────────────────────────────────╯
✦ 次に、アップグレードの選択肢を生成するgenerateUpgrades関数を修正します。
 ╭───────────────────────────────────────────────────────────────────────────────────────────────────╮
 │ ✔  Edit game.js:     // Option 1: Upgrade exist... =>     // Option 1: Upgrade exist...           │
 │                                                                                                   │
 │    436                                                                                            │
 │    437    // Option 1: Upgrade existing weapons                                                   │
 │    438    player.weapons.forEach(w => {                                                           │
 │    439  -     const weaponDef = WEAPONS[w.name.toLowerCase().replace(' ', '')];                   │
 │    439  +     const weaponDef = WEAPONS[w.key];                                                   │
 │    440        if (w.level < weaponDef.maxLevel) {                                                 │
 │    441            availableUpgrades.push({                                                        │
 │    442                type: 'upgrade',                                                            │
 │    443  -             weaponName: w.name,                                                         │
 │    443  +             weaponKey: w.key, // Use key instead of name                                │
 │    444                text: `Upgrade ${w.name} (Lvl ${w.level + 1})`,                             │
 │    445                description: weaponDef.upgradeDescription                                   │
 │    446            });                                                                             │
 ╰───────────────────────────────────────────────────────────────────────────────────────────────────╯
✦ 最後に、アップグレードを適用するapplyUpgrade関数を修正します。
 ╭───────────────────────────────────────────────────────────────────────────────────────────────────╮
 │ ✔  Edit game.js:     if (selected.type === 'new... =>     if (selected.type === 'new...           │
 │                                                                                                   │
 │    497                                                                                            │
 │    498    if (selected.type === 'new') {                                                          │
 │    499        const newWeapon = JSON.parse(JSON.stringify(WEAPONS[selected.weaponKey]));          │
 │    500  +     newWeapon.key = selected.weaponKey;                                                 │
 │    501        newWeapon.level = 1;                                                                │
 │    502        player.weapons.push(newWeapon);                                                     │
 │    503    } else if (selected.type === 'upgrade') {                                               │
 │    503  -     const weaponToUpgrade = player.weapons.find(w => w.name === selected.weaponName);   │
 │    504  +     const weaponToUpgrade = player.weapons.find(w => w.key === selected.weaponKey);     │
 │    505        if (weaponToUpgrade) {                                                              │
 │    505  -         const weaponDef = WEAPONS[weaponToUpgrade.name.toLowerCase().replace(' ',       │
 │           '')];                                                                                   │
 │    506  +         const weaponDef = WEAPONS[weaponToUpgrade.key];                                 │
 │    507            weaponDef.upgrade(weaponToUpgrade);                                             │
 │    508            weaponToUpgrade.level++;                                                        │
 │    509        }                                                                                   │
 ╰───────────────────────────────────────────────────────────────────────────────────────────────────╯
✦ これでエラーが修正され、レベルアップが正常に機能するはずです。


  お手数ですが、再度ブラウザでリロードしてお試しください。

表示が崩れて見にくいですが、イメージがつかめればという事で読み飛ばしてください↑

こんな風にソースコードで削除と、足す内容を行毎に示して、自動で修正してくれます。
今回はコードの量が少なかったので、全部記載しましたが、修正内容によっては結構な量のコードが示されます。

基本的に「ふむふむ・・・なるほどね~」って流しておけばOKですw

次にこのような指示を出します

敵のバリエーションを増やしてください。
以下のタイプを実装してください
・動きが速いタイプ
・耐久力が高いタイプ
・ゆっくり移動するが、耐久力が10倍のタイプ
  ご要望の3タイプ(高速、高耐久、超高耐久の低速)を追加します。これを実現するために、まず敵に「体力(HP)」の
  概念を導入し、武器には「ダメージ」の概念を導入します。

  実装計画:


   1. 敵の体力(HP)と武器のダメージを導入:
       * すべての敵にhpプロパティを持たせます。
       * 弾が敵に当たった際、即座に消滅させるのではなく、弾のダメージ分だけ敵のHPを減らします。
       * 敵のHPが0以下になったら、その敵を消滅させます。
   2. 敵タイプの定義:
       * 新しい敵の種類を管理しやすくするために、敵のステータス(HP、スピード、色、サイズ、獲得XPなど)を定義
         した設定オブジェクトを作成します。
   3. 敵の出現ロジックの変更:
       * spawnEnemy関数を修正し、定義した敵タイプの中からランダムで1種類を選んで出現させるようにします。

  それでは、実装を開始します。


  まず、敵のタイプを定義するENEMIESオブジェクトをgame.jsに追加します。それぞれの敵に異なる色と形(四角、五角
  形など)を与えて、視覚的に区別できるようにします。

✦ 以上で、敵のバリエーション追加が完了しました。


  変更のまとめ:


   * 4種類の敵:
       * スタンダード (赤色の四角形): 基本的な敵。
       * スカウト (黄色の三角形): 素早いが、HPは低い。
       * ブルート (青色の五角形): HPが高く、少しタフ。
       * タンク (紫色の八角形): 動きは遅いが、非常に高いHPを持つ。
   * 体力(HP)システム: 敵はHPを持ち、弾を受けると減少します。HPが0になると倒されます。
   * 体力バー: HPが満タンでない敵には、頭上に体力バーが表示されます。
   * 武器ダメージ:
     武器にはdamageプロパティがあり、これが敵に与えるダメージ量になります(現在はすべての武器で1)。


  ブラウザでindex.htmlをリロードして、新しく追加された様々な敵との戦いをお楽しみください。

といった、返答が来て、敵の種類が追加されました。
こんな感じのやりとりを、何度か行い、自機の武器バリエーションを増やしたり、敵の動きのバリエーションを増やすなど、ゲームとしての機能を増やしていきます。
何度かやりとりを行って、画像を用意した物に差し替えてもらって、タイトル画面とゲームオーバー画面を追加など、修正や追加を繰り返し、ある程度できあがった物が以下になります。

ローグライクシューティング

スマホでも遊べると思いますが、あまりプレイしていないので、動作がおかしかったらごめんなさい。
まだ途中経過なので、次のブログでもう少し完成度が高い物をお見せできればと思います。

Read more

「Gemini CLI」を使ってみる! その4 「Gemini CLI」を使い倒したら!!選ばれたのは「Claude」でした!!

「Gemini CLI」を使ってみる! その4 「Gemini CLI」を使い倒したら!!選ばれたのは「Claude」でした!!

タイトルで落ちが・・・・w 経緯 そもそもClaudeを使える環境があるので、Claudeは利用していたのですが、外部のサービスからClaudeを呼び出して使うタイプなので、「Claude Code」を利用することはできませんでした。 とは言え、元々proプランでは使えなかった上に、Windowsから直接使うこともできなかったので、外部サービスから使うのと、特に違いがなかったのですが、「Claude Code」がproプラン解禁!となって、話は変わってきました。 それであれば、proプランに契約して使ってみないなと思っていた矢先に、「Gemini CLI」が公開! こうなってしまうと、一旦無料は使うだけ使ってみたい上に、Windowsで簡単に使えるように設計されていて、 「Claude Code」と違ってGoogleアカウントで使えて、環境さえ整えればすぐ使えるハードルの低さが強いですよね。 そうなると、一旦「Gemini CLI」になっちゃったわけです。 ここからは、「Gemini CLI」をそれなりに使ってみた結果、無料で使えると言い つつも、ヘビーに使うと通常

ヴァンサバライクとか言ってますが、そもそもヴァンパイアサバイバーズって?

ヴァンサバライクとか言ってますが、そもそもヴァンパイアサバイバーズって?

Steam Vampire Survivors https://store.steampowered.com/app/1794680/Vampire_Survivors/ そもそもどのぐらい私は遊んだのか見てみました。 31.8時間 まだアーリーの頃、2個実績を残すぐらいまでやり込んで、終わった感じになってましたが、コンテンツが凄い勢いで追加されたので、実績だけ見ると序盤しか遊んでいない人になってますw ちなみに、ヴァンサバの動画は撮っていないので、公開されることは・・・無いかなw バージョンアップを繰り返し、コンテンツ量がこれだけ増えると、ヴァンサバライクのゲームも比較されちゃうと厳しいですね。 そんな『Vampire Survivors』(ヴァンパイアサバイバーズ)ですが、元になったゲームがあるとか、作者も語っているのでその辺の記事を参考にまとめました。 『Vampire Survivors』の元ゲーム 『Vampire Survivors』はシンプルながら中毒性の高い自動攻撃シューティングとして大ヒットを遂げましたが、その核となるゲームシステムや世界観に

「Gemini CLI」を使ってみる! その3 音を追加して見た目も豪華にしてみた

「Gemini CLI」を使ってみる! その3 音を追加して見た目も豪華にしてみた

今回は、効果音や曲を入れて、ゲームっぽくなるようにしてみました。 Suntory サントリー 天然水 特製レモンスカッシュ 炭酸 500ml×24本 新品価格 ¥2,427から (2025/7/6 11:52時点) 出来上がったゲームはこちら https://test.aisgm.me/test_prog/js/005/ 効果音は素材集や効果音を作るツールを利用して作成したりで用意しました。 「Gemini CLI」は自分でファイルを認識できるので、ファイル名を伝えて、弾の発射音とか爆発音って用途を伝えるだけで仕込んでくれます。 グラフィックも同じですね。画像を用意して指示するだけです。 弾とか画像が無い表示部分も、丸だけで無く豪華にしたいので、豪華にして欲しいとお願いしました。 その結果、弾もちょっと残像が出る感じになったり、見た目を淡く光る感じなったりと、細々とパワーアップしています。 音楽はせっかくなので歌ってもらいたいと思います。 歌詞は「Gemini CLI」に自分で作ってもらいます。 プロンプトはズバリ! 今作成中ゲームの主題歌の歌詞

「USB KVM(Sipeed NanoKVM-USB)」を購入しました

「USB KVM(Sipeed NanoKVM-USB)」を購入しました

KVMってなに? って事で、なんぞやってのを軽く解説 そもそもKVMには主に2つの意味があります。 1.KVMスイッチ: これは「Keyboard(キーボード)」「Video(ビデオ)」「Mouse(マウス)」の略で、複数のコンピュータを1つのキーボード、モニター、マウスで操作するための装置です。これにより、デスクスペースの節約や作業効率の向上が図れます。 2.Kernel-based Virtual Machine (KVM): これはLinuxのカーネルに組み込まれたオープンソースの仮想化技術で、Linuxをハイパーバイザーとして動作させ、複数の独立した仮想マシンを稼働させることができます。KVMを使用することで、Linuxだけでなく、WindowsなどのさまざまなOSを同時に実行できます。 で、今回は1です。2は何やら、色々と難しい感じですが、いわゆる仮想PCでPCの中にバーチャルのPCを沢山動かす仕組みで、このブログのサーバーなんかもその上で動いている感じです。(そんなサービスを利用しています) 1の話に戻ります。 昔はPC切替器なんて感じで売られていました。 ディスプ