見出し画像

AIが殆ど作ったシューティングゲームのソースコード(MSX)

AIが最近話題よね。自分もよく色々遊んでいるんだけど、「MSXのゲームをどこまで作れるのか」ということで遊んでいる人(@matsushita_8bit さん)がいたので、自分も手元で利用できるAIツールでどこまでいけるか試してみた。少なくともChatGPTの場合、BASIC言語には精通していてもMSX特有の仕様(スプライトの有無や変数英字2文字制限など)を理解せず、命令も汎用的な物を提示してくるので、そのままだとまともに動くものが出てこない。

一見すると動きそうだが、細部でMSXの仕様を無視した命令などが出てくるChatGPT先輩

そんなわけでBingAIくんにも聞いてみたら、なんと!いきなりいけそうなコードだしてきた!

BingAIはいきなりスプライトやSTRIG関数を出してきた

まぁ流石にこのまま実行しても動かないんすけどねw、STRIG(0)ってのはMSXにおけるジョイスティックのショット部分の動きを拾う関数なんだけど、これが0の場合は何もしてない状態で、ボタンを押すと-1の値が返ってくる(当然忘れてたのでググった)。つまりBingAIのコードはその処理の書き方が間違っているので、これをIF STRIG(0)=-1に修正することで、スペースキーを押すと弾が飛ぶようになり、黒い謎の物体が左右に動作するところまで1発で完成させてきやがった。なんだこいつ。

上記ソースコードのみで出てきたのがこれ。いきなり黒い自機は左右に動けるが、弾の処理にミスがあったので何もしなくてもラインを画面上にもりもり吐き出す上に消す処理をしてないから画面委はラインが残っちゃう

しかも追加質問で敵キャラ追加するには?とか当たり判定どうしよう?とか聞くと追加コードを応えてくれる。これはすごい。

ということで、BingAIさんが吐き出したコードを組み合わせて一部修正してできあがったシンプルシューティングゲームのソースコードがこちら。

10 SCREEN 2
20 CLS
30 X=128:EX=128
40 Y=180:EY=50
50 SPRITE$(0)=CHR$(0)+CHR$(0)+CHR$(252)
55 SPRITE$(1)=CHR$(255)+CHR$(255)+CHR$(129)

60 PUT SPRITE 0,(X,Y),1
65 PUT SPRITE 1,(EX,EY),2
70 IF STRIG(0)=-1 THEN GOSUB 100
80 IF STICK(0)=7 THEN X=X-1 ELSE IF STICK(0)=3 THEN X=X+1
85 IF EX<256 THEN EX=EX+2 ELSE EX=0
86 IF X+16>EX AND X<EX+16 AND Y<EY+16 THEN GOSUB 200
90 GOTO 60

100 FOR I=1 TO 20
110 LINE (X+4,Y-I*8)-(X+4,Y-I*8-4),15,BF
120 NEXT I
130 FOR I=1 TO 20
140 LINE (X+4,Y-I*8)-(X+4,Y-I*8-4),0,BF
150 NEXT I
155 IF X+4>EX AND X+4<EX+16 THEN GOSUB 300
160 RETURN

200 PRINT "GAME OVER"
210 BEEP
220 END

300 PUT SPRITE 1,(EX,EY),0
310 EX=RND(1)*256
320 EY=RND(1)*100
330 PUT SPRITE 1,(EX,EY),2
340 RETURN
 

こちらで行なった修正処理は、前述のSTRIG(0)=-1のバグ修正と、デフォルトでは40ドット分くらいしか伸びなかった自弾のLINEがもっと上まで飛ぶように調整。また、LINEが引かれる処理(100-120行)の後に同じ軌跡を0の色で上書きして白のLINEを消す処理を丸ごと追加。あと当たり判定の部分をX軸のみ見るように修正(今のバージョンは敵も味方も横にしか動かないので、X軸が同じ時にショットを撃てばこちらの勝ち状態)

補足があるなら、あとは敵と衝突するような状況になるような作りにする必要があるかな。今は敵が自分より高い位置に出現して横移動しかしないので、これに縦移動する処理を追加して敵との衝突も発生すればゲームオーバー処理はAIが書いたので大丈夫。

BingAIとの会話は以下3回。
1回目「MSX BASICで、シューティングゲームを作ってください.変数は英数字2文字までにしてください.実機のMSXで動きように記述してください.MSX BASICに存在しない命令を使わないでください」
2回目「敵キャラクターの追加方法」
3回目「こちらの弾が敵に当たったかを判定する方法は」

とりまメモ的な物なのでこんな感じで。最後に動画も上げておくねw

なお、誤解なきように注釈しておくと、動きがやたら速いのはWebMSXエミュレータのZ80 CPUクロックを8倍に設定しているから。動画の最後にちゃんと設定を等倍に戻した状態も見られるので、最初だけ見て早!って勘違いしないようにw


この記事が気に入ったらサポートをしてみませんか?