メインコンテンツへスキップ
見出し画像

AIにMSXのインベーダー風ゲームを作ってもらいました(SCREEN 3・マシン語版)

    毎度、rorosukeです。

    前回、AIを使用してMSX BASIC+マシン語プログラムまで作れることを紹介する記事を公開しました。それがこちらです。

    その「まとめ」で「本格的にMSXプログラムを作ってみたい」と言っていますが、その通りになってしまいました。

    何かというと、これまでも何度か作ってきた、

    スペースインベーダー風ゲーム


    を作りました。その画面がこちらです。

    画像
    マシン語のローディング画面です。タイトル画面が出るまでお待ちください。→注1
    画像
    スタート画面
    画像
    ゲーム画面
    画像
    インベーダーを倒すと爆発マークが残り、画面中央上に得点が表示されます
    画像
    UFO登場(倒すと50・100・150・300点のどれかが入ります)

    注1:MSXPenの機種設定を「turbo R」にすると、ロード時間を短縮できる裏技があります。なお、私の環境では「turbo R」にするとゲーム速度が上がりました。これは、「turbo R」が速いというより「MSX1」モードで処理落ちしているのかもしれません(気にしないことにします)。



    実行方法

    本ゲームを実行してプレイするには、MSXの実機かエミュレータが必要です。実機としては、必要なRAMは32KB以上です(ただし、本プログラムコードについて、実機での動作確認はしていません)。

    お勧めは、オンラインで動作するMSXPenです。難しいことは考えずに、次のプログラムへのリンクをクリックすれば、自動的に実行開始となります。動作確認はこのMSXPenで行っています。

    右下のボタンで全画面表示も可能です。

    画像

    自分でプログラムコードを貼り付けて実行したいときには、次をクリックして、MSXPenページにアクセスします。コードを左側にペーストして、左下の「Run」ボタンを押します。

    画像

    MSXPenの覚えておくと便利なキー操作

    便利なキー操作をメモっておきます。

    F9:ポーズ。プログラムやリスト出力の一時停止
    F9+Ctrl:ストップ。プログラムやリスト出力の中断
    Alt+V の後に Ctrl+V:MSX BASICへのテキストのペースト



    ゲームの操作とルール

    操作

    • 移動:カーソルキー、またはジョイスティックの左右

    • 発射:スペースキー、またはトリガーボタン

    • タイトル画面でスペースキーを押すとスタートします

    得点

    • 上段のインベーダー:30点

    • 中段のインベーダー:20点

    • 下段のインベーダー:10点

    • UFO:50・100・150・300点のいずれか(撃つまで分かりません)

    ルール

    • 自機は3機です。敵の弾に当たると1機失います

    • インベーダーを全滅させると、次のウェーブ(ステージ)に進みます。進むほど、インベーダーが下の位置から始まります

    • 自機の前に並ぶトーチカは、自分の弾と敵の弾の両方を防ぎます。弾が当たった場所から少しずつ削れ、次のウェーブに進むと元に戻ります

    • UFOは画面上部に、左右どちらかからランダムで現れます。インベーダーが残り8体以上のときだけ出てきます

    • インベーダーが自機の高さまで降りてくると、自機が点滅したあとでゲームオーバーです。残機があっても終了します

    • 最後の1機が撃たれたときも、自機が点滅してからゲームオーバーになります

    • ハイスコアは、電源を入れている間だけタイトル画面に記録されます



    SCREEN 3を採用した理由

    ゲーム画面を見ると、ドットがすごく粗いです。これは、MSXユーザーならご存じの、

    SCREEN 3(横64 × 縦48ドット)

    です。このスクリーンモードは、非常にレトロ感があって、初期ビデオゲームらしさを表現するのに向いている感じがして個人的にも大好きです。

    今回はスプライトを使わず、インベーダーも自機も弾も、すべてこの粗いドットで描いています。

    ただし、たくさんのインベーダーや弾をBASICだけで描き直すと、どうしても動きが遅くなります。そこで今回は、描画やゲーム進行を担当するマシン語プログラムをAIに作ってもらいました。

    マシン語ルーチンを作ってもらうのは前回に続いて2回目ですが、しっかり動作しています。すごすぎますね。



    高速に動く仕組み

    AIに設計してもらった内容を、簡単にまとめます。

    • 画面をいったんRAMに描く:画面を消してから一つずつ描き直す方式に比べ、ちらつきを抑えやすくなります。ただし、毎回まとめて転送するため、その分の処理時間は必要です。

    • インベーダーはバイト単位で描く:SCREEN 3では横2ブロックが1バイトにまとまっています。1ブロックずつ点を打つのではなく、あらかじめ用意した絵のパターンを、バイトのまま書き込んでいます

    • BASICは司令塔だけ:キー入力の取得、ゲームの進行、描画はすべてマシン語です。BASICは1フレームごとにマシン語を呼び出して、効果音を鳴らし、ゲームオーバーを確認するだけです



    まとめ:大満足の出来

    MSXのプログラムを作るとき、SCREEN 3で何かを作ってやろうと思って、最初にAIに聞いたのが次のプロンプトです。

    👦
    スペースインベーダーゲームのようなものを作りたいです。もしくはブロック崩しでもいいです。スプライトは使わずにドット処理だけでゲームを作りたいと考えています。

    これに対して、次のような返事がきました。

    💻
    ブロック崩しよりスペースインベーダーの方が、64×48ブロックの画面でも作りがいがあるので、そちらで進めます。SCREEN 3の描画ライブラリ(RAM上のバッファに描いて一括転送する方式)と、ゲーム本体のマシン語をまとめて作り、エミュレータでテストしてからお渡しします。

    「スペースインベーダーの方が作りがいがある」って、AIさんの意気込みがすごすぎます! そう言われたら、やっぱ作らないわけにはいきません。これが、インベーダーゲームを作った理由です。

    難易度は、易しいようでステージを何面もクリアするのは難しめです(本家同様に、初期位置が下がってきます)。簡単すぎないので、シューティング好きな人なら、ある程度楽しめるかと思います。
    ぜひプレイしてみてください。

    以上!



    プログラムコード

    ゲームのコードです。マシン語プログラムは、前回同様にDATA文になっていて、起動時にメモリにローディングされるようになっています。

    10 REM === SPACE INVADERS  MSX1 SCREEN 3 (no sprites, machine code engine) ===
    20 CLEAR 300,&HCFFF
    30 DEFINT A-Z
    40 HI!=0:PH=0:WB=0:SF=0
    50 SCREEN 0:WIDTH 40:KEY OFF:CLS:PRINT "LOADING..."
    60 GOSUB 2000
    70 DEFUSR0=&HD000:DEFUSR1=&HD003
    80 GOSUB 1100
    90 SCREEN 3,0:COLOR 15,1,1
    100 SOUND 7,&H9C:SOUND 8,0:SOUND 9,0:SOUND 10,0
    110 X=USR1(0)
    120 REM ---- MAIN LOOP ----
    130 TIME=0
    140 X=USR0(0)
    150 EV=PEEK(&HE60F)
    160 IF EV AND 1 THEN GOSUB 1700
    170 IF EV AND 6 THEN GOSUB 1710
    180 IF EV AND 8 THEN GOSUB 1720
    190 IF EV AND 16 THEN GOSUB 1730 ELSE SOUND 9,0
    195 IF EV AND 64 THEN GOSUB 1710:GOSUB 1750
    197 GOSUB 1740
    200 IF PEEK(&HE610) THEN 3000
    210 IF TIME<3 THEN 210 : REM 3=20fps  2=30fps
    220 GOTO 130
    1100 REM ---- TITLE (text screen) ----
    1110 SCREEN 1:COLOR 15,1,1:WIDTH 32:KEY OFF:CLS
    1120 LOCATE 8,3:PRINT "SPACE INVADERS"
    1130 LOCATE 6,5:PRINT "- SCREEN 3 EDITION -"
    1140 LOCATE 6,9:PRINT "30 PTS  = <o>"
    1150 LOCATE 6,10:PRINT "20 PTS  = {o}"
    1160 LOCATE 6,11:PRINT "10 PTS  = [o]"
    1165 LOCATE 6,12:PRINT "50-300  = UFO"
    1170 LOCATE 6,14:PRINT "CURSOR/STICK : MOVE"
    1180 LOCATE 6,15:PRINT "SPACE/TRIGGER: FIRE"
    1190 LOCATE 6,18:PRINT "HI-SCORE";HI!
    1200 LOCATE 5,21:PRINT "PRESS SPACE TO START"
    1210 IF STRIG(0) OR STRIG(1) THEN 1210
    1220 IF NOT (STRIG(0) OR STRIG(1)) THEN 1220
    1230 RETURN
    1700 REM ---- SOUND: SHOT ----
    1702 SOUND 0,40:SOUND 1,0:SOUND 11,0:SOUND 12,5:SOUND 8,16:SOUND 13,9
    1704 RETURN
    1710 REM ---- SOUND: EXPLOSION ----
    1712 SOUND 6,18:SOUND 11,0:SOUND 12,20:SOUND 10,16:SOUND 13,9
    1714 RETURN
    1720 REM ---- SOUND: WAVE CLEAR ----
    1722 FOR P=300 TO 60 STEP -10
    1724 SOUND 2,P AND 255:SOUND 3,P\256:SOUND 9,12
    1726 NEXT P:SOUND 9,0:RETURN
    1730 REM ---- SOUND: MARCH ----
    1732 PH=(PH+1) AND 3:P=700-PH*50
    1734 SOUND 2,P AND 255:SOUND 3,P\256:SOUND 9,10:RETURN
    1740 REM ---- SOUND: UFO SIREN ----
    1742 IF EV AND 32 THEN WB=(WB+1) AND 3:P=400+WB*70:SOUND 0,P AND 255:SOUND 1,P\256:SOUND 8,6:SF=1:RETURN
    1744 IF SF THEN SF=0:SOUND 8,0
    1746 RETURN
    1750 REM ---- SOUND: UFO HIT ----
    1752 FOR P=100 TO 400 STEP 30
    1754 SOUND 2,P AND 255:SOUND 3,P\256:SOUND 9,12
    1756 NEXT P:SOUND 9,0:RETURN
    2000 REM ---- LOAD MACHINE CODE (D000H) ----
    2010 RESTORE 6000:A=&HD000:LN=0
    2020 READ N:IF N=0 THEN LOCATE 0,3:PRINT "LOAD OK                ":RETURN
    2030 S=0:FOR J=1 TO N:READ D:POKE A,D:A=A+1:S=S+D:NEXT J
    2035 LOCATE 0,3:PRINT "READING DATA LINE";PEEK(&HF6A3)+256*PEEK(&HF6A4);"  "
    2040 READ C:LN=LN+1:IF C<>S THEN PRINT "DATA ERROR LINE";5990+LN*10:END
    2050 GOTO 2020
    3000 REM ---- GAME OVER ----
    3010 SOUND 7,&HB8:SOUND 8,0:SOUND 9,0:SOUND 10,0
    3020 SC!=PEEK(&HE602)+256!*PEEK(&HE603):WV=PEEK(&HE604)+1
    3030 SCREEN 1:COLOR 15,1,1:WIDTH 32:KEY OFF:CLS
    3040 LOCATE 11,8:PRINT "GAME OVER"
    3050 LOCATE 9,11:PRINT "SCORE";SC!
    3060 LOCATE 9,13:PRINT "WAVE";WV
    3070 IF SC!>HI! THEN HI!=SC!:LOCATE 9,16:PRINT "NEW HI-SCORE!"
    3080 TIME=0
    3090 IF TIME<180 THEN 3090
    3100 GOTO 80
    6000 DATA 16,195,68,208,195,6,208,62,30,50,0,230,62,3,50,1,230,1598
    6010 DATA 16,175,50,2,230,50,3,230,50,4,230,50,14,230,50,15,230,1613
    6020 DATA 16,50,16,230,50,80,230,50,144,230,50,145,230,50,150,230,33,1968
    6030 DATA 16,128,230,6,16,119,35,16,252,237,95,50,17,230,205,223,210,2069
    6040 DATA 16,205,172,212,201,221,229,175,50,15,230,205,213,211,58,150,230,2777
    6050 DATA 16,183,40,23,58,14,230,183,40,6,61,50,14,230,32,5,62,1231
    6060 DATA 16,1,50,16,230,205,54,214,221,225,201,58,14,230,183,40,6,1948
    6070 DATA 16,61,50,14,230,24,3,205,145,208,205,244,208,205,241,210,205,2458
    6080 DATA 16,239,211,205,236,212,205,92,213,205,255,213,205,54,214,221,225,3205
    6090 DATA 16,201,175,205,213,0,183,32,5,62,1,205,213,0,79,214,2,1790
    6100 DATA 16,254,3,48,13,58,0,230,198,2,254,60,56,19,62,59,24,1340
    6110 DATA 16,15,121,214,6,254,3,48,11,58,0,230,214,2,48,1,175,1400
    6120 DATA 16,50,0,230,175,205,216,0,50,71,230,62,1,205,216,0,33,1744
    6130 DATA 16,71,230,182,200,58,11,230,183,192,62,1,50,11,230,58,0,1769
    6140 DATA 16,230,198,2,50,12,230,62,42,50,13,230,58,15,230,246,1,1669
    6150 DATA 16,50,15,230,201,58,11,230,183,200,6,2,197,58,13,230,61,1745
    6160 DATA 16,50,13,230,254,6,56,36,254,8,48,6,205,78,211,183,32,1670
    6170 DATA 16,26,58,12,230,95,58,13,230,87,14,255,205,239,209,183,32,1946
    6180 DATA 16,10,205,134,209,183,32,4,193,16,209,201,193,175,50,11,230,2055
    6190 DATA 16,201,58,6,230,71,122,144,56,75,71,230,3,254,3,40,68,1632
    6200 DATA 16,120,203,63,203,63,254,4,48,59,50,64,230,58,5,230,71,1725
    6210 DATA 16,123,144,250,132,209,6,0,254,6,56,5,214,6,4,24,247,1680
    6220 DATA 16,254,5,48,32,120,254,8,48,27,50,65,230,58,64,230,135,1628
    6230 DATA 16,135,135,71,58,65,230,128,95,22,0,33,32,230,25,126,183,1568
    6240 DATA 16,200,62,1,201,175,201,58,12,230,95,58,13,230,87,205,49,1877
    6250 DATA 16,209,183,200,175,119,58,10,230,61,50,10,230,58,64,230,95,1982
    6260 DATA 16,22,0,33,219,209,25,126,50,71,230,205,223,209,58,15,230,1925
    6270 DATA 16,246,2,50,15,230,58,65,230,71,135,128,135,71,58,5,230,1729
    6280 DATA 16,128,95,58,64,230,135,135,71,58,6,230,128,87,58,71,230,1784
    6290 DATA 16,111,38,0,14,0,205,164,211,62,1,201,30,20,10,10,42,1119
    6300 DATA 16,2,230,95,22,0,25,48,3,33,255,255,34,2,230,201,122,1557
    6310 DATA 16,214,38,56,89,254,4,48,85,50,64,230,123,214,7,56,77,1609
    6320 DATA 16,6,0,254,14,56,5,214,14,4,24,247,254,7,48,62,87,1296
    6330 DATA 16,120,254,4,48,56,135,135,33,96,230,133,111,58,64,230,133,1840
    6340 DATA 16,111,66,62,64,4,5,40,4,203,63,24,249,95,126,163,40,1319
    6350 DATA 16,28,123,47,87,126,162,119,58,64,230,129,254,4,48,11,203,1693
    6360 DATA 16,121,40,3,43,24,1,35,126,162,119,62,1,201,175,201,33,1347
    6370 DATA 16,96,230,6,4,62,62,119,35,62,127,119,35,119,35,62,99,1272
    6380 DATA 16,119,35,16,240,201,205,216,213,254,38,216,221,33,96,230,62,2395
    6390 DATA 16,7,50,114,230,6,4,197,62,38,50,115,230,6,4,197,221,1531
    6400 DATA 16,126,0,183,40,66,62,64,50,112,230,175,50,113,230,58,112,1671
    6410 DATA 16,230,221,166,0,40,30,58,114,230,33,113,230,134,95,58,115,1867
    6420 DATA 16,230,87,205,49,209,183,40,12,58,112,230,47,71,221,126,0,1880
    6430 DATA 16,160,221,119,0,58,112,230,203,63,50,112,230,58,113,230,60,2019
    6440 DATA 16,50,113,230,254,7,56,199,221,35,58,115,230,60,50,115,230,2023
    6450 DATA 16,193,16,171,58,114,230,198,14,50,114,230,193,16,152,201,205,2155
    6460 DATA 16,38,214,111,205,38,214,230,1,103,17,160,0,25,34,83,230,1703
    6470 DATA 16,201,58,80,230,183,32,54,42,83,230,43,34,83,230,124,181,1888
    6480 DATA 16,192,205,223,210,58,10,230,254,8,216,205,38,214,230,1,40,2334
    6490 DATA 16,12,62,249,50,81,230,62,1,50,82,230,24,10,62,63,50,1318
    6500 DATA 16,81,230,62,255,50,82,230,62,1,50,80,230,201,58,82,230,1984
    6510 DATA 16,71,58,81,230,128,50,81,230,254,64,40,13,254,248,40,9,1851
    6520 DATA 16,58,15,230,246,32,50,15,230,201,175,50,80,230,201,58,80,1951
    6530 DATA 16,230,183,200,58,81,230,79,58,12,230,145,250,154,211,254,7,2382
    6540 DATA 16,48,56,175,50,80,230,205,38,214,230,3,135,95,22,0,33,1614
    6550 DATA 16,156,211,25,94,35,86,213,42,2,230,25,48,3,33,255,255,1713
    6560 DATA 16,34,2,230,58,15,230,246,64,50,15,230,225,58,81,230,95,1863
    6570 DATA 16,22,5,14,1,205,164,211,62,1,201,175,201,50,0,100,0,1412
    6580 DATA 16,150,0,44,1,34,147,230,213,58,144,230,60,230,3,50,144,1738
    6590 DATA 16,230,135,135,111,38,0,17,128,230,25,62,12,119,35,209,115,1601
    6600 DATA 16,35,114,35,113,62,12,50,145,230,121,183,62,11,40,2,62,1277
    6610 DATA 16,9,50,146,230,201,33,128,230,6,4,17,4,0,126,183,40,1407
    6620 DATA 16,1,53,25,16,248,58,145,230,183,200,61,50,145,230,201,58,1904
    6630 DATA 16,10,230,183,200,58,8,230,61,50,8,230,192,205,141,212,58,2076
    6640 DATA 16,9,230,238,1,50,9,230,58,15,230,246,16,50,15,230,205,1832
    6650 DATA 16,78,212,58,7,230,254,1,32,16,58,5,230,145,242,58,212,1838
    6660 DATA 16,58,5,230,60,50,5,230,24,33,120,33,5,230,150,242,58,1533
    6670 DATA 16,212,58,5,230,61,50,5,230,24,16,58,7,230,237,68,50,1541
    6680 DATA 16,7,230,58,6,230,198,2,50,6,230,205,101,210,201,33,32,1799
    6690 DATA 16,230,6,32,14,0,22,1,126,183,40,3,121,178,79,122,7,1164
    6700 DATA 16,87,35,16,243,121,6,0,203,63,56,3,4,24,249,120,135,1365
    6710 DATA 16,95,135,131,237,68,95,121,6,7,203,127,32,4,135,5,24,1425
    6720 DATA 16,248,120,135,87,135,130,87,62,59,146,79,67,201,58,10,230,1854
    6730 DATA 16,203,63,203,63,60,79,58,4,230,254,4,56,2,62,3,71,1415
    6740 DATA 16,121,144,56,2,32,2,62,1,50,8,230,201,33,32,230,6,1210
    6750 DATA 16,32,62,1,119,35,16,252,62,32,50,10,230,62,8,50,5,1026
    6760 DATA 16,230,58,4,230,254,6,56,2,62,5,135,198,9,50,6,230,1535
    6770 DATA 16,62,1,50,7,230,175,50,9,230,50,11,230,50,18,230,50,1453
    6780 DATA 16,21,230,50,24,230,205,79,210,205,141,212,201,58,14,230,183,2293
    6790 DATA 16,192,58,10,230,183,200,205,38,214,71,58,4,230,254,3,120,2070
    6800 DATA 16,48,4,230,7,24,2,230,3,192,33,18,230,6,3,126,183,1339
    6810 DATA 16,40,6,35,35,35,16,247,201,229,205,38,214,230,7,79,198,1815
    6820 DATA 16,24,95,22,0,6,4,33,32,230,25,126,183,32,8,123,214,1157
    6830 DATA 16,8,95,16,242,225,201,120,61,50,64,230,225,62,1,119,35,1754
    6840 DATA 16,121,135,71,135,128,71,58,5,230,128,198,2,119,35,58,64,1558
    6850 DATA 16,230,135,135,71,58,6,230,128,198,3,119,201,221,33,18,230,2016
    6860 DATA 16,6,3,221,126,0,183,40,63,221,52,2,221,126,2,254,46,1566
    6870 DATA 16,56,6,175,221,119,0,24,47,60,87,221,94,1,14,1,197,1323
    6880 DATA 16,205,239,209,193,183,40,6,175,221,119,0,24,26,221,126,2,1989
    6890 DATA 16,254,43,56,19,58,0,230,79,221,126,1,145,56,9,254,5,1556
    6900 DATA 16,48,5,197,205,175,213,193,17,3,0,221,25,16,180,201,58,1757
    6910 DATA 16,1,230,61,50,1,230,32,5,62,1,50,150,230,62,30,50,1245
    6920 DATA 16,14,230,175,50,11,230,50,18,230,50,21,230,50,24,230,58,1671
    6930 DATA 16,15,230,246,4,50,15,230,201,33,56,230,6,3,14,8,126,1467
    6940 DATA 16,183,32,15,35,13,32,248,17,240,255,25,120,183,40,14,5,1457
    6950 DATA 16,24,235,120,135,135,71,58,6,230,128,198,2,201,175,201,58,1977
    6960 DATA 16,10,230,183,32,19,58,4,230,60,50,4,230,205,172,212,58,1757
    6970 DATA 16,15,230,246,8,50,15,230,201,205,216,213,254,44,216,62,1,2206
    6980 DATA 16,50,150,230,195,189,213,58,17,230,71,135,135,128,60,50,17,1928
    6990 DATA 16,230,71,237,95,168,201,205,91,214,205,197,214,205,212,214,205,2964
    7000 DATA 16,95,215,205,142,215,205,92,216,205,237,216,205,171,215,205,203,3042
    7010 DATA 16,217,205,5,218,205,250,215,205,120,214,201,243,237,115,76,230,2956
    7020 DATA 16,49,0,230,33,0,0,6,96,229,229,229,229,229,229,229,229,2246
    7030 DATA 16,16,246,237,123,76,230,251,201,58,7,0,79,12,243,175,237,2191
    7040 DATA 16,121,62,64,237,121,13,33,0,224,22,6,6,0,237,179,21,1346
    7050 DATA 16,32,249,251,201,123,254,64,208,122,254,48,208,15,15,15,230,2289
    7060 DATA 16,31,198,224,103,123,230,62,135,135,111,122,230,7,181,111,203,2206
    7070 DATA 16,67,32,12,126,230,15,119,121,135,135,135,135,182,119,201,126,1890
    7080 DATA 16,230,240,177,119,201,33,7,229,6,32,17,8,0,62,34,119,1514
    7090 DATA 16,25,16,252,201,42,2,230,221,33,17,215,62,1,50,66,230,1663
    7100 DATA 16,62,5,50,69,230,221,94,0,221,86,1,205,27,215,229,58,1773
    7110 DATA 16,66,230,95,22,1,14,15,205,39,215,225,58,66,230,198,4,1683
    7120 DATA 16,50,66,230,221,35,221,35,58,69,230,61,50,69,230,32,213,1870
    7130 DATA 16,201,16,39,232,3,100,0,10,0,1,0,6,0,183,237,82,1110
    7140 DATA 16,56,3,4,24,248,25,201,120,103,135,135,132,33,116,218,133,1686
    7150 DATA 16,111,48,1,36,6,5,126,50,70,230,35,229,123,245,58,70,1443
    7160 DATA 16,230,230,4,196,148,214,28,58,70,230,230,2,196,148,214,28,2226
    7170 DATA 16,58,70,230,230,1,196,148,214,241,95,20,225,16,216,201,58,2219
    7180 DATA 16,1,230,183,200,71,62,46,50,66,230,58,66,230,95,28,22,1638
    7190 DATA 16,2,14,3,205,148,214,29,20,205,148,214,28,205,148,214,28,1825
    7200 DATA 16,205,148,214,58,66,230,198,5,50,66,230,16,221,201,58,80,2046
    7210 DATA 16,230,183,200,14,8,58,81,230,95,22,6,62,62,205,59,216,1731
    7220 DATA 16,58,81,230,95,22,7,62,107,195,59,216,221,33,128,230,6,1750
    7230 DATA 16,4,197,221,126,0,183,202,234,215,221,94,1,221,86,2,221,2228
    7240 DATA 16,126,3,183,32,20,14,11,62,84,205,243,215,62,56,205,243,1764
    7250 DATA 16,215,62,84,205,243,215,195,234,215,14,9,62,85,205,243,215,2501
    7260 DATA 16,62,62,205,243,215,62,85,205,243,215,17,4,0,221,25,193,2057
    7270 DATA 16,16,191,201,213,205,59,216,209,20,201,58,145,230,183,200,42,2389
    7280 DATA 16,147,230,62,26,50,66,230,17,100,0,205,27,215,120,183,40,1718
    7290 DATA 16,7,229,205,41,216,225,24,5,62,28,50,66,230,17,10,0,1415
    7300 DATA 16,205,27,215,229,205,41,216,225,69,58,66,230,95,198,4,50,2133
    7310 DATA 16,66,230,22,1,58,146,230,79,195,39,215,50,70,230,62,64,1757
    7320 DATA 16,50,112,230,6,7,58,112,230,103,58,70,230,164,196,148,214,1988
    7330 DATA 16,58,112,230,203,63,50,112,230,28,16,234,201,221,33,96,230,2117
    7340 DATA 16,62,7,50,66,230,6,4,197,62,38,50,67,230,6,4,197,1276
    7350 DATA 16,221,126,0,50,70,230,58,67,230,15,15,15,230,31,198,224,1780
    7360 DATA 16,103,58,66,230,230,62,135,135,111,58,67,230,230,7,181,111,2014
    7370 DATA 16,58,70,230,230,64,40,4,126,246,12,119,125,198,8,111,58,1699
    7380 DATA 16,70,230,15,15,15,15,230,3,205,221,216,125,198,8,111,58,1735
    7390 DATA 16,70,230,15,15,230,3,205,221,216,125,198,8,111,58,70,230,2005
    7400 DATA 16,230,3,205,221,216,221,35,58,67,230,60,50,67,230,193,16,2102
    7410 DATA 16,158,58,66,230,198,14,50,66,230,193,16,139,201,79,126,203,2027
    7420 DATA 16,73,40,2,246,192,203,65,40,2,246,12,119,201,175,50,64,1730
    7430 DATA 16,230,33,44,218,58,5,230,230,1,40,4,17,36,0,25,58,1229
    7440 DATA 16,64,230,254,2,56,4,17,18,0,25,58,9,230,183,40,4,1194
    7450 DATA 16,17,9,0,25,34,72,230,58,64,230,95,22,0,33,141,217,1247
    7460 DATA 16,25,126,50,68,230,58,64,230,135,135,71,58,6,230,128,50,1664
    7470 DATA 16,67,230,58,64,230,135,135,135,95,22,0,33,32,230,25,34,1525
    7480 DATA 16,74,230,58,5,230,50,66,230,175,50,65,230,42,74,230,126,1935
    7490 DATA 16,183,40,19,58,67,230,87,58,66,230,95,58,68,230,79,221,1789
    7500 DATA 16,42,72,230,205,145,217,42,74,230,35,34,74,230,58,66,230,1984
    7510 DATA 16,198,6,50,66,230,58,65,230,60,50,65,230,254,8,56,204,1830
    7520 DATA 16,58,64,230,60,50,64,230,254,4,218,241,216,201,221,119,187,2417
    7530 DATA 16,51,6,3,122,15,15,15,230,31,198,224,103,123,230,62,135,1563
    7540 DATA 16,135,111,122,230,7,181,111,221,126,0,161,182,119,125,198,8,2037
    7550 DATA 16,111,221,126,1,161,182,119,125,198,8,111,221,126,2,161,182,2055
    7560 DATA 16,119,221,35,221,35,221,35,20,16,201,201,58,11,230,183,40,1847
    7570 DATA 16,17,58,12,230,95,58,13,230,87,14,15,205,148,214,20,205,1621
    7580 DATA 16,148,214,221,33,18,230,6,3,221,126,0,183,40,15,221,94,1773
    7590 DATA 16,1,221,86,2,14,9,205,148,214,20,205,148,214,17,3,0,1507
    7600 DATA 16,221,25,16,228,201,58,14,230,183,14,3,40,5,230,2,192,1662
    7610 DATA 16,14,8,58,0,230,198,2,95,22,44,205,148,214,58,0,230,1526
    7620 DATA 16,95,22,45,6,5,205,148,214,28,16,250,201,15,15,0,255,1520
    7630 DATA 16,255,240,240,240,240,15,15,0,255,255,240,240,0,240,0,240,2715
    7640 DATA 16,0,15,255,0,255,15,240,0,240,0,15,255,0,240,240,240,2010
    7650 DATA 16,0,240,240,15,255,255,15,15,15,0,240,240,15,255,255,15,2070
    7660 DATA 16,0,15,0,15,0,0,255,240,15,240,255,0,15,0,0,255,1305
    7670 DATA 16,240,15,15,15,7,5,5,5,7,2,6,2,2,7,7,1,341
    7680 DATA 16,7,4,7,7,1,7,1,7,5,5,7,1,1,7,4,7,78
    7690 DATA 16,1,7,7,4,7,5,7,7,1,1,1,1,7,5,7,5,73
    7700 DATA 6,7,7,5,7,1,7,34
    7710 DATA 0

    ファイルでの公開もしておきます。
    実行に必要なのは、次のBASICコードだけです。

    BASICコード(マシン語含む)

    アセンブラコード(参考)



    追記:続きの記事を書きました

    次回「オールマシン語化の巻き」です。



    iPhone + safariでプレイできました

    MSXPenで動かしたゲームを、iPhoneのSafariでもプレイできましたので、紹介しておきます。

    全画面モードにすると、画面上にタッチコントローラーが表示され、ゲームを操作できます。ぜひお試しください。

    やり方は次の通りです。

    画像
    iPhone + safari 横画面
    画像
    iPhone + safari 縦画面

    1. MSXPenを全画面モードに切り替える

    次の画面の「赤丸」部分の全画面ボタンをタップします。これは、先ほど紹介した「全画面モード」と同じボタンです。

    iPhoneでは、画面上に十字キーやボタンのタッチコントローラーが表示され、ゲームを操作できます。ただし、私の環境では、この状態だとゲーム画面の上部が隠れてしまいました。

    画像
    全画面モードではメニューが隠れていますが、
    画面内をタップするとメニューがせりあがってきます。

    プログラムへのリンクを押して次の画面が出てきたときには、赤丸のボタンを押してください。これで全画面モードになりますが、ゲーム画面の上部が隠れています。

    画像

    2. Safariのツールバーを非表示にする

    ゲーム画面をすべて表示するためには、Safariのツールバーを非表示にします。

    次の画面のように、アドレスバー左側にある、「赤丸」部分のページメニューボタンをタップし、「ツールバーを非表示」を選択します。私の環境では、これでゲーム画面全体が表示されました。

    画像
    基本ツールバーは表示されるようなので、そのたびに非表示してください。



    過去に作ったインベーダーゲーム

    私が過去に作ったインベーダーゲームの最新記事はこちらです。


    #時産時利 #AI活用 #時短術 #MSX #レトロゲーム #生成AI #Claude #インベーダー #シューティングゲーム #iphone #safari #スマホ #pc

     
     
    AIで時間を生み出す実験をしています。 元PC系出版社編集者。 Claude・ChatGPT・Geminiを並行使用しながら、 実践した話だけを書いています。

    あなたへのおすすめ