数挟みオセロについてのメイキング的な何か
プログラミング技術を身に付けてから、ずっと思ってはいたんです。仕事ではなく、自分の趣味で何か作ってみたいなって。ただ、仕事でプログラミングをしていますから、自宅でもプログラミングをするだけの意欲は流石に沸いて来なくって、今まで作ってこなかったのですが。
因みに、きつい時期は、毎日22時~23時まで残業して休日出勤もするなんていうハードなスケジュールだった事もあります(そんな状態でも小説は書いていた。馬鹿かお前は……)。
流石に無理でしょ?
(まあ、世間には、そんな状態でもプライベートでプログラミングをしている猛者もいるらしいのですが)
ただ、ここ数年、働き方改革や人員増強、生成AI登場の影響もあって随分と仕事が楽になり、「これならできるのじゃ?」なんて思い始めました。生成AIを使えば、かなり楽に作れますしね。更にそんなタイミングで長編を書き終えて、「ちょっと小説は一休みしようかな?」なんて気分にもなって来ました。
そして、これは単なる偶然なのですが、少し前に書いた「いじめは”病”と定義するべき」って作品の作中で登場人物が作る架空のゲームとして、僕は“数挟みオセロ”というのを考案していたのです。
「小説の中の架空のゲームを実際に作ってみました」
みたいな遊び心のあるノリって個人的に大好きなんです。それで、ほとんど勢い任せで作り始めてしまいました。
まずは一体何で作るか? で、軽く悩みました。一般の人が直ぐに遊べた方が面白いので、「エクセルとVBA」、「HTMLとJavaScript」の2つを考えたのですが、まるっとコピペして直ぐ遊べる点を考慮して、「HTMLとJavaScript」にしてみました。
二つとも、僕の専門の言語って訳じゃないのですがね。更に断っておくと、ゲームを作るのは初体験です。
さて。
仕事でAIを使っているので、なんとなくAIの特性は分かっています。AIは長文が苦手です。短い指示なら、勘違いもよくしますが、大体“使える”返答をしてくれます。ですが長くなると辻褄が合っていなかっり、当初の目的を忘れてしまったりします。
因みに、仕事で既存にある旧くなって来ているアプリをAIにまるっと新しいプログラミングに直してもらおうって計画があったのですが(別会社に発注したので詳細は不明です)、AIがプログラムを読み取って作成した仕様書が間違いだらけだったので計画は中止になりました。また、新規の開発プロジェクトのプログラミングを全てAIに任せるって計画もあったのですが(これは他部署なので詳細はやはり知りません)、これもリソース不足で中止になりました。
世間では「近い将来、プログラマーやシステムエンジニアが不要になる」なんて主張も頻繁にされているようですが、今の段階ではまだそうはならなそうです。システムってただ単に“AIがプログラミングを書いてくれる”だけじゃ成立しないのですよ。
人間が指示を出せば、AIは何かしら動くものを作ってくれはするかもしれませんが、それが人間の意図通りなのか確認するのが難しく(テストケースを全パターン作ろうと思ったら、天文学的な数字になります)、またメンテナンスや運行を考えると人間に理解可能なプログラミングじゃないといけません。
つまり、AIにプログラミングを出力してもらう為には、AIが正確に意図を理解できるような比較的シンプルな指示を出す必要があり、その内容をエンジニアがチェックしないとちゃんとしたものにはならないのです。
今回も凡そはそんな流れで作っています。
まずは大雑把に、生成AI(Microsoft Copilot)に「このゲームを、html形式のファイルで、javascriptで制作しようと思います。
まず、盤と白石の黒石を置くスペースをtableで作成し、javascriptの入力エリアのあるコードが欲しいです。
盤用のテーブルはスタイルシートを適応させ、見栄え良くしてください。
枠線は黒、背景色は薄緑でお願いします」
ってお願いをして、ざっくりとコードを生成してもらいました(javascriptの入力エリアを画面から入力できるテキストエリアとして出して来てビビりました)が、全体の設計方針や概念は僕が考えました。
石の情報はクラスを生成してそこで扱う事、全ての石の情報を持つリストを作成してそれで管理する事、盤の情報を2次元配列で管理する事、履歴を管理するクラスを作り、そこにアンドゥやリドゥの機能を実現する事…… 等々は僕が決めた方針です。
内部で石の情報を管理し、「盤に石を置く」、「石のひっくり返し」、「アンドゥ」などの処理が終わった後に、その情報を基に再描画を行うという設計思想ですね。ちょっと中二病ちっくに表現すると、「画面に見えているのは飽くまで仮の姿で、本体は内部の情報にある」なんて感じです。
基本的には“全ての石の情報を持つリスト”を正としています(だから、履歴を管理するクラスもこの情報しか持たない)。盤の情報を管理する2次元配列とで、石の位置情報は2重管理になってしまいますが、処理の利便性を考慮してこれは許容しました。原理的には“全ての石の情報を持つリスト”だけで管理可能ですが、石と石の位置関係の処理は2次元配列の方が楽です。石を置ける位置を判断するのも(2次元配列は、マトリクス表みたいなもんだと思ってください。なので、オセロの盤情報を表現できるのです)。
因みに、プログラミング上のオブジェクトは、複数のリストに同時に存在させる事が可能です。というか、より正確には、単なる紐付けをつくるだけで実際にリストに入っている訳じゃないのです。だから、どれか一つのリストに入っている石の値を変更すると、全てのリストのその石の値が変わります。この辺りの理屈は、プログラミングを学ぼうとしている人は理解しておいた方が良いかもしれません。
後は細かく少しずつ指示を出して、AIが出力するコードがこちらの意図通りかを確認しながらそれを適宜修正して足していきました。
ちょこちょこ出力し直してもらわないと駄目なところがありましたねぇ……
指示の内容が複雑だったり、AIに指示を出すまでもない処理に関しては、僕がそのままコーディングしましたが。
実は本格的にこれだけJavaScriptを触るのは随分と久しぶりで、「うお! 便利になっている!?」ってちょっと驚きました。計らずも仕事の勉強になってしまった。いえ、もう十年くらいjQueryっていうJavaScriptを拡張して作成されたライブラリを主に使って来たもので。
ほとんど問題なくコーディングは進んでいたのですが、“石がひっくり返る”アニメーションだけが上手くいきませんでした。専門じゃないので知らなかったのですが、普通はJavaScriptの処理が終わらないと、描画が画面に反映されないらしいのです。もちろん、解決策もあるらしいのですが、少し試してみた結果、上手くいったりいなかったりで不安定な上に履歴の保存が正常にできなくなるというバグが発生したので諦めました。いくつか解決策も考えたのですが、凝り始めるとコストがかかり過ぎるので、他の小説、エッセイ、漫画なんかの創作にかける時間がなくなってしまう……
そんなこんなでコーディングは大体終わりました。そこで対戦がしてみたいと思い、AIに対戦を申し込みました。“画面を共有”ってのがMicrosoft Copilotにあるので、それを利用すればできるかなぁ?って、簡単に考えていたのです。が、どうもMicrosoft Copilotには見えないみたい……
そこで諦めていれば良かったのですが、どうしても対戦がしてみたかったので(そんなん頼める友人がいないんです)、Microsoft Copilotと対戦をする為の機能を追加実装する事にしました。具体的には、相手の石の色と使えるナンバーと置く事が可能なマス、それと現在の盤面をテキスト情報で出力する機能を実現したのです。対戦前にルールをAIに伝え、後はそのテキストの情報でAIに指示を出していけば対戦ができます(AIの“手”は、こっちで操作してあげなくちゃ駄目ですが)。実際にやってみたらテキストをコピーするのがいちいち面倒くさかったので、テキストをコピーするボタンも作りました。
これ、それなりに試行錯誤をしました。AIは対戦している事を忘れていきなりアドバイスをし始めたり、存在しないナンバーを選んだり、置けない場所に石を置こうとしたりするのです(冒頭でも述べましたが、AIは長くなると整合性が取れなくなっていくみたいです)。だから、毎回、対戦しているって事を教えて、ゲームの状況を事細かに伝えないといけなかったのですね。
……この機能の追加さえなければ、もう少し早く仕上がっていました。純粋にゲームだけなら五時間もかからなかったと思います。AIを使うとやっぱり速いですね。因みに、Microsoft Copilotと2回、ChatGPTと1回対戦しましたが、ちゃんと試合になりました。AI君、とっても弱いですが。
ゲーム作りはとても楽しかったですが、とりあえずは満足しました。気が向いたら、今後も追加していくかもしれません。
しかし、良い時代になったものですね。
子供の頃、漫画も描いてみたいと思っていたし、ゲームも作ってみたいとも思っていました。コストと自分が一番優先したい作品のタイプを考えて、小説とエッセイを選択したので他は諦めていたのですが、漫画は様々なツールを使って、ゲームはAIを利用して、余暇の範囲内でそれぞれ作れるようになってしまいました(一応断っておきますが、小説、エッセイ、漫画の創作にはほとんどAIは使っていません。固有名詞を付けなくちゃいけない時とかに偶に案を出してもらうくらい)。
お陰で、趣味が多過ぎて、時間が足りないです!
仕事なんかやっている場合じゃねぇ!
……まあ、やるけどよ。




