
怠け者の大学4年生がChatGPTに出会い、ノリでプログラミングに取り組んだら、教授に褒められ、海外論文が認められ、ソフトウェアエンジニアとして就職できた――。
現在はSEとして働く大塚あみさんが、大学時代に始めた、毎日1本、新しいアプリ(作品)を作り、X(旧ツイッター)に投稿する「#100日チャレンジ」で、ブロック崩しを作成した際のエピソードを、書籍『#100日チャレンジ』より紹介します。
※本稿は、大塚あみ著『#100日チャレンジ 毎日連続100本アプリを作ったら人生が変わった』(日経BP)を一部抜粋・編集したものです。
どこから手をつけて直せばいい?
11月19日(日)、午前10時。駅前にある近所のカフェは、朝の喧騒がひと段落し、静かで心地よい空気が流れている。窓際の席に座り、ノートパソコンを広げた私は、右隣に置いたコーヒーカップからの湯気が揺れながら消えていくのを眺めつつ、今日は何を投稿しようか考えていた。
カフェに来るのは集中できるからというのが主な理由だが、正直言って、もう1つ大きなわけがある。自炊をするのが面倒なのだ。
自炊だと買い物や洗い物といった家事が増えて煩わしいし、そもそも家には調理器具どころか食器すらない。だから土日は外で1日中過ごすことが多い。
私はノートパソコンの電源を入れた。100日チャレンジも23日目。いろいろなゲームを作ってきたものの、最近は制作時間の増加に悩んでいる。
「Day6:キャッチゲーム」は100行程度の、約6時間でできた作品だ。一方、「Day15:砲弾」や「Day18:単語帳」のような最近の作品は300行を超え、制作時間も10時間を超えるようになってしまった。作りたいゲームやツールの案はまだあるので、それについては当面大丈夫そうだけれど、もっと先を見据えると「その日暮らし」的な今のやり方では、ダメになるときが来そう。
制作時間と作品案の両方で行き詰ってしまうのではないか? そんな危機感を感じながら、今日の作品を決める。
「ブロック崩しを作ってみようかな」
早速ChatGPTに「ブロック崩しを作って」と入力した。すると、Pythonのコードがずらりと表示された。それをコピペして実行すると、ボールとパドルは表示されたものの、ブロックのないブロック崩しが出てきた。
ちょっと途方に暮れる。これはどこから手をつけて直せばいい? そのとき、数日前の伊藤先生との会話が頭をよぎった。
成長した自分に感動を覚える
11月13日(月)。授業が終わったあと、伊藤先生と一緒に昼食を取った。二学期が始まって以来、月曜と木曜に先生とお昼を食べながら、次の学会のことや自分が作ったプログラムについて話すのが習慣になっている。
その日は、Day15で作成した砲弾の動画を見せた。先生は興味深そうに画面を見つめていたが、動画が終わるとこう尋ねた。
「このプログラムはどうやって動いているの?」
「Pygameで動いています」
そう答えると、先生は少し困ったような顔をして言った。
「そうじゃなくて、このアニメーションはどのようなアルゴリズムで動いているのか、ということだよ」
私は言葉に詰まる。砲弾の軌道は理解したけれど、アニメーションについてはよく分かっていない。次のように答えるしかなかった。
「中身をよく調べていないので分かりません」
先生はさらに驚いた様子で、次のように聞いてくる。
「自分のプログラムなのに、どのように動いているのか分からないのか?」
その言葉が胸に突き刺さった。
「プログラムの中身をちゃんと理解しないといけないな......」
伊藤先生の言葉を念頭に置きながら、過去に作ったプログラムを見返してみた。すると、どのプログラムにも共通している部分があることに気づいた。
「この繰り返しの部分、どこかで見たことがあるような……」
私はChatGPTに聞いてみた。
-----------------------------------------
このwhileループって何をしているの?
-----------------------------------------
それはゲームループと呼ばれるものです。
-----------------------------------------
ゲームループ? 初めて聞く言葉だ。さらに詳しく尋ねると、ゲームループには「入力処理」「更新処理」「描画処理」「フレームレートの管理」という4つの機能があるという。
私は一つひとつの機能について質問し、例となるプログラムを適宜出力してもらいながら、理解を深めていった。
たとえば、フレームレートの管理。1フレームが1/60秒(60fps)だとすると、ボールが1フレームでY軸の向きに5ピクセル移動する場合、1秒間だと300ピクセル移動することになる。画面の縦幅が600ピクセルなら、2秒で上から下まで移動する計算だ。
「つまり、移動速度の値とフレームレートを調整すれば、ゲーム内のオブジェクトの動きを自在にコントロールできるってことか」
まるでパラパラ漫画のようだ。1コマ1コマ描いていくことで動きを表現しているのか。ただ、パラパラ漫画と違うのは、1枚1枚をすべて描くのではなく、それらの差分を関数で指示すること。つまり、全体を考慮しながらも、1枚ごとにどう動くのかをプログラムしないといけないのか。
ブロックの配置も考えてみた。手動で一つひとつ位置を指定する方法もあるが、ブロックの数が多いと非効率だ。そこで、二重ループを使ってブロックを動的に生成する方法を試してみた。1段目は赤のブロック、2段目は黄色のブロック、3段目は青のブロック、さらにこれを繰り返すようにする。
試行錯誤しながら、少しずつプログラムを完成させていく。最終的に、ボールがパドルにぶつかるときちんと反射し、ブロックに当たるとそのブロックが消えるようになった。
できあがったプログラムを実行した様子を動画にし、Xに「Day23:ブロック崩し」として投稿した。試行錯誤しながらも、ブロックが崩れる様子までをしっかり実現できた。企画当初の目標「一定レベルの作品を投稿する」を果たせて安心する。同時に、わずか23日でここまで成長した自分に感動を覚える。