← [ TECH / 技術部 ] に戻る
OBSERVATION · 其の8951 · 2026.09.01

ファミリーベーシックは、AIの夢を見るか?(7)|ChatGPTに切り替えてみる — スプライトを明示したら、ちゃんと使えた

ファミリーベーシックは、AIの夢を見るか?(7)|ChatGPTに切り替えてみる — スプライトを明示したら、ちゃんと使えた — ファミリーベーシック, ChatGPT, スプライト

前回は、エミュレータ画面の横に増設したコーディング支援用のパネルに claude-cli を繋いで試しました。今回は、そのパネルの接続先をOpenAI APIに差し替えます。使ったモデルは現行のflagship/mini系である gpt-5.6-sol です。

このパネルは、問い合わせのたびにファミリーベーシックのリファレンス文書(十数万字)をプロンプトへ丸ごと足してからAIに渡す仕組みになっています。実在する命令をどこまで正しく使えるかは、この資料をどう活かすか次第、という前提で見ていきます。

本記事はローカル LLM による自動執筆パイプラインで生成されました。現段階ではクラウド AI(Claude 等)の補助や人間の編集が介在していますが、pareido.jp では最終的に AI が自律的にコンテンツを制作できる仕組みの構築を目指しています。

パレイドLLMのためのFamily BASICリファレンス(1)|AI が Family BASIC を書けない理由こんにちは、パレイド技術部の橘です。 辺境部の連載「ファミリーベーシックでバイブコーディング」では、1984 年の Family BASIC に 2026 年の…

まずは一言だけ頼んでみる

依頼文は「スペースインベーダー風のゲームを作って」の一行だけです。

依頼直後の画面。左のBASIC側は NS-HUBASIC V2.0A / 1982 BYTES FREE のまま待機し、右のパネルには依頼文と応答待ちの「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命令もハードウェアスプライトも一切使わず、すべてLOCATEPRINTによるテキスト文字での擬似スプライトです。侵略者はW、自機はA、弾は|。DIM配列で15体の生死を管理し、STICK(0)STRIG(0)のビット判定で移動と発射、GOSUBでサブルーチンに分けるという、構造化されたつくりになっています。

命令を一つずつリファレンスと突き合わせると、STICKSTRIGLOCATEGOSUBDIMMID$PAUSEBEEP——どれもファミリーベーシックに実在する命令でした。打ち込んでRUNすると、W編隊と自機Aが画面に出て、左右移動も効きます。エラーメッセージは最後まで出ませんでした。

応答が届き、コードがBASIC画面に打ち込まれている途中。右のTypeボタンが赤い「Stop」に変わっている
RUN後。編隊と自機Aが表示され、左上にINVADER SCORE 0が出ている

動いたことは動いたのですが、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 ONDEF SPRITESPRITE文・SPRITE OFFCGENCGSETPLAYと、ハードウェアスプライト回りの命令が一通り並びました。リファレンスによれば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列で左右に往復し、青いロケット形の自機も十字キーで左右に動きました。エラーは一度も出ませんでした。

依頼直後の画面。依頼文は「スプライトを使って、スペースインベーダー風のゲームを作って」
打ち込み中。DEF SPRITE文が並んでいる
RUN後。緑と橙のエイリアン6体、青いロケット形の自機が実際のスプライトとして表示されている

依頼文に「スプライトを使って」の一言を足すだけで、gpt-5.6-solはDEF SPRITESPRITECGENCGSETPLAYをひととおり正しい引数で使いこなし、彩色されたハードウェアスプライトの編隊を描画できました。最初の一言だけの依頼では出てこなかった書き方です。独自命令を知らなかったわけではなく、明示的に頼まれるまで選ばなかっただけだった、ということになります。

ClaudeとOpenAI、どちらもファミリーベーシックのバイブコーディングは遜色なくこなせることが分かりました。応答速度はgpt-5.6-solのほうが明らかに速く(30秒台。claude-cliは約6分)、指示に工夫が必要ですが快適度が大きく変わり、これは今回の収穫です。

次回は、同じ依頼文をローカルLLMに投げてみます。

▶ 関連動画 · YOUTUBE
━━ 観るのを再開 ━━
前の記事を読む
技術部 · ファミリーベーシックは、AIの夢を見るか?(6)|依頼から7分、インベーダーが動いた — Claudeで最初に成功したバイブコーディング
動画を観る
YouTube
次の記事を読む
技術部 · ファミリーベーシックは、AIの夢を見るか?(8)|手元のモデルでは届かなかった — ローカルLLMでのバイブコーディング検証
━━ 他の観測領域 ━━
TECH · 技術部
ファミリーベーシックは、AIの夢を見るか?(8)|手元のモデルでは届かなかった — ローカルLLMでのバイブコーディング検証
PHIL · 思想部
AI自動化ピラミッドの可視化(10)|反転したのは、連載ではなかった――月次レビュー第3回
FRONT · 辺境部
【スーパーマリオ256W】顔は全部見た。では、遊べるのか — 機械はいま32面中9面しかクリアできない