🧯

GeminiProにRust(WASM)で動くAgar.ioを作らせてみた(コードあり)

2024/06/06に公開

みなさん Google AI Studio 使っていますか?

テキスト、画像だけでなく動画や他のファイルを食わせて Gemini に質問したり指示したりできる優れたwebサービスです。

ただ、注目すべきは かなり長いプログラムのコードを食わせてそれを解析できる ということです。

以下は slither.io というブラウザゲームのjsファイルを丸ごと食わせて解説してもらった例

コードを全部読まなくても、Gemini に解析してもらってどういう処理があるとか、サーバーとどんな通信を行っているのかを聞くとかなり精度良く回答が帰ってきます。

つまり、コードの中身をほとんど読まなくてもだいたい理解できるってことです

それだけじゃありません

Geminiに解析させた結果を得るだけでなく、そこから新しいものを生成することだって可能です。

以下はとあるjsコードの難読化されたフィールドが何を意味するのかを推測してもらいその結果をJSON形式で出力してもらったものです。

これによって難読化が施された値を置換したりする際の入力データを自動で生成できました。

しかもかなり精度がいいです(間違っている箇所もあるけど)

そこで思いついたのが、

アレ?もしかしてコードの移植さえも全部Geminiに書いてもらえるんじゃね?

というものです。

もはやコードも何も自分で書かずに、認識してもらったプログラムを別の言語で書き直してもらうことすら完璧にできるのではないか。そう思ったのです。

GeminiにAgar.ioというゲームをRust+WASMに移植させる

本題です。

今回はGeminiにAgar.ioというゲームのコードを食わせてRust+WASMで動作できるバージョンをフルで書いてもらうというものです。

Agar.io(アガリオ)とは、7,8年前くらいに海外で大流行したブラウザゲームです。

プレイヤーは自分の丸いユニット(細胞)を操作して、小さい敵を食べながら大きくなっていくというシンプルなゲームです。

このゲームの動画だけを投稿して登録者が100万人を超えるチャンネルが誕生するくらい当時は海外で人気でした。今は過疎ゲーになってしまいましたが。。

さすがにAgar.ioはチート対策などでクライアントのJSコードがかなり複雑なので、今回はAgar.ioを模倣して作られたゲームクライアントである Cigar2 を食わせたいと思います。

https://github.com/Cigar2/Cigar2

当時Agar.ioのプライベートサーバーが乱立しましたが、このCigar2はそれによく使われていました。

サーバーも立てればほとんど本家Agar.ioと同じようにプレイできるものです。

このCigarを Google AI Studio に食わせて、全く同じことができるコードをRustで書かせてみようと思います。

Geminiにゲームクライアントのソースコードを食わせる

Google AI Studio では自分のGoogle Driveにファイルをアップロードすると、それをインポートして使うことができるようになっています。

まずは、cigarのjsファイルである main_out.js をそのまま食わせてみました。

それらしいコードが長々と生成されました。

オリジナル

Geminiが書いたコード

割とそのままて感じですけど、しっかりRust+WASMとして動作する形で書いてくれています

ただ、やはりクライアントの処理がいろいろある分、やっぱりミスするところはあるみたいでそのままコピペしてビルドしても動きませんでした。

食わせるコードを削って必要最低限の処理だけ残す

さすがにフルで食わせると最後までRust化したコードは書いてくれたもののコピペするだけでビルド突破できないので、いらない部分をかなり削りました。

このようにチャットやリーダーボード(ランキング表示)の描画は、別になくてもゲームをプレイすること自体はできるのですべて消し去りました。

削ったコードをGeminiに食わせて再チャレンジです

rust+wasmでこれと全く同じ動作をするコードを書いてください。
websocketでサーバーとメッセージを送受信し、その情報をもとにcanvasに描画するということができればとりあえずOK
ただし、完璧に動作するコードを書いて

けっこう適当ですがこんな指示をしました。

700行以上にもなるRustのコードと、WASMにビルドした後にそれをwebページで読み込むためのhtmlまで用意してくれました。

なにがすごいって、Geminiはタイムアウトせずにこれをノンストップでやってくれたこと

もちろん処理が長すぎるとコードを出力してる途中でタイムアウトはあるのですが、1回の持続力はかなり長い気がしてます。

ChatGPTだと出力が長いとタイムアウトなんてすぐにしちゃうので、Google AI StudioでGeminiを動かしたときこれが一番感動しました。

Geminiに書いてもらったRustコードをWASMにビルドする

結論からいうと、やっぱりコピペだけでビルドは通らなかったのでいくつか手直ししました。

   Compiling cigar-rs v0.1.0 (/workspaces/fearnot-rs/cigar-rs)
error[E0425]: cannot find value `ctx` in this scope
   --> src/lib.rs:443:29
    |
443 |             (self.mouse_x - ctx.canvas().width() as f64 / 2.0) / self.camera.scale + self.camera.x;
    |                             ^^^ not found in this scope

...

ビルドしたときにターミナルに表示されたエラーをまるごとコピって食わせて、「これ修正して」って頼むと直したコードをまた書いてくれます

エラーが出たらターミナルのログをコピペしてGeminiに修正箇所を教えてもらうを繰り返すことで、ついにビルド成功しました。

ちなみにビルド成功したコード完全版はこちら!

https://gist.github.com/LostMyCode/57732f9a384bcdda7acfc67622001d35

実際にビルドできたやつをブラウザで開いてみる

少し手直しが必要だったりしましたが、Rust+WASMにほぼコードを書かずに移植したCigarクライアントが動作しました。

普通にサーバーと通信してオンライン対戦することもできました。

もちろん食わせたjsファイルと全く同じような処理をしているだけなのですが、知識がほとんどなくてもこんなに簡単に移植できてしまうとは!

注意点: パフォーマンスはむしろ悪化する

今回 Rust + WASM にコードをAIにコードを書き直させてみましたが、あくまでも実験的にやったものでWASMになるからパフォーマンスが上がるとかは全く無いです。

なんなら、WASMにしたことでパフォーマンスは落ちるでしょう。

理由はWebSocketでサーバーと通信する処理やHTML5 Canvasに描画する処理は、結局全てjs側の関数を呼び出す必要があるからです。

WebSocketでメッセージを処理するコードをWASMで記述してたとしても、WASM側のメモリにメッセージをコピーする手間が発生するし、Canvas毎フレーム描画するのに何回もjs側に呼び出しするなんて非効率です。

つまりパフォーマンスの観点ではなんら利点はないといえます。

ゲームのロジックを隠蔽したりするのには使えるかもしれませんね。(実際本家Agar.ioはチート対策のために多くの処理をWASM側でやっている。パフォーマンスは悪いけど仕方ない)

もうちょい粒子の移動の計算みたいな複雑なロジックがあったらWASMの恩恵を得られたかもですがシンプルなゲームなので..

まとめ

今回はゲームクライアントの移植をほぼ自分の手を動かさずに Google Gemini Pro にやらせてみました。

動画や画像を食わせて解析できることが割と注目されがちですが、実はコードを食わせて解析したり新しいものを作ったりすることもサクッとできちゃう最強のツールなんですよね。

Google AI Studio こんな使い方もできるので色々試してみてはいかがでしょうか!

今回 Gemini Pro に生成させたコード完全版はこちらからご覧いただけます。

https://gist.github.com/LostMyCode/57732f9a384bcdda7acfc67622001d35

余談: 一発でうまくいったように書いたけど実は10回くらいGeminiに頼んでますw

Discussion