※2023/5/4追記 タイトル変更しました。
ここ一ヶ月ずぅーっと、ChatGPTと戯れていました。
世の中の人間が熱狂するのも分かります。
当方なんか、狂気乱舞している最中です。
さて、色んな使い方が摸索されているChatGPTですが、やっぱりプログラミングが一番のピンときますかね?
昔からゲームを作りたいと思っていてプログラミングの勉強をしていたのですが、完成には至ることはありませんでした。
向いていないのだろうと諦めていましたが、そこにChatGPTですよ!
今回は生成AI ChatGPTを作ったVBAのゲームの紹介と、少しだけゲームを作るまでの過程をご紹介します。
【ChatGPT×VBA】RPGゲームで遊べます!
まずは、こちらが作成したVBAマクロによるRPGのプレイ動画です。
なお、以下のボタンからゲーム(zip形式)をダウンロードできます。
\ 「InocchiQuest」はこちら /
ウイルス対策ソフトやWindowsファイアウォールから
このマクロめっちゃ怪しいけど動かしてええんか?
と聞かれる場合があるので、その場合は適切に対処をしてください。
一応、ウィルスチェックは通していますが、ダウンロードは…自己責任でお願いいたします。
さて、ゲームのルール説明をします。
本ゲームはスコア制です。より高スコアを目指してゲームを楽しんでください。
あー…言い忘れていましたが、バグはアリアリなのでご容赦をw
ChatGPTでRPGを作る方法とは?
今回は少しだけ生成AI ChatGPTでの開発方法の概要を紹介します。
そんなケチくさいこと言わないで全部教えてよ!
…という方もいると思いますが、一回の記事だけではとても説明しきらんのです。
ただ、勘所の良い人はこの記事を読んだだけでも同じか、それ以上のものをつくれるはずです。
ChatGPTなどのAIに対してこちらの意図するものを伝え実現させる技術のことをプロンプトエンジニアリング※というそうです。
いよいよ、プロンプトでRPGのVBAコードを生成!
さて、前置きが長くなりましたが、当方がVBAでRPGを作るために使ったプロンプトは以下のとおりです。
因みにこれだと、まだふわっとしていると怒られましたw
なので、追加のプロンプトで中身の処理部分だけコード生成をしてもらいました。
をタップ(クリック)
Option Explicit
' グリッドの幅と高さを定義
Const GRID_WIDTH As Integer = 10
Const GRID_HEIGHT As Integer = 10
' グリッドのセルごとに定義する内容
Enum GridCell
Empty
Enemy
Item
Pitfall
Door
End Enum
' キャラクターの初期位置
Dim playerX As Integer
Dim playerY As Integer
' キャラクターの状態
Dim playerHP As Integer
Dim playerHasKey As Boolean
Dim playerAttackPower As Integer
' グリッドの内容を保持する配列
Dim grid(GRID_WIDTH, GRID_HEIGHT) As GridCell
' 初期化処理
Sub Init()
' グリッドの内容をランダムに設定
Dim x As Integer, y As Integer
For x = 1 To GRID_WIDTH
For y = 1 To GRID_HEIGHT
Dim randValue As Integer
randValue = Int(Rnd() * 4) ' 0-3のランダムな整数を生成
grid(x, y) = randValue
Next y
Next x
' キャラクターの初期位置を設定
playerX = 1
playerY = 1
' キャラクターの初期状態を設定
playerHP = 10
playerHasKey = False
playerAttackPower = 1
End Sub
' キャラクターの移動
Sub MovePlayer(dx As Integer, dy As Integer)
' 移動先の座標を計算
Dim newX As Integer
newX = playerX + dx
If newX < 1 Or newX > GRID_WIDTH Then
' 移動先がグリッド外なら何もしない
Exit Sub
End If
Dim newY As Integer
newY = playerY + dy
If newY < 1 Or newY > GRID_HEIGHT Then
' 移動先がグリッド外なら何もしない
Exit Sub
End If
' 移動先のセルの内容によって処理を分岐
Select Case grid(newX, newY)
Case GridCell.Empty
' 空のセルなら何もしない
Case GridCell.Enemy
' 敵がいるセルなら攻撃する
AttackEnemy()
Case GridCell.Item
' アイテムがあるセルなら取得する
PickupItem()
Case GridCell.Pitfall
' 落とし穴があるセルならダメージを受ける
TakeDamage(3)
Case GridCell.Door
' 扉があるセルなら鍵を持っているか確認して開ける
If playerHasKey Then
' 扉を開けてクリア
MsgBox "クリア!"
Else
MsgBox "鍵が必要です。"
End If
End Select
' 移動先に移動する
playerX = newX
playerY = newY
End Sub
' 敵と戦う
Sub AttackEnemy()
' 敵にダメージを与える
' この部分は実装してください
End Sub
' アイテムを取得する
Sub PickupItem()
' アイテムの種類に応じて効果を適用する
' この部分は実装してください
End Sub
' ダメージを受ける
Sub TakeDamage(damage As Integer)
' ダメージを受けてHPを減らす
playerHP = playerHP - damage
If playerHP <= 0 Then
' HPが0以下になったらゲームオーバー
MsgBox "ゲームオーバー"
End If
End Sub
' 初期化
Randomize ' 乱数の初期化
Init()
' キャラクターを右に移動
MovePlayer(1, 0)
' キャラクターを下に移動
MovePlayer(0, 1)
上記のソースをEXCELマクロに貼っただけでは動きません。
このまま使うといろいろなエラーが出ます。
VBAの基礎知識がある人ならどうするべきか?が分かるはずですが、そうではない方は苦労すると思います。
予め申しておりますが、今回は概要まで。エラーの対処方法は割愛。
因みにエラー内容をChatGPTに聞くと教えてくれるので、この記事を元に自力で開発するのもアリです。
他にも書かれていない処理が結構あります。「敵と戦う」とか「回復薬を使用する」とか…。
次回の記事で最も原始的な状態で動作ができるところまでご紹介する予定です。
まぁ、待ちきれない方はChatGPTと協力すれば、簡易的に遊べるゲームが数時間で作れます。
さて、余談ですが当方は
ソースは読めるがVBAわからんから、どうしたらいいのかわからんゾ…
…となって、ChatGPTに聞いたり、ネットで検索したりしながら四苦八苦して、調べました。
…で、その細かな経緯も書くと記事的には面白いのですが、3万字程度の薄い小冊子の本ができそうなので敢えて解説は割愛しました。
ちょっと待って!ChatGPTで開発を始める前の心構え
イノッチさんだから作れたんじゃないの?
…と、思われるのも困るので、今更ながら当方のプログラミングスキルとChatGPTで開発する前に知っておくべきポイントを書きましたので、必ずお読みください!
こんなスキルの人がゲームを作りました!
ずばり、一言で言うと「昔ゲームを作りたくてプログラムの勉強をしたけど、ゲームが完成しなかった中途半端なスキルの持ち主」です。
自分で言ってて悲しい…。
因みに設計はあまり気にしなくても大丈夫です。
「こんなものを作りたい!」というイメージがあれば、開発はできます。
どちらかと言うと、「プログラミングの基礎を知っているか?」のほうが重要です。
知っている方がChatGPTに効率よく指示出しができるし、問題箇所の修正ができます。
もちろん、ズブズブの素人でも時間をかければ開発は可能です。
ChatGPTにわからない箇所を質問したり、ネットで調べる労力は膨大にかかりますが…。
でも、基礎知識はあるに越したことはないです。
本当に素人の方はまずはVBAの初心者向けの本やサイトで予習してから、本記事をご覧になると理解が早まります。
因みに当方もあまりVBAはやったことがなかったので、以下の本を1冊読みました。
VBAの基本が具体的に書かれているのでとても分かりやすかったです。
本当に2時間程度で基本が理解できたので、オススメですよ。
ChatGPTでVBAゲームを作る際に抑えておきたいポイント
VBAに限ったことではないのですが、ChatGPTにこちらの意図するコードを生成してもらうには…
- 専門的かつ一般的な用語を使う
- 具体的×箇条書き
- 嘘を正すこと
ChatGPTは優秀なので、「RPGを作りたいからプログラム書いて!」と、伝えると何かしらのヒントはくれます。
でも、こんなふわっとした内容で期待したゲームを作ってくれるのでしょうか?
お察しのとおり、「NO」です。
専門的かつ一般的な用語を使う
効率よくこちらの期待値に近いコードを生成させるには、専門的かつ一般的な用語を使うことです。
言ってること矛盾してない?
いいえ、してませんよ♪
例えば、今回はエクセルのVBAマクロでゲームを作る前提ですが、
よりも
のほうが、専門的かつ一般的です。
人間の感覚で言うと、「マス」でも「セル」でも基本的に通じないわけではありません。
ChatGPTも「エクセル」というキーワードがあれば、理解してくれる可能性は高いのですが、素直に「セル」と書いたほうが確実に意図が伝わります。
さて、専門的かつ一般的と表現した理由は専門的な上にマニアックな言葉は避けましょうという意味です。
ネットで検索しても殆ど出てこない言葉はChatGPTも認識率は低い(はず)ですからね。
具体的×箇条書き
どんなRPGを作りたいのかをしっかり定義しましょう。
当方はできうる限り簡潔にRPGの仕様を明確化することに重きを置きました。
冒頭に書いたプロンプトの以下が特に大事です。
セルサイズの指定、フィールドとして利用したいセルの数。セルには何があって、どうするとクリアなのか。
ここまで書いてあれば、一応ChatGPTはソースコードの生成をしてくれます。
ゲームの最低限のルールを言語化することが大事です。
できれば箇条書きで、5W1Hを意識しながら、端的にルールをChatGPTに伝えてください。
嘘を正すこと
使っている人はご存知だと思いますが、ChatGPTはさらっと嘘をつきます。
プログラムに関しても例外ではありません。
大体動くんですよ。
でも、たまに引数(※特定の処理を呼び出すために使用する値などのこと)が足りないとか、ほんのり文法が間違ってるとか…あります。
実行するとエラーが出るので、出たエラーの内容を伝えて改善案を提示するように指示すると、改善してくれます。
基礎知識がないと嘘を見抜けなかったりするので、ここで気合が必要です。
諦めずに聞くか、自分で調べるか…!
最後にInocchi Questについて
当方が作成したゲームは戦闘用にフォームが開いたり、魔法や敵のグラフィックがあったりしますが、ここまで求めていないのであれば、実は数時間で開発できます。
元々、生成AI ChatGPTが作成したソースコードはセルを移動しながら、セルにイベントがあればメッセージがでるだけの単純なゲームを想定しています。
イメージ的には簡易版「風来のシレン」が近いかな?
当方の場合、イメージしていたゲームを作るために、ネットの記事を読み漁り、先にご紹介した本以外にもなんか分厚い本を読んで、50時間くらい費やしました。
気がつくと、自分でソースコードかけるようになってしまいました。
…俺はどこに向かっているんだ…とか、一瞬思いましたが凄い勉強にはなりました。
ChatGPTはプログラミングのメンターとしての役割をしっかり担ってくれたようです。
そんなつもりなかったんだけどねw
ということで、長文駄文失礼!
今回はここまで!
残念パパこと、イノッチでした!
ではまた!
コメント