
怠け者の大学4年生がChatGPTに出会い、ノリでプログラミングに取り組んだら、教授に褒められ、海外論文が認められ、ソフトウェアエンジニアとして就職できた――。現在はSEとして働く大塚あみさんが、大学時代にChatGPTでインベーダーゲームを作ったときのエピソードを書籍『#100日チャレンジ』より紹介します。
※本稿は、大塚あみ著『#100日チャレンジ 毎日連続100本アプリを作ったら人生が変わった』(日経BP)を一部抜粋・編集したものです。
ChatGPTでインベーダーゲームを作ってみる
私の最近のプログラミング方法は、1つの機能について数百行のコードを生成し、その中から最もよいものを選び出し、それを動かしながら改善を繰り返す、というものだ。1日に1万行を超えるコードを生成し、その中からわずか400行程度のゲームやツールを削り出す。
まるで芸術家の創作活動のようも思える。作業効率は悪いながらも、今の私にとってなるべく高品質なプログラムを作り上げる手段がこのやり方なのだ。
朝9時から夜6時までの9時間、私はひたすらプロンプトを打ち続ける。ChatGPTの使用回数制限があるので3時間に25回しか使えない。9時間で75回プロンプトを送信できる計算だけれど、それはほぼ1日中ChatGPTに張り付いていなければならないということでもある。
そのため、ミーティングなどの予定があるときには、回数制限がかかるまでプロンプトを打ち続けてから、制限されている最中に予定をこなす。予定がないときでも、回数制限がかかると仕方なくコンビニに足を運んだり関連情報をまとめたりして、時間を潰すようにしていた。
プログラムが大きくなればなるほど、バグ修正により多くの時間がかかることも気がかりだ。ChatGPTに何度も何度も修正を指示することになる。
先日作った飛行機のプログラムも同様で、コードが大きくなるにつれてバグの数も増加し、直す回数も膨大になった。しかも同じ部分のコードを修正する回数が増えている。
コードの行数が増えると複雑性が指数関数的に増加するのでは? それに伴ってバグも増えるのでは? そんな仮説が思い浮かぶ。
インベーダーゲームにスプライトを適用する──。この試みは、「効率と品質を向上させる」という、今直面している課題を解決するヒントを見いだすためのものだ。
私は早速インベーダーゲームのコードを書き始める。プレイヤーのキャラクターを左右に動かす基本的な処理は過去に作ったことがある。
ChatGPTに簡単な指示を与えた。
-----------------------------------------
プレイヤーを左右に動かすスプライトを作って。
スペースキーを押すと弾丸を発射するようにして。
-----------------------------------------
ChatGPTが即座にコードを生成してくれた。画面に表示されたキャラクターは矢印キーでスムーズに動きつつ、スペースキーを押すと弾丸を発射する。まずはこの基本操作が問題なく動作することを確認し、次は敵キャラクターの追加に取りかかる。
-----------------------------------------
敵キャラクターを追加し、上から降りてくるようにして。
-----------------------------------------
この段階で、ゲームはだんだんと形を整え始める。プレイヤーのキャラクターは左右に動きながら弾丸を発射し、敵キャラクターもきちんと降下してくる。思った以上にスムーズに進んでいることに少し驚く。
-----------------------------------------
弾丸が敵に当たったら、弾丸と敵を消して。
-----------------------------------------
ここでもすぐに正確なコードが返ってきた。弾丸が飛んでいき、敵にヒットする。直後に敵は消滅。これでゲームの基本的な仕組みは整った。スプライトを順次追加し、簡単な調整やバグの修正をするだけで、ゲーム制作がスムーズに進んでいく。
「思ったより簡単だな......」
順調に開発が進むことに気をよくし、ふと新しいアイデアが浮かんだ。
「ミサイルを追加してみたらどうだろう?」
これまでは、プレイヤーがスペースキーを押すと、弾丸が発射された。それだけでなく、mキーを押すとミサイルが発射され、最も近くにいる敵に飛んでいくようにしてみたい。
-----------------------------------------
mキーを押したら近くの敵に向かって飛んでいくミサイルを作って。
-----------------------------------------
一瞬、ChatGPTがどのように対応するか不安がよぎったが、あっさりと回答が返ってきた。コードには、mキーを押すとプレイヤーの現在位置からミサイルが発射され、すべての敵との距離を計算してから、最も近い敵に向かって一直線に進む処理が含まれていた。
早速そのコードを実装して試してみると、まさに思い描いた通りに動作した。プレイヤーがmキーを押すと、ミサイルがシュッと飛び出し、最寄りの敵に向かって的確に突進していく。4、5回プロンプトを書き直したり出力し直したりしたけれど、それでも大した苦労もせずに容易に実現できた。
「こんなにあっさりできるとは......」
適切なスプライトの導入がプログラムの効率化に貢献することを実感した。以前は一つひとつのモノを手作業で調整し、その複雑な動作を管理しなければならなかった。そのために、プログラム全体を見通す必要もあった。
しかし、スプライトを使うことで、その煩雑さが大幅に軽減された。プレイヤーのキャラ、敵、弾丸、ミサイルといったモノが、それぞれ独立してスムーズに動作しているのを見ると、これまで積み重ねてきた試行錯誤がようやく報われたように感じた。
ChatGPTに頼りすぎる危険性
その達成感の裏に、もうひとつ何か気づきのようなものが浮かんでいた。なかなか表現しにくいが、「ChatGPTに頼りすぎる危険性」といえるかもしれない。
これまでのプログラムの作り方を振り返る。プログラムに取りかかるときや行き詰まったとき、いつもChatGPTに頼って漠然とした質問を投げかけ、答えを導き出そうとしていた。その際、ChatGPTが返すコードが毎回異なることに混乱していたのも思い出す。同じようなプロンプトを投げかけても、毎度違ったコードが返ってくる──そのたびに考え込まなければならなかった。
今日の作品作りはどうだったか?
今回は、スプライトの概念を自分でしっかり理解して具体的な指示を与えることで、これまでよりスムーズに回答、つまり動くコードを得ることができた。
同時に、複数の異なるコードが得られた場合にも、その中身を見て実際に使用するものをしっかり選べたと思う。そうであるなら、ChatGPTの回答の多様性こそがよいコードへのヒントになり、それを活かして使い手である私自身が、どのコードが最も適しているのかを判断すればいいのだ。
ChatGPTは、あくまで私の理解を深めるための「支援ツール」あるいは「補助線」に過ぎない。最終的には私自身がどう作品を仕立て上げるかが重要だ。
「ChatGPTは使い手の能力以上のことはできない」
この言葉が、頭の中でゆっくりと浮かび上がってきた。ChatGPTは確かに強力なツールだけれど、その力を適切に引き出すには、使い手となる私自身がしっかり課題や問題を理解したうえで、的確な指示を出す必要がある。そして、その指示が本当に的確かどうかは私の理解力と洞察力にかかっている。結局のところ、私の理解力と洞察力が試されるのだ。
「ChatGPTを使ったプログラミングに何かしらの限界があるとすれば、それは私自身の能力に依存する」