前回は、エミュレータ画面の横に増設したコーディング支援用のパネルに claude-cli を繋いで試しました。今回は、そのパネルの接続先をOpenAI APIに差し替えます。使ったモデルは現行のflagship/mini系である gpt-5.6-sol です。
このパネルは、問い合わせのたびにファミリーベーシックのリファレンス文書(十数万字)をプロンプトへ丸ごと足してからAIに渡す仕組みになっています。実在する命令をどこまで正しく使えるかは、この資料をどう活かすか次第、という前提で見ていきます。
本記事はローカル LLM による自動執筆パイプラインで生成されました。現段階ではクラウド AI(Claude 等)の補助や人間の編集が介在していますが、pareido.jp では最終的に AI が自律的にコンテンツを制作できる仕組みの構築を目指しています。
まずは一言だけ頼んでみる
依頼文は「スペースインベーダー風のゲームを作って」の一行だけです。

返ってきたのは29行でした。全文を引用します。
10 CLS:DIM A(14):FOR I=0 TO 14:A(I)=1:NEXT
20 O=3:Y=3:D=1:X=13:B=0:S=0:N=0:T=0
30 LOCATE 0,0:PRINT "INVADER SCORE";S:Q=1:GOSUB 240
40 S0=STICK(0):LOCATE X,22:PRINT " "
50 IF S0 AND 1 AND X<27 THEN X=X+1
60 IF S0 AND 2 AND X>0 THEN X=X-1
70 LOCATE X,22:PRINT "A"
80 IF B=0 AND (STRIG(0) AND 8) THEN B=21:Z=X:BEEP
90 IF B=0 THEN 140
100 LOCATE Z,B:PRINT " ":B=B-1
110 IF B<1 THEN B=0:GOTO 140
120 LOCATE Z,B:PRINT "|":GOSUB 200
130 IF N=15 THEN 290
140 T=T+1:IF T<10 THEN PAUSE 2:GOTO 40
150 T=0:Q=0:GOSUB 240:O=O+D
160 IF O<1 OR O>7 THEN D=-D:O=O+D:Y=Y+1
170 Q=1:GOSUB 240:IF Y+4>=22 THEN 280
180 IF N=15 THEN 290
190 GOTO 40
200 IF B=0 THEN RETURN
210 FOR I=0 TO 14:IF A(I)=0 THEN 230
220 R=Y+(I/5)*2:C=O+(I MOD 5)*4:IF B=R AND Z=C THEN A(I)=0:N=N+1:S=S+10:LOCATE C,R:PRINT " ":LOCATE Z,B:PRINT " ":B=0:LOCATE 14,0:PRINT S
230 NEXT:RETURN
240 FOR I=0 TO 14:IF A(I)=0 THEN 270
250 C$=MID$(" W",Q+1,1)
260 LOCATE O+(I MOD 5)*4,Y+(I/5)*2:PRINT C$
270 NEXT:RETURN
280 CLS:LOCATE 9,10:PRINT "GAME OVER":LOCATE 9,12:PRINT "SCORE";S:END
290 CLS:LOCATE 10,10:PRINT "YOU WIN":LOCATE 9,12:PRINT "SCORE";S:END
SPRITE命令もハードウェアスプライトも一切使わず、すべてLOCATEとPRINTによるテキスト文字での擬似スプライトです。侵略者はW、自機はA、弾は|。DIM配列で15体の生死を管理し、STICK(0)・STRIG(0)のビット判定で移動と発射、GOSUBでサブルーチンに分けるという、構造化されたつくりになっています。
命令を一つずつリファレンスと突き合わせると、STICK・STRIG・LOCATE・GOSUB・DIM・MID$・PAUSE・BEEP——どれもファミリーベーシックに実在する命令でした。打ち込んでRUNすると、W編隊と自機Aが画面に出て、左右移動も効きます。エラーメッセージは最後まで出ませんでした。


