はじめに
もともとはPython+Pyxelで作った自作ゲーム「Warship Shooting R」を、ちょっと前に知ったゲームエンジン「microStudio」向けに移植しようと思いついた。
ちなみにmicroStudioでは、独自の言語「microScript」で動く。(Pythonも使えるが)
PythonコードをmicroScriptに変換しようとしたが、さすがに手動でやるのは非常に手間がかかる。
そこで今話題のGemini CLIを使って変換しようとしたのだ。
本記事ではGEMINI.mdの記述の大切さと、意外とできるテクニックを確認したので紹介したい。
最初に試したGemini CLI
別のGemini CLIの試行で、Gemini自体はmicroScriptの言語仕様を理解しているようだったので、基本的な変換は問題ないだろうと踏んだ。
最初は単体でターミナルを開き、Gemini CLIに大雑把に頼んでみた。
@hoge.py このPythonファイルをmicroScriptに変換して、 hoge.msに保存して。
変換後のファイルをざっと見たところ、基本的な内容はよかったが、microScriptで重要なところがおかしかった。
self.enable_chara = {
"img_ss":false, "img_dd":false, "img_asdg":false, "img_cl":false,
"img_ca":true, "img_cvl": false,"img_cv":true, "img_bc":false, "img_bb":false
}
たとえばこういうプロパティがあったとする。これを大雑把なプロンプトで変換してもらうとこうなった。
this.enable_chara = {
"img_ss":false, "img_dd":false, "img_asdg":false, "img_cl":false,
"img_ca":true, "img_cvl": false,"img_cv":true, "img_bc":false, "img_bb":false
}
ちなみに、microScriptでは{}
の構文は使えない。Pythonでいうところの辞書型は、microScriptではObject
となる。本来はこうなってほしかった。
this.enable_chara = object
img_ss = false
img_dd = false
img_asdg = false
img_cl = false
img_ca = true
img_cvl = false
img_cv = true
img_bc = false
img_bb = false
end
どうやらGemini CLIに、きちんとmicroScriptの言語仕様を教えないといけないようだ。
GEMINI.mdにきちんと指示を書いた
自作ゲームのPythonのソース一式を別フォルダにコピーし、プロジェクトとして.code-workspaceやGEMINI.mdを置いた。
GEMINI.mdは次の内容とした。
# PythonコードからmicroScriptコードに変換するプロジェクト
## ショートカットプロンプト
入力プロンプトを入力したら、実際のプロンプトのほうの内容を実行して。
|入力プロンプト|実際のプロンプト|
|-|-|
|`conv2ms` | このファイルをmicroScriptに変換して、microscriptフォルダに同じ名前で保存して。|
## 基本の変換事項
- Pythonのロジックは可能な限りそのままで、microScriptに変換する。
- microScriptにない機能(import文など)は変換しない。(コメント文で説明するのみ)
- インデントは可能な限りそのまま変換する。ただし見やすさを考慮して必要に応じて修正する。
- 元のPythonファイルは読み取りのみとし、一切変更しないこと。
- 関数内の変数はmicroScript側では`local`を付けて宣言すること。
## 変換に関する補足事項
### microScriptの言語仕様の資料
[microScript programming](https://microstudio.dev/documentation/Programming/)
[API reference](https://microstudio.dev/documentation/API/)
[microScript cheatsheet](https://microstudio.dev/documentation/microScript-cheatsheet/)
[API cheatsheet](https://microstudio.dev/documentation/API-cheatsheet/)
### Pythonの辞書型の変換
Pythonの辞書型はmicroScriptではObjectに相当する。
変換は次のとおりにする。
- `{}` は `object end` に対応する。
- キーの""は不要。
- プロパティ間の","は不要。
例は次の通り。
`` `Python
a = {"a": 1, "b": 2, "c":"test"}
`` `
`` `microScript
a = object
a = 1
b = 2
c = "test"
end
`` `
### microScript側に対応するライブラリ、モジュールが存在しない場合
- **microScriptの言語仕様の資料** の各資料を参照し、代替可能な機能がある場合はその言語仕様やAPIを使う。
- もし代替可能な機能が存在しない場合、その部分はコメントとする。
### Python側のPyxelのライブラリの変換について
- `Pyxel` はmicroScriptには存在しない。そのため、Pyxelの機能を使っているコードは変換可能な場合を除き、コメントとする。
- その際、手動で変換しやすいよう、その処理で何をやっていたのかを1行程度で説明文のコメントを追加する。
ポイント1:Geminiが理解してない言語仕様はしっかり説明と例を書く
Pythonの辞書型の変換のセクションとして、次のように記述してさらに変換例も付け加えた。
{}
は object end
に対応する。
これでOKだ。
ポイント2:何回も同じプロンプトが続く場合は置き換え例を書くべし
今回の記事ではこれが主題だ。
自作ゲームのPythonファイルを1つ1つ変換していくのに、わざわざ
@hoge.py このPythonファイルをmicroScriptに変換して、 hoge.msに保存して。
長々と書くのは面倒だ。コピペだってうっかりミスでしくじることもあるかもしれない。
一番いいのはすべて一気に変換してもらうことだが、AIに全部まとめてやってもらうと痛い目を見るのは、きっとすでに経験なさっている方々がいらっしゃることだろう。
なので面倒ではあるが、1つ1つ変換→確認を繰り返していくことにした。
そのため入力作業の省力化をしたい。
Linux系だと aliasコマンドで特定のコマンドを置き換える方法がある。Gemini CLIでも同じ方法ができないか?
いわば ショートカットプロンプト 。
そこで上記GEMINI.mdに次のように書いた。
## ショートカットプロンプト
入力プロンプトを入力したら、実際のプロンプトのほうの内容を実行して。
|入力プロンプト|実際のプロンプト|
|-|-|
|`conv2ms` | このファイルをmicroScriptに変換して、microscriptフォルダに同じ名前で保存して。|
入力プロンプト | 実際のプロンプト |
---|---|
conv2ms |
このファイルをmicroScriptに変換して、microscriptフォルダに同じ名前で保存して。 |
これで、Gemini CLi上で次のように入力すると、実際のプロンプトとして実行してくれることを期待した。
入力 | @hoge.py conv2ms |
Geminiの解釈 | @hoge.py このファイルをmicroScriptに変換して、microscriptフォルダに同じ名前で保存して。 |
実際に実行した例がこちら。
どうやら問題なく実際のプロンプトの解釈を読み替えて処理してくれたようだ。
microScriptの言語仕様も辞書型からObjectに置き換えも問題ない。
終わりに
今回の目的はPythonからmicroScriptへの変換だ。どうやら問題なくできることが確認できたので、引き続き実行してゲームの移植作業を進めることにする。
そしてちょっとした作業をGemini CLIにお願いするにしても、GEMINI.mdを書くことの大切さを再認識した。
ウェブで使う生成AIやAPIで使うAIのシステムプロンプトにあたるのがGEMINI.mdということなのだろう。
実際の仕事の現場でも、部下やプロジェクトのメンバーへの適切な指示をするだろう。
AIを利用する際に、AIにきちんと誤解なく役割を遂行してもらうのに大事な指示書というわけだ。
あと即興で思いついたが、ショートカットプロンプトはうまく動作してよかった。このテクニックは他の目的でGemini CLIを使う際にも応用できそうなので、いろいろ試してみたい。