動いたことは動いたのですが、SPRITE命令に一度も触れていないのが気になります。ファミリーベーシックはハードウェアスプライトを持つ機種で、リファレンスにもその使い方が詳しく載っています。それを知っていて使わなかったのか、知らなかったのかは、この結果だけでは分かりません。そこで依頼文に一言足して、聞き直すことにしました。
スプライトを使って、と言ってみる
依頼文を「スプライトを使って、スペースインベーダー風のゲームを作って」に変えて、同じモデルにもう一度頼みました。返ってきたのは32行です。
10 CLS:CGEN 2:CGSET 1,0:SPRITE ON
20 DEF SPRITE 0,(0,1,1,0,0)=CHR$(172)+CHR$(173)+CHR$(174)+CHR$(175)
30 DEF SPRITE 1,(1,1,1,0,0)=CHR$(56)+CHR$(57)+CHR$(58)+CHR$(59)
40 DEF SPRITE 2,(1,1,1,0,0)=CHR$(56)+CHR$(57)+CHR$(58)+CHR$(59)
50 DEF SPRITE 3,(1,1,1,0,0)=CHR$(56)+CHR$(57)+CHR$(58)+CHR$(59)
60 DEF SPRITE 4,(1,1,1,0,0)=CHR$(56)+CHR$(57)+CHR$(58)+CHR$(59)
70 DEF SPRITE 5,(1,1,1,0,0)=CHR$(56)+CHR$(57)+CHR$(58)+CHR$(59)
80 DEF SPRITE 6,(1,1,1,0,0)=CHR$(56)+CHR$(57)+CHR$(58)+CHR$(59)
90 DEF SPRITE 7,(2,0,1,0,0)=CHR$(212)
100 DIM A(5),X(5),Y(5):P=120:D=2:K=6
110 FOR I=0 TO 5:A(I)=1:X(I)=45+(I MOD 3)*65:Y(I)=45+(I/3)*35:NEXT
120 LOCATE 3,1:PRINT "SPACE ATTACK":LOCATE 1,23:PRINT "PAD=MOVE A=SHOT"
130 S=STICK(0)
140 IF (S AND 1)<>0 THEN P=P+4
150 IF (S AND 2)<>0 THEN P=P-4
160 IF P<8 THEN P=8
170 IF P>232 THEN P=232
180 IF (STRIG(0) AND 8)<>0 AND B=0 THEN B=1:U=P+4:V=195
190 IF B<>0 THEN V=V-6
200 IF V<8 THEN B=0
210 O=O+D:IF ABS(O)>25 THEN D=-D:Q=Q+8
220 SPRITE 0,P,205
230 FOR I=0 TO 5
240 IF A(I)<>0 THEN SPRITE I+1,X(I)+O,Y(I)+Q
250 IF B<>0 AND A(I)<>0 AND ABS(U-X(I)-O)<12 AND ABS(V-Y(I)-Q)<12 THEN A(I)=0:SPRITE I+1:B=0:C=C+10:K=K-1:BEEP
260 NEXT
270 IF B<>0 THEN SPRITE 7,U,V
280 IF B=0 THEN SPRITE 7
290 LOCATE 0,0:PRINT "SCORE";C;" LEFT";K;" "
300 IF K=0 THEN SPRITE OFF:CLS:LOCATE 9,10:PRINT "YOU WIN":PLAY "O3C2E2G2O4C4":END
310 IF Q>105 THEN SPRITE OFF:CLS:LOCATE 8,10:PRINT "GAME OVER":PLAY "O3G2E2C6":END
320 PAUSE 2:GOTO 130
今度はSPRITE ON・DEF SPRITE・SPRITE文・SPRITE OFF・CGEN・CGSET・PLAYと、ハードウェアスプライト回りの命令が一通り並びました。リファレンスによればDEF SPRITEの第2引数は「0=8×8ドット1キャラクタ、1=16×16ドット4キャラクタ合成」——敵6体(20〜80行目)は(1,1,1,0,0)と4つのCHR$で16×16の合成スプライトとして定義し、自機と弾(90行目)は単体CHR$の8×8スプライトにしています。この使い分けは資料の定義どおりで、思いつきで書いた並びではありません。
打ち込んでRUNすると、緑と橙のエイリアン6体が2行3列で左右に往復し、青いロケット形の自機も十字キーで左右に動きました。エラーは一度も出ませんでした。



依頼文に「スプライトを使って」の一言を足すだけで、gpt-5.6-solはDEF SPRITE・SPRITE・CGEN・CGSET・PLAYをひととおり正しい引数で使いこなし、彩色されたハードウェアスプライトの編隊を描画できました。最初の一言だけの依頼では出てこなかった書き方です。独自命令を知らなかったわけではなく、明示的に頼まれるまで選ばなかっただけだった、ということになります。
ClaudeとOpenAI、どちらもファミリーベーシックのバイブコーディングは遜色なくこなせることが分かりました。応答速度はgpt-5.6-solのほうが明らかに速く(30秒台。claude-cliは約6分)、指示に工夫が必要ですが快適度が大きく変わり、これは今回の収穫です。
次回は、同じ依頼文をローカルLLMに投げてみます。