Syn BASICで作ったプログラムの例(5)

このページをスマホなどでご覧になる場合は、画面を横長にする方が読みやすくなります。
目次へ  前のページへ (1) (2) (3) (4) (5) 次のページへ
2022年11月24日 公開。以前はSyn BASIC(オンラインBASICインタプリタ)のページのコンテンツであったSyn BASICで作ったプログラムの例を、独立させて当ページにした。

前のページから引き続き、Syn BASICで作ったプログラムの例を紹介します。

3.ゲームのプログラム

3-1.じゃんけんをするプログラム

リスト12は、コンピュータとじゃんけんができるプログラムです。

グーを出す時は、1またはGのキーを押してください。チョキを出す時は2またはCのキーを押してください。パーを出す時は、3またはPのキーを押してください。

リスト12、じゃんけんをするプログラムCOPY
10  CLS
20  PRINT "じゃんけんをします。"
30  PRINT
40  DIM A$(2)
50  A$(0)="グー"
60  A$(1)="チョキ"
70  A$(2)="パー"
80  WAIT 2000
90  PRINT "グーを出す時は、1またはGのキーを押してください。"
100 PRINT "チョキを出す時は、2またはCのキーを押してください。"
110 PRINT "パーを出す時は、3またはPのキーを押してください。"
120 PRINT
130 WAIT 2000
140 PRINT "じゃん ";
150 WAIT 500
160 PRINT "けん ";
170 WAIT 500
180 PRINT "ぽん"
190 PRINT
200 C=INT(RND*3)  :'コンピュータの次の手
210 U$=INKEY$     :'キーバッファをクリア
220 U$=INKEY$     :'ユーザーの手の入力
230 IF U$="1" OR U$="G" OR U$="g" THEN U=0:GOTO 270
240 IF U$="2" OR U$="C" OR U$="c" THEN U=1:GOTO 270
250 IF U$="3" OR U$="P" OR U$="p" THEN U=2:GOTO 270
260 GOTO 220
270 PRINT "あなたの手: ";A$(U)
280 PRINT "私の手: ";A$(C)
290 IF U=C THEN PRINT "あいこです。":GOTO 320
300 IF U=(C+1) MOD 3 THEN PRINT "あなたの負けです。":GOTO 320
310 PRINT "あなたの勝ちです。"
320 PRINT
330 GOTO 80

リスト12のプログラムは、画面11のRUNボタン(青い三角形のボタン)をクリックすると、実際に実行できます。

10 CLS
20 PRINT "じゃんけんをします。"
30 PRINT
40 DIM A$(2)
50 A$(0)="グー"
60 A$(1)="チョキ"
70 A$(2)="パー"
80 WAIT 2000
90 PRINT "グーを出す時は、1またはGのキーを押してください。"
100 PRINT "チョキを出す時は、2またはCのキーを押してください。"
110 PRINT "パーを出す時は、3またはPのキーを押してください。"
120 PRINT
130 WAIT 2000
140 PRINT "じゃん ";
150 WAIT 500
160 PRINT "けん ";
170 WAIT 500
180 PRINT "ぽん"
190 PRINT
200 C=INT(RND*3) :'コンピュータの次の手
210 U$=INKEY$ :'キーバッファをクリア
220 U$=INKEY$ :'ユーザーの手の入力
230 IF U$="1" OR U$="G" OR U$="g" THEN U=0:GOTO 270
240 IF U$="2" OR U$="C" OR U$="c" THEN U=1:GOTO 270
250 IF U$="3" OR U$="P" OR U$="p" THEN U=2:GOTO 270
260 GOTO 220
270 PRINT "あなたの手: ";A$(U)
280 PRINT "私の手: ";A$(C)
290 IF U=C THEN PRINT "あいこです。":GOTO 320
300 IF U=(C+1) MOD 3 THEN PRINT "あなたの負けです。":GOTO 320
310 PRINT "あなたの勝ちです。"
320 PRINT
330 GOTO 80
CLS:LIST
画面11、じゃんけんをするプログラム

3-2.サイコロの目をあてるゲーム

リスト13のプログラムは、サイコロの目をあてるゲームです。画面にサイコロが表示されますから、1~6のいずれかのキーを押して、次の目をあててください。アタリやハズレを気にしないなら、単なるサイコロとしても利用できます。

リスト13、サイコロの目をあてるゲームCOPY
10 WIDTH 40,20,0:LOCATE ,,1
20 DIM D$(6,3)
30 '1
40 D$(1,1)="          "
50 D$(1,2)="    ●    "
60 D$(1,3)="          "
70 '2
80 D$(2,1)="●        "
90 D$(2,2)="          "
100 D$(2,3)="        ●"
110 '3
120 D$(3,1)="●        "
130 D$(3,2)="    ●    "
140 D$(3,3)="        ●"
150 '4
160 D$(4,1)="●      ●"
170 D$(4,2)="          "
180 D$(4,3)="●      ●"
190 '5
200 D$(5,1)="●      ●"
210 D$(5,2)="    ●    "
220 D$(5,3)="●      ●"
230 '6
240 D$(6,1)="●      ●"
250 D$(6,2)="●      ●"
260 D$(6,3)="●      ●"
270 DICE=1        :'最後に出たサイコロの目
280 DICE_X=16     :'さいころのX座標
290 DICE_Y=0      :'さいころのY座標
300 GUESS_X=2     :'目の予想のX座標
310 GUESS_Y=7     :'目の予想のY座標
320 ANS_X=18      :'出た目のX座標
330 ANS_Y=7       :'出た目のY座標
340 RESULT_X=0    :'正解/不正解のメッセージのX座標
350 RESULT_Y=9    :'正解/不正解のメッセージのY座標
360 ACCURACY_X=0  :'正解率のX座標
370 ACCURACY_Y=15 :'正解率のY座標
380 QUESTION_X=0  :'質問のX座標
390 QUESTION_Y=17 :'質問のY座標
400 TIMES=0       :'遊んだ回数
410 CLS
420 IF TIMES=0 THEN 450
430 LOCATE GUESS_X,GUESS_Y
440 PRINT "あなたの予想:";G
450 N=INT(RND*6)+15
460 T=500*1.4^(-N)
470 FOR I=1 TO N
480   DICE=DICE+1
490   IF DICE>6 THEN DICE=1
500   PARAM=DICE:GOSUB *DISP_DICE
510   WAIT T
520   T=T*1.4
530 NEXT
540 LOCATE ANS_X,ANS_Y
550 IF TIMES=0 THEN 710
560 PRINT "実際のサイコロの目:";DICE
570 LOCATE RESULT_X,RESULT_Y
580 IF G<>DICE THEN 660
590 ACCURACY=ACCURACY+1
600 PRINT "   ●●●●●    ●●●●    ●    ●"
610 PRINT "       ●  ●    ●    ●    ●    ●"
620 PRINT "       ●●    ●  ●  ●    ●    ●"
630 PRINT "       ●            ●            ●"
640 PRINT "     ●          ●●          ●●"
650 GOTO 690
660 PRINT "   ●  ●    ●●●●● ● ●  ●"
670 PRINT "   ●  ●          ●   ● ●  ●"
680 PRINT "   ●  ●        ●            ●    ●"
682 PRINT " ●      ●    ●  ●          ●  ●"
684 PRINT " ●      ●  ●      ●        ●●"
690 LOCATE ACCURACY_X,ACCURACY_Y
700 PRINT TIMES;"回中";ACCURACY;"回あたりました。正答率";INT(ACCURACY/TIMES*1000+0.5)/10;"%です。"
710 LOCATE QUESTION_X,QUESTION_Y
720 PRINT "次に出るサイコロの目は何だと思いますか?1~6のキーを押して答えてください。";
725 K$=INKEY$ :'キーバッファのクリア
730 K$=INKEY$
740 IF K$<"1" OR K$>"6" THEN WAIT 100:GOTO 730
750 G=ASC(K$)-ASC("0")
760 TIMES=TIMES+1
770 GOTO 410
780 *DISP_DICE
790 FOR DD_I=1 TO 3
800   LOCATE DICE_X,DICE_Y+(DD_I-1)*2
810   PRINT D$(PARAM,DD_I);
820 NEXT
830 RETURN

リスト13のプログラムは、画面12のRUNボタン(青い三角形のボタン)をクリックすると、実際に実行できます。

10 WIDTH 40,20,0:LOCATE ,,1
20 DIM D$(6,3)
30 '1
40 D$(1,1)=" "
50 D$(1,2)=" ● "
60 D$(1,3)=" "
70 '2
80 D$(2,1)="● "
90 D$(2,2)=" "
100 D$(2,3)=" ●"
110 '3 120 D$(3,1)="● "
130 D$(3,2)=" ● "
140 D$(3,3)=" ●"
150 '4
160 D$(4,1)="● ●"
170 D$(4,2)=" "
180 D$(4,3)="● ●"
190 '5
200 D$(5,1)="● ●"
210 D$(5,2)=" ● "
220 D$(5,3)="● ●"
230 '6
240 D$(6,1)="● ●"
250 D$(6,2)="● ●"
260 D$(6,3)="● ●"
270 DICE=1 :'最後に出たサイコロの目
280 DICE_X=16 :'さいころのX座標
290 DICE_Y=0 :'さいころのY座標
300 GUESS_X=2 :'目の予想のX座標
310 GUESS_Y=7 :'目の予想のY座標
320 ANS_X=18 :'出た目のX座標
330 ANS_Y=7 :'出た目のY座標
340 RESULT_X=0 :'正解/不正解のメッセージのX座標
350 RESULT_Y=9 :'正解/不正解のメッセージのY座標
360 ACCURACY_X=0 :'正解率のX座標
370 ACCURACY_Y=15 :'正解率のY座標
380 QUESTION_X=0 :'質問のX座標
390 QUESTION_Y=17 :'質問のY座標
400 TIMES=0 :'遊んだ回数
410 CLS
420 IF TIMES=0 THEN 450
430 LOCATE GUESS_X,GUESS_Y
440 PRINT "あなたの予想:";G
450 N=INT(RND*6)+15
460 T=500*1.4^(-N)
470 FOR I=1 TO N
480 DICE=DICE+1
490 IF DICE>6 THEN DICE=1
500 PARAM=DICE:GOSUB *DISP_DICE
510 WAIT T
520 T=T*1.4
530 NEXT
540 LOCATE ANS_X,ANS_Y
550 IF TIMES=0 THEN 710
560 PRINT "実際のサイコロの目:";DICE
570 LOCATE RESULT_X,RESULT_Y
580 IF G<>DICE THEN 660
590 ACCURACY=ACCURACY+1
600 PRINT " ●●●●● ●●●● ● ●"
610 PRINT " ● ● ● ● ● ●"
620 PRINT " ●● ● ● ● ● ●"
630 PRINT " ● ● ●"
640 PRINT " ● ●● ●●"
650 GOTO 690
660 PRINT " ● ● ●●●●● ● ● ●"
670 PRINT " ● ● ● ● ● ●"
680 PRINT " ● ● ● ● ●"
682 PRINT " ● ● ● ● ● ●"
684 PRINT " ● ● ● ● ●●"
690 LOCATE ACCURACY_X,ACCURACY_Y
700 PRINT TIMES;"回中";ACCURACY;"回あたりました。正答率";INT(ACCURACY/TIMES*1000+0.5)/10;"%です。"
710 LOCATE QUESTION_X,QUESTION_Y
720 PRINT "次に出るサイコロの目は何だと思いますか?1~6のキーを押して答えてください。";
725 K$=INKEY$ :'キーバッファのクリア
730 K$=INKEY$
740 IF K$<"1" OR K$>"6" THEN WAIT 100:GOTO 730
750 G=ASC(K$)-ASC("0")
760 TIMES=TIMES+1
770 GOTO 410
780 *DISP_DICE
790 FOR DD_I=1 TO 3
800 LOCATE DICE_X,DICE_Y+(DD_I-1)*2
810 PRINT D$(PARAM,DD_I);
820 NEXT
830 RETURN
画面12、じゃんけんをするプログラム

3-3.シューティングゲーム

リスト14は、筆者が作ったSTAR CRUISEというシューティングゲームのプログラムです。

リスト14、シューティングゲーム、STAR CRUISECOPY
1000 'SCRUISE.BAS
1010 '
1020 '  ###################################
1030 '  #                                 #
1040 '  #     STAR CRUISE by しなぷす     #
1050 '  #                                 #
1060 '  #          Version 1.00           #
1070 '  #                                 #
1080 '  #          Nov/15/2022            #
1090 '  #                                 #
1100 '  # Syn BASIC用シューティングゲーム #
1110 '  #                                 #
1120 '  ###################################
1130 '
1140 '画面モードの設定
1150 WIDTH 32,20,0
1160 LOCATE ,,1
1170 'プログラム開始時の変数の初期化
1180 MAX_STAR=50                               :'星の最大数
1190 DIM STAR_X(MAX_STAR-1),STAR_Y(MAX_STAR-1) :'星のX座標とY座標
1200 MAX_EXP=MAX_STAR                          :'爆発処理の最大数
1210 DIM EXP_X(MAX_EXP-1),EXP_Y(MAX_EXP-1)     :'爆発のX座標とY座標
1220 DIM EXP_PHASE(MAX_EXP-1)                  :'爆発処理の進展度合い(PHASE)
1230 DIM EXP_START(MAX_EXP-1)                  :'爆発処理が始まった時刻
1240 EXP_TIMER=70                              :'爆発処理が進むのに必要な時間
1250 EXP_NUM=0                                 :'処理中の爆発の数
1260 HIGH_SCORE=0                              :'ハイスコア
1270 HIGH_SCORE_X=26                           :'ハイスコア表示のx座標
1280 SCORE_X=7                                 :'スコア表示のx座標
1290 SHIP_Y=16                                 :'宇宙船のy座標
1300 SHELL_TIMER=50                            :'弾が進むのに掛かる時間
1310 STAR_TIMER=500                            :'星が進むのにかかる時間
1320 '起動時画面の表示
1330 CLS
1340 GOSUB *DISP_TITLE
1350 PRINT
1360 PRINT "  あなたは宇宙船で、旅をしています。前方から、";
1370 PRINT "星が流れてきますので、弾で撃ち落とすか、宇宙船を";
1380 PRINT "動かして、星をよけて進んでください。"
1390 PRINT
1400 PRINT "  使用するキー"
1410 PRINT "  左に移動:← または 4"
1420 PRINT "  右に移動:→ または 6"
1430 PRINT "  発射:スペース、Z、または 5"
1440 PRINT
1450 PRINT "  0 または S のキーで、ゲームが始まります。"
1455 'キー待ち
1460 WAIT 100
1470 K$=INKEY$
1480 IF K$<>"0" AND K$<>"s" AND K$<>"S" THEN 1460
1490 *MAIN_LOOP
1500 'ゲーム開始時の変数の初期化
1510 SCORE=0         :'スコア
1520 SHIP_X=14       :'宇宙船のx座標(必ず偶数)
1530 STAR_NUM=0      :'星の数
1540 SHELL_X=-1      :'弾のx座標
1550 SHELL_Y=-1      :'弾のy座標(負の数なら弾無し)
1560 SHELL_CLOCK=NOW :'弾推進用クロック
1570 STAR_CLOCK=NOW  :'星推進用クロック
1580 'ゲーム開始時の画面の初期化
1590 CLS
1600 'スコア欄の表示
1610 LOCATE 0,SCORE_Y
1620 PRINT "スコア:";
1630 'ハイスコアの表示
1640 LOCATE 15
1650 PRINT "ハイスコア:";
1660 LOCATE HIGH_SCORE_X
1670 PARAM_SCORE=HIGH_SCORE:GOSUB *DISP_SCORE
1680 *INNER_LOOP
1690 WAIT 10
1700 'スコアを表示する
1710 LOCATE SCORE_X,SCORE_Y
1720 PARAM_SCORE=SCORE:GOSUB *DISP_SCORE
1730 '押されたキーに応じて処理を分岐
1740 C$=INKEY$
1750 GOSUB *CLEAR_SHIP
1760 K=C$="LEFT" OR C$="4"                  :'宇宙船を左に動かすキーの判定
1770 IF K THEN SHIP_X=SHIP_X-2:GOTO 1820
1780 K=C$="RIGHT" OR C$="6"                 :'宇宙船を右に動かすキーの判定
1790 IF K THEN SHIP_X=SHIP_X+2:GOTO 1820
1800 K=C$=" " OR C$="z" OR C$="Z" OR C$="5" :'弾を発射するキーの判定
1810 IF K AND SHELL_Y<0 THEN GOSUB *FIRE    :'砲弾を発射
1820 '宇宙船が画面外に出ない様に座標を補正
1830 IF SHIP_X< 2 THEN SHIP_X= 2
1840 IF SHIP_X>28 THEN SHIP_X=28
1850 GOSUB *DISP_SHIP                  :'宇宙船を表示
1860 GOSUB *SHIP_COLLISION             :'宇宙船と当たった星がないかを調べる
1870 IF RESULT THEN *GAME_OVER         :'宇宙船と当たった星があった
1880 '弾を動かすタイミングになっているかを調べる
1890 IF SHELL_Y<0 OR NOW-SHELL_CLOCK<SHELL_TIMER THEN 1920
1900 SHELL_CLOCK=SHELL_CLOCK+SHELL_TIMER
1910 GOSUB *MOVE_SHELL                 :'弾を動かす
1920 '星を動かすタイミングになっているかを調べる
1930 IF NOW-STAR_CLOCK<STAR_TIMER THEN 1970
1940 STAR_CLOCK=STAR_CLOCK+STAR_TIMER
1950 GOSUB *MOVE_STAR                  :'星を動かす
1960 IF RESULT THEN *GAME_OVER         :'宇宙船に当たった星があった
1970 '爆発処理
1980 I=0
1990 IF I=EXP_NUM THEN 2230
2000 LAPSE=NOW-EXP_START(I)
2010 IF LAPSE<EXP_TIMER THEN 2220
2020 IF EXP_PHASE(I)>0 THEN 2060
2030 EXP_PHASE(I)=1
2040 PARAM_INDEX=I:GOSUB *DISP_EXP
2050 GOTO 2220
2060 IF LAPSE<EXP_TIMER*2 THEN 2220
2070 IF EXP_PHASE(I)>1 THEN 2110
2080 EXP_PHASE(I)=2
2090 PARAM_INDEX=I:GOSUB *DISP_EXP
2100 GOTO 2220
2110 IF LAPSE<EXP_TIMER*3 THEN 2220
2120 EXP_PHASE(I)=3
2130 PARAM_INDEX=I:GOSUB *DISP_EXP
2140 EXP_NUM=EXP_NUM-1
2150 FOR J=I TO EXP_NUM-1
2160   EXP_X(J)=EXP_X(J+1)
2170   EXP_Y(J)=EXP_Y(J+1)
2180   EXP_PHASE(J)=EXP_PHASE(J+1)
2190   EXP_START(J)=EXP_START(J+1)
2200 NEXT
2210 GOTO 1990
2220 I=I+1:GOTO 1990
2230 STAR_TIMER=STAR_TIMER*0.9999+0.005  :'星を動かすまでの時間を縮める
2240 GOTO *INNER_LOOP
2250 *GAME_OVER
2260 'ゲームオーバー
2270 FOR I=1 TO 4
2280   LOCATE SHIP_X-2,SHIP_Y  :PRINT "#*ー";
2290   LOCATE SHIP_X-2,SHIP_Y+1:PRINT "$%?";
2300   LOCATE SHIP_X-2,SHIP_Y+2:PRINT "<¥/";
2310   WAIT 300
2320   LOCATE SHIP_X-2,SHIP_Y  :PRINT "¥%+";
2330   LOCATE SHIP_X-2,SHIP_Y+1:PRINT "$*<";
2340   LOCATE SHIP_X-2,SHIP_Y+2:PRINT "?#>";
2350   WAIT 300
2360 NEXT
2370 LOCATE 0,1
2380 GOSUB *DISP_TITLE
2390 LOCATE 8, 7:PRINT "  ------------- "
2400 LOCATE 8, 8:PRINT "  - GAME OVER - "
2410 LOCATE 8, 9:PRINT "  ------------- "
2420 LOCATE 2,14:PRINT "  S または 0 のキーでスタート "
2430 'ハイスコア更新処理
2440 IF SCORE<=HIGH_SCORE THEN 2490
2450 LOCATE 8,11:PRINT " ハイスコア更新!"
2460 HIGH_SCORE=SCORE
2470 LOCATE HIGH_SCORE_X,SCORE_Y
2480 PARAM_SCORE=HIGH_SCORE:GOSUB *DISP_SCORE
2490 'キー待ち
2500 K$=INKEY$
2510 IF K$="s" OR K$="S" OR K$="0" THEN GOTO *MAIN_LOOP
2520 WAIT 100
2530 GOTO 2500
2540 *MOVE_SHELL
2550 '--------------
2560 '- 弾を動かす -
2570 '--------------
2580 '弾を消去する
2590 GOSUB *CLEAR_SHELL
2600 '弾を1つ進ませる
2610 SHELL_Y=SHELL_Y-1
2620 IF SHELL_Y<=SCORE_Y THEN SHELL_Y=-1:RETURN :'弾が消えた
2630 GOSUB *SHELL_COLLISION                     :'弾に当たった敵の処理
2640 IF RESULT=0 THEN GOSUB *DISP_SHELL  :'弾に当たった敵がなければ弾を表示
2650 RETURN
2660 *FIRE
2670 '------------------------
2680 '- 弾を発射する時の処理 -
2690 '------------------------
2700 SHELL_X=SHIP_X:SHELL_Y=SHIP_Y-1
2710 GOSUB *SHELL_COLLISION  :'弾に当たった敵がいるかを調べる
2720 IF RESULT THEN RETURN   :'弾に当たった敵がいた
2730 GOSUB *DISP_SHELL
2740 SHELL_CLOCK=NOW         :'弾の発射時刻の記録
2750 RETURN
2760 *MOVE_STAR
2770 '-------------------------------------------------------
2780 '- 星を発生させ、動かす                                -
2790 '- RESULT 宇宙船に当たった星があれば1、なければ0を返す -
2800 '-------------------------------------------------------
2810 '全ての星を消去する
2820 FOR PARAM_INDEX=0 TO STAR_NUM-1
2830   GOSUB *CLEAR_STAR
2840 NEXT
2850 '全ての星を1つずつ進ませ、消えた星を除去する
2860 MS_J=0
2870 FOR MS_I=0 TO STAR_NUM-1
2880   MS_TEMP=STAR_Y(MS_I)+1
2890   IF MS_TEMP<=SHIP_Y+2 THEN 2920
2900   SCORE=SCORE+1
2910   CONTINUE
2920   STAR_Y(MS_J)=MS_TEMP
2930   STAR_X(MS_J)=STAR_X(MS_I)
2940   MS_J=MS_J+1
2950 NEXT
2960 'ある確率で新しい星を発生する
2970 STAR_NUM=MS_J
2980 IF STAR_NUM=0 THEN MS_PROB=0.7:GOTO 3040
2990 IF STAR_NUM=1 THEN MS_PROB=0.4:GOTO 3040
3000 IF STAR_NUM=2 THEN MS_PROB=0.3:GOTO 3040
3010 IF STAR_NUM=3 THEN MS_PROB=0.2:GOTO 3040
3020 IF STAR_NUM=4 THEN MS_PROB=0.15:GOTO 3040
3030 MS_PROB=0.1
3040 IF STAR_NUM=MAX_STAR OR RND>MS_PROB THEN 3080
3050 STAR_X(STAR_NUM)=INT(RND*14)*2+2
3060 STAR_Y(STAR_NUM)=SCORE_Y+1
3070 STAR_NUM=STAR_NUM+1
3080 '宇宙船に当たった星があるかを調べる
3090 GOSUB *SHIP_COLLISION        :'宇宙船に当たった星があるかを調べる
3100 IF RESULT THEN RETURN   :'宇宙船に当たった星があった
3110 GOSUB *SHELL_COLLISION  :'弾に当たった星の処理
3120 '全ての星を表示する
3130 FOR PARAM_INDEX=0 TO STAR_NUM-1
3140   GOSUB *DISP_STAR
3150 NEXT
3160 RESULT=0
3170 RETURN
3180 *DISP_SHIP
3190 '--------------------
3200 '- 宇宙船を表示する -
3210 '--------------------
3220 LOCATE SHIP_X,SHIP_Y:PRINT "▲";
3230 LOCATE SHIP_X,SHIP_Y+1:PRINT "■";
3240 LOCATE SHIP_X-2,SHIP_Y+2:PRINT "▟■▙";
3250 RETURN
3260 *CLEAR_SHIP
3270 '--------------------
3280 '- 宇宙船を消去する -
3290 '--------------------
3300 LOCATE SHIP_X,SHIP_Y:PRINT "  "
3310 LOCATE SHIP_X,SHIP_Y+1:PRINT "  ";
3320 LOCATE SHIP_X-2,SHIP_Y+2:PRINT "      ";
3330 RETURN
3340 *DISP_SHELL
3350 '----------------
3360 '- 弾を表示する -
3370 '----------------
3380 LOCATE SHELL_X,SHELL_Y:PRINT "●";
3390 RETURN
3400 *CLEAR_SHELL
3410 '----------------
3420 '- 星を表示する -
3430 '----------------
3440 LOCATE SHELL_X,SHELL_Y:PRINT "  ";
3450 RETURN
3460 *DISP_STAR
3470 '--------------------------------
3480 '- 星を表示する                 -
3490 '- PARAM_INDEX 星のインデックス -
3500 '--------------------------------
3510 LOCATE STAR_X(PARAM_INDEX),STAR_Y(PARAM_INDEX)
3520 PRINT "★";
3530 RETURN
3540 *CLEAR_STAR
3550 '--------------------------------
3560 '- 星を消去する                 -
3570 '- PARAM_INDEX 星のインデックス -
3580 '--------------------------------
3590 LOCATE STAR_X(PARAM_INDEX),STAR_Y(PARAM_INDEX)
3600 PRINT "  ";
3610 RETURN
3620 *REGISTER_EXP
3630 '-----------------------
3640 '- 爆発処理を登録する  -
3650 '- PARAM_X 爆発のx座標 -
3660 '- PARAM_Y 爆発のy座標 -
3670 '-----------------------
3680 IF EXP_NUM=MAX_EXP THEN RETURN
3690 EXP_X(EXP_NUM)=PARAM_X
3700 EXP_Y(EXP_NUM)=PARAM_Y
3710 EXP_PHASE(EXP_NUM)=0
3720 EXP_START(EXP_NUM)=NOW
3730 PARAM_INDEX=EXP_NUM:GOSUB *DISP_EXP
3740 EXP_NUM=EXP_NUM+1
3750 RETURN
3760 *DISP_EXP
3770 '--------------------------------------
3780 '- 爆発の表示                         -
3790 '- PARAM_INDEX 爆発処理のインデックス -
3800 '--------------------------------------
3810 DE_X=EXP_X(PARAM_INDEX)         :'爆発処理のx座標
3820 DE_Y=EXP_Y(PARAM_INDEX)         :'爆発処理のy座標
3830 DE_PHASE=EXP_PHASE(PARAM_INDEX) :'爆発処理の進展度合い(0~3の整数)
3840 IF DE_PHASE<>0 THEN 3880
3850 'PHASEが0だった
3860 LOCATE DE_X,DE_Y:PRINT "╋";
3870 RETURN
3880 IF DE_PHASE<>1 THEN 3960
3890 'PHASEが1だった
3900 IF DE_Y=SCORE_Y+1 THEN 3920          :スコアを消さない様にスキップ
3910 LOCATE DE_X  ,DE_Y-1:PRINT "┃";
3920 LOCATE DE_X-2,DE_Y  :PRINT "━╋━";
3930 IF DE_Y=SHIP_Y-1 THEN 3950           :宇宙船を消さない様にスキップ
3940 LOCATE DE_X  ,DE_Y+1:PRINT "┃";
3950 RETURN
3960 IF DE_PHASE<>2 THEN 4040
3970 'PHASEが2だった
3980 IF DE_Y=SCORE_Y+1 THEN 4000
3990 LOCATE DE_X  ,DE_Y-1:PRINT "┃";
4000 LOCATE DE_X-2,DE_Y  :PRINT "━  ━";
4010 IF DE_Y=SHIP_Y-1 THEN 4030
4020 LOCATE DE_X  ,DE_Y+1:PRINT "┃";
4030 RETURN
4040 'PHASEが3だった
4050 IF DE_Y=SCORE_Y+1 THEN 4070
4060 LOCATE DE_X  ,DE_Y-1:PRINT "  ";
4070 LOCATE DE_X-2,DE_Y  :PRINT "  ";
4080 LOCATE DE_X+2,DE_Y  :PRINT "  ";
4090 IF DE_Y=SHIP_Y-1 THEN 4110
4100 LOCATE DE_X  ,DE_Y+1:PRINT "  ";
4110 RETURN
4120 *DISP_TITLE
4130 '----------------------------------------------------
4140 '- 現在カーソルがある行にゲームのタイトルを表示する -
4150 '----------------------------------------------------
4160 LOCATE 8:PRINT " *************** "
4170 LOCATE 8:PRINT " * STAR CRUISE * "
4180 LOCATE 8:PRINT " *************** "
4190 RETURN
4200 *SHELL_COLLISION
4210 '--------------------------------------------------------------------
4220 '- 弾に当たった星があるか調べ、もしあれば、得点加算と星の除去をする -
4230 '- RESULT 弾に当たった星がなければ0を返し、あれば1を返す。          -
4240 '--------------------------------------------------------------------
4250 '弾に当たった星があるかを調べる
4260 SC_I=0
4270 IF SC_I=STAR_NUM THEN RESULT=0:RETURN  :'弾に当たった星がなかった
4280 IF STAR_X(SC_I)=SHELL_X AND STAR_Y(SC_I)=SHELL_Y THEN 4310
4290 SC_I=SC_I+1
4300 GOTO 4270
4310 '弾に当たった星があった
4320 SCORE=SCORE+10                                       :'得点を加算
4330 PARAM_X=SHELL_X:PARAM_Y=SHELL_Y:GOSUB *REGISTER_EXP  :'爆発を登録
4340 SHELL_Y=-1                                           :'弾を削除
4350 '星を削除する
4360 STAR_NUM=STAR_NUM-1
4370 FOR SC_I=SC_I TO STAR_NUM-1
4380   STAR_X(SC_I)=STAR_X(SC_I+1)
4390   STAR_Y(SC_I)=STAR_Y(SC_I+1)
4400 NEXT
4410 RESULT=1:RETURN
4420 *SHIP_COLLISION
4430 '---------------------------------------------------------------
4440 '- 宇宙船に当たった星があるかどうか調べる                      -
4450 '- RESULT 宇宙船に当たった星があれば1を返し、なければ0を返す。 -
4460 '---------------------------------------------------------------
4470 RESULT=1
4480 FOR SC_I=0 TO STAR_NUM-1
4490   SC_X=STAR_X(SC_I)
4500   SC_Y=STAR_Y(SC_I)
4510   IF SC_Y=SHIP_Y   AND SC_X=SHIP_X THEN RETURN
4520   IF SC_Y=SHIP_Y+1 AND SC_X=SHIP_X THEN RETURN
4530   IF SC_Y=SHIP_Y+2 AND SC_X>=SHIP_X-2 AND SC_X<=SHIP_X+2 THEN RETURN
4540 NEXT
4550 RESULT=0
4560 RETURN
4570 *DISP_SCORE
4580 '--------------------------------
4590 '- 得点をカーソル位置に表示する -
4600 '- PARAM_SCORE 表示する得点     -
4610 '--------------------------------
4620 DS_S$=RIGHT$("     "+STR$(PARAM_SCORE),6)
4630 PRINT DS_S$;
4640 RETURN

リスト14のプログラムは、画面13のRUNボタン(青い三角形のボタン)をクリックすると、実際に実行できます。

1000 'SCRUISE.BAS
1010 '
1020 ' ###################################
1030 ' # #
1040 ' # STAR CRUISE by しなぷす #
1050 ' # #
1060 ' # Version 1.00 #
1070 ' # #
1080 ' # Nov/15/2022 #
1090 ' # #
1100 ' # Syn BASIC用シューティングゲーム #
1110 ' # #
1120 ' ###################################
1130 '
1140 '画面モードの設定
1150 WIDTH 32,20,0
1160 LOCATE ,,1
1170 'プログラム開始時の変数の初期化
1180 MAX_STAR=50 :'星の最大数
1190 DIM STAR_X(MAX_STAR-1),STAR_Y(MAX_STAR-1) :'星のX座標とY座標
1200 MAX_EXP=MAX_STAR :'爆発処理の最大数
1210 DIM EXP_X(MAX_EXP-1),EXP_Y(MAX_EXP-1) :'爆発のX座標とY座標
1220 DIM EXP_PHASE(MAX_EXP-1) :'爆発処理の進展度合い(PHASE)
1230 DIM EXP_START(MAX_EXP-1) :'爆発処理が始まった時刻
1240 EXP_TIMER=70 :'爆発処理が進むのに必要な時間
1250 EXP_NUM=0 :'処理中の爆発の数
1260 HIGH_SCORE=0 :'ハイスコア
1270 HIGH_SCORE_X=26 :'ハイスコア表示のx座標
1280 SCORE_X=7 :'スコア表示のx座標
1290 SHIP_Y=16 :'宇宙船のy座標
1300 SHELL_TIMER=50 :'弾が進むのに掛かる時間
1310 STAR_TIMER=500 :'星が進むのにかかる時間
1320 '起動時画面の表示
1330 CLS
1340 GOSUB *DISP_TITLE
1350 PRINT
1360 PRINT " あなたは宇宙船で、旅をしています。前方から、";
1370 PRINT "星が流れてきますので、弾で撃ち落とすか、宇宙船を";
1380 PRINT "動かして、星をよけて進んでください。"
1390 PRINT
1400 PRINT " 使用するキー"
1410 PRINT " 左に移動:← または 4"
1420 PRINT " 右に移動:→ または 6"
1430 PRINT " 発射:スペース、Z、または 5"
1440 PRINT
1450 PRINT " 0 または S のキーで、ゲームが始まります。"
1455 'キー待ち
1460 WAIT 100
1470 K$=INKEY$
1480 IF K$<>"0" AND K$<>"s" AND K$<>"S" THEN 1460
1490 *MAIN_LOOP
1500 'ゲーム開始時の変数の初期化
1510 SCORE=0 :'スコア
1520 SHIP_X=14 :'宇宙船のx座標(必ず偶数)
1530 STAR_NUM=0 :'星の数
1540 SHELL_X=-1 :'弾のx座標
1550 SHELL_Y=-1 :'弾のy座標(負の数なら弾無し)
1560 SHELL_CLOCK=NOW :'弾推進用クロック
1570 STAR_CLOCK=NOW :'星推進用クロック
1580 'ゲーム開始時の画面の初期化
1590 CLS
1600 'スコア欄の表示
1610 LOCATE 0,SCORE_Y
1620 PRINT "スコア:";
1630 'ハイスコアの表示
1640 LOCATE 15
1650 PRINT "ハイスコア:";
1660 LOCATE HIGH_SCORE_X
1670 PARAM_SCORE=HIGH_SCORE:GOSUB *DISP_SCORE
1680 *INNER_LOOP
1690 WAIT 10
1700 'スコアを表示する
1710 LOCATE SCORE_X,SCORE_Y
1720 PARAM_SCORE=SCORE:GOSUB *DISP_SCORE
1730 '押されたキーに応じて処理を分岐
1740 C$=INKEY$
1750 GOSUB *CLEAR_SHIP
1760 K=C$="LEFT" OR C$="4" :'宇宙船を左に動かすキーの判定
1770 IF K THEN SHIP_X=SHIP_X-2:GOTO 1820
1780 K=C$="RIGHT" OR C$="6" :'宇宙船を右に動かすキーの判定
1790 IF K THEN SHIP_X=SHIP_X+2:GOTO 1820
1800 K=C$=" " OR C$="z" OR C$="Z" OR C$="5" :'弾を発射するキーの判定
1810 IF K AND SHELL_Y<0 THEN GOSUB *FIRE :'砲弾を発射
1820 '宇宙船が画面外に出ない様に座標を補正
1830 IF SHIP_X< 2 THEN SHIP_X= 2
1840 IF SHIP_X>28 THEN SHIP_X=28
1850 GOSUB *DISP_SHIP :'宇宙船を表示
1860 GOSUB *SHIP_COLLISION :'宇宙船と当たった星がないかを調べる
1870 IF RESULT THEN *GAME_OVER :'宇宙船と当たった星があった
1880 '弾を動かすタイミングになっているかを調べる
1890 IF SHELL_Y<0 OR NOW-SHELL_CLOCK<SHELL_TIMER THEN 1920
1900 SHELL_CLOCK=SHELL_CLOCK+SHELL_TIMER
1910 GOSUB *MOVE_SHELL :'弾を動かす
1920 '星を動かすタイミングになっているかを調べる
1930 IF NOW-STAR_CLOCK<STAR_TIMER THEN 1970
1940 STAR_CLOCK=STAR_CLOCK+STAR_TIMER
1950 GOSUB *MOVE_STAR :'星を動かす
1960 IF RESULT THEN *GAME_OVER :'宇宙船に当たった星があった
1970 '爆発処理
1980 I=0
1990 IF I=EXP_NUM THEN 2230
2000 LAPSE=NOW-EXP_START(I)
2010 IF LAPSE<EXP_TIMER THEN 2220
2020 IF EXP_PHASE(I)>0 THEN 2060
2030 EXP_PHASE(I)=1
2040 PARAM_INDEX=I:GOSUB *DISP_EXP
2050 GOTO 2220
2060 IF LAPSE<EXP_TIMER*2 THEN 2220
2070 IF EXP_PHASE(I)>1 THEN 2110
2080 EXP_PHASE(I)=2
2090 PARAM_INDEX=I:GOSUB *DISP_EXP
2100 GOTO 2220
2110 IF LAPSE<EXP_TIMER*3 THEN 2220
2120 EXP_PHASE(I)=3
2130 PARAM_INDEX=I:GOSUB *DISP_EXP
2140 EXP_NUM=EXP_NUM-1
2150 FOR J=I TO EXP_NUM-1
2160 EXP_X(J)=EXP_X(J+1)
2170 EXP_Y(J)=EXP_Y(J+1)
2180 EXP_PHASE(J)=EXP_PHASE(J+1)
2190 EXP_START(J)=EXP_START(J+1)
2200 NEXT
2210 GOTO 1990
2220 I=I+1:GOTO 1990
2230 STAR_TIMER=STAR_TIMER*0.9999+0.005 :'星を動かすまでの時間を縮める
2240 GOTO *INNER_LOOP
2250 *GAME_OVER
2260 'ゲームオーバー
2270 FOR I=1 TO 4
2280 LOCATE SHIP_X-2,SHIP_Y :PRINT "#*ー";
2290 LOCATE SHIP_X-2,SHIP_Y+1:PRINT "$%?";
2300 LOCATE SHIP_X-2,SHIP_Y+2:PRINT "<¥/";
2310 WAIT 300
2320 LOCATE SHIP_X-2,SHIP_Y :PRINT "¥%+";
2330 LOCATE SHIP_X-2,SHIP_Y+1:PRINT "$*<";
2340 LOCATE SHIP_X-2,SHIP_Y+2:PRINT "?#>";
2350 WAIT 300
2360 NEXT
2370 LOCATE 0,1
2380 GOSUB *DISP_TITLE
2390 LOCATE 8, 7:PRINT " ------------- "
2400 LOCATE 8, 8:PRINT " - GAME OVER - "
2410 LOCATE 8, 9:PRINT " ------------- "
2420 LOCATE 2,14:PRINT " S または 0 のキーでスタート "
2430 'ハイスコア更新処理
2440 IF SCORE<=HIGH_SCORE THEN 2490
2450 LOCATE 8,11:PRINT " ハイスコア更新!"
2460 HIGH_SCORE=SCORE
2470 LOCATE HIGH_SCORE_X,SCORE_Y
2480 PARAM_SCORE=HIGH_SCORE:GOSUB *DISP_SCORE
2490 'キー待ち
2500 K$=INKEY$
2510 IF K$="s" OR K$="S" OR K$="0" THEN GOTO *MAIN_LOOP
2520 WAIT 100
2530 GOTO 2500
2540 *MOVE_SHELL
2550 '--------------
2560 '- 弾を動かす -
2570 '--------------
2580 '弾を消去する
2590 GOSUB *CLEAR_SHELL
2600 '弾を1つ進ませる
2610 SHELL_Y=SHELL_Y-1
2620 IF SHELL_Y<=SCORE_Y THEN SHELL_Y=-1:RETURN :'弾が消えた
2630 GOSUB *SHELL_COLLISION :'弾に当たった敵の処理
2640 IF RESULT=0 THEN GOSUB *DISP_SHELL :'弾に当たった敵がなければ弾を表示
2650 RETURN
2660 *FIRE
2670 '------------------------
2680 '- 弾を発射する時の処理 -
2690 '------------------------
2700 SHELL_X=SHIP_X:SHELL_Y=SHIP_Y-1
2710 GOSUB *SHELL_COLLISION :'弾に当たった敵がいるかを調べる
2720 IF RESULT THEN RETURN :'弾に当たった敵がいた
2730 GOSUB *DISP_SHELL
2740 SHELL_CLOCK=NOW :'弾の発射時刻の記録
2750 RETURN
2760 *MOVE_STAR
2770 '-------------------------------------------------------
2780 '- 星を発生させ、動かす -
2790 '- RESULT 宇宙船に当たった星があれば1、なければ0を返す -
2800 '-------------------------------------------------------
2810 '全ての星を消去する
2820 FOR PARAM_INDEX=0 TO STAR_NUM-1
2830 GOSUB *CLEAR_STAR
2840 NEXT
2850 '全ての星を1つずつ進ませ、消えた星を除去する
2860 MS_J=0
2870 FOR MS_I=0 TO STAR_NUM-1
2880 MS_TEMP=STAR_Y(MS_I)+1
2890 IF MS_TEMP<=SHIP_Y+2 THEN 2920
2900 SCORE=SCORE+1
2910 CONTINUE
2920 STAR_Y(MS_J)=MS_TEMP
2930 STAR_X(MS_J)=STAR_X(MS_I)
2940 MS_J=MS_J+1
2950 NEXT
2960 'ある確率で新しい星を発生する
2970 STAR_NUM=MS_J
2980 IF STAR_NUM=0 THEN MS_PROB=0.7:GOTO 3040
2990 IF STAR_NUM=1 THEN MS_PROB=0.4:GOTO 3040
3000 IF STAR_NUM=2 THEN MS_PROB=0.3:GOTO 3040
3010 IF STAR_NUM=3 THEN MS_PROB=0.2:GOTO 3040
3020 IF STAR_NUM=4 THEN MS_PROB=0.15:GOTO 3040
3030 MS_PROB=0.1
3040 IF STAR_NUM=MAX_STAR OR RND>MS_PROB THEN 3080
3050 STAR_X(STAR_NUM)=INT(RND*14)*2+2
3060 STAR_Y(STAR_NUM)=SCORE_Y+1
3070 STAR_NUM=STAR_NUM+1
3080 '宇宙船に当たった星があるかを調べる
3090 GOSUB *SHIP_COLLISION :'宇宙船に当たった星があるかを調べる
3100 IF RESULT THEN RETURN :'宇宙船に当たった星があった
3110 GOSUB *SHELL_COLLISION :'弾に当たった星の処理
3120 '全ての星を表示する
3130 FOR PARAM_INDEX=0 TO STAR_NUM-1
3140 GOSUB *DISP_STAR
3150 NEXT
3160 RESULT=0
3170 RETURN
3180 *DISP_SHIP
3190 '--------------------
3200 '- 宇宙船を表示する -
3210 '--------------------
3220 LOCATE SHIP_X,SHIP_Y:PRINT "▲";
3230 LOCATE SHIP_X,SHIP_Y+1:PRINT "■";
3240 LOCATE SHIP_X-2,SHIP_Y+2:PRINT "▟■▙";
3250 RETURN
3260 *CLEAR_SHIP
3270 '--------------------
3280 '- 宇宙船を消去する -
3290 '--------------------
3300 LOCATE SHIP_X,SHIP_Y:PRINT " "
3310 LOCATE SHIP_X,SHIP_Y+1:PRINT " ";
3320 LOCATE SHIP_X-2,SHIP_Y+2:PRINT " ";
3330 RETURN
3340 *DISP_SHELL
3350 '----------------
3360 '- 弾を表示する -
3370 '----------------
3380 LOCATE SHELL_X,SHELL_Y:PRINT "●";
3390 RETURN
3400 *CLEAR_SHELL
3410 '----------------
3420 '- 星を表示する -
3430 '----------------
3440 LOCATE SHELL_X,SHELL_Y:PRINT " ";
3450 RETURN
3460 *DISP_STAR
3470 '--------------------------------
3480 '- 星を表示する -
3490 '- PARAM_INDEX 星のインデックス -
3500 '--------------------------------
3510 LOCATE STAR_X(PARAM_INDEX),STAR_Y(PARAM_INDEX)
3520 PRINT "★";
3530 RETURN
3540 *CLEAR_STAR
3550 '--------------------------------
3560 '- 星を消去する -
3570 '- PARAM_INDEX 星のインデックス -
3580 '--------------------------------
3590 LOCATE STAR_X(PARAM_INDEX),STAR_Y(PARAM_INDEX)
3600 PRINT " ";
3610 RETURN
3620 *REGISTER_EXP
3630 '-----------------------
3640 '- 爆発処理を登録する -
3650 '- PARAM_X 爆発のx座標 -
3660 '- PARAM_Y 爆発のy座標 -
3670 '-----------------------
3680 IF EXP_NUM=MAX_EXP THEN RETURN
3690 EXP_X(EXP_NUM)=PARAM_X
3700 EXP_Y(EXP_NUM)=PARAM_Y
3710 EXP_PHASE(EXP_NUM)=0
3720 EXP_START(EXP_NUM)=NOW
3730 PARAM_INDEX=EXP_NUM:GOSUB *DISP_EXP
3740 EXP_NUM=EXP_NUM+1
3750 RETURN
3760 *DISP_EXP
3770 '--------------------------------------
3780 '- 爆発の表示 -
3790 '- PARAM_INDEX 爆発処理のインデックス -
3800 '--------------------------------------
3810 DE_X=EXP_X(PARAM_INDEX) :'爆発処理のx座標
3820 DE_Y=EXP_Y(PARAM_INDEX) :'爆発処理のy座標
3830 DE_PHASE=EXP_PHASE(PARAM_INDEX) :'爆発処理の進展度合い(0~3の整数)
3840 IF DE_PHASE<>0 THEN 3880
3850 'PHASEが0だった
3860 LOCATE DE_X,DE_Y:PRINT "╋";
3870 RETURN
3880 IF DE_PHASE<>1 THEN 3960
3890 'PHASEが1だった
3900 IF DE_Y=SCORE_Y+1 THEN 3920 :スコアを消さない様にスキップ
3910 LOCATE DE_X ,DE_Y-1:PRINT "┃";
3920 LOCATE DE_X-2,DE_Y :PRINT "━╋━";
3930 IF DE_Y=SHIP_Y-1 THEN 3950 :宇宙船を消さない様にスキップ
3940 LOCATE DE_X ,DE_Y+1:PRINT "┃";
3950 RETURN
3960 IF DE_PHASE<>2 THEN 4040
3970 'PHASEが2だった
3980 IF DE_Y=SCORE_Y+1 THEN 4000
3990 LOCATE DE_X ,DE_Y-1:PRINT "┃";
4000 LOCATE DE_X-2,DE_Y :PRINT "━ ━";
4010 IF DE_Y=SHIP_Y-1 THEN 4030
4020 LOCATE DE_X ,DE_Y+1:PRINT "┃";
4030 RETURN
4040 'PHASEが3だった
4050 IF DE_Y=SCORE_Y+1 THEN 4070
4060 LOCATE DE_X ,DE_Y-1:PRINT " ";
4070 LOCATE DE_X-2,DE_Y :PRINT " ";
4080 LOCATE DE_X+2,DE_Y :PRINT " ";
4090 IF DE_Y=SHIP_Y-1 THEN 4110
4100 LOCATE DE_X ,DE_Y+1:PRINT " ";
4110 RETURN
4120 *DISP_TITLE
4130 '----------------------------------------------------
4140 '- 現在カーソルがある行にゲームのタイトルを表示する -
4150 '----------------------------------------------------
4160 LOCATE 8:PRINT " *************** "
4170 LOCATE 8:PRINT " * STAR CRUISE * "
4180 LOCATE 8:PRINT " *************** "
4190 RETURN
4200 *SHELL_COLLISION
4210 '--------------------------------------------------------------------
4220 '- 弾に当たった星があるか調べ、もしあれば、得点加算と星の除去をする -
4230 '- RESULT 弾に当たった星がなければ0を返し、あれば1を返す。 -
4240 '--------------------------------------------------------------------
4250 '弾に当たった星があるかを調べる
4260 SC_I=0
4270 IF SC_I=STAR_NUM THEN RESULT=0:RETURN :'弾に当たった星がなかった
4280 IF STAR_X(SC_I)=SHELL_X AND STAR_Y(SC_I)=SHELL_Y THEN 4310
4290 SC_I=SC_I+1
4300 GOTO 4270
4310 '弾に当たった星があった
4320 SCORE=SCORE+10 :'得点を加算
4330 PARAM_X=SHELL_X:PARAM_Y=SHELL_Y:GOSUB *REGISTER_EXP :'爆発を登録
4340 SHELL_Y=-1 :'弾を削除
4350 '星を削除する
4360 STAR_NUM=STAR_NUM-1
4370 FOR SC_I=SC_I TO STAR_NUM-1
4380 STAR_X(SC_I)=STAR_X(SC_I+1)
4390 STAR_Y(SC_I)=STAR_Y(SC_I+1)
4400 NEXT
4410 RESULT=1:RETURN
4420 *SHIP_COLLISION
4430 '---------------------------------------------------------------
4440 '- 宇宙船に当たった星があるかどうか調べる -
4450 '- RESULT 宇宙船に当たった星があれば1を返し、なければ0を返す。 -
4460 '---------------------------------------------------------------
4470 RESULT=1
4480 FOR SC_I=0 TO STAR_NUM-1
4490 SC_X=STAR_X(SC_I)
4500 SC_Y=STAR_Y(SC_I)
4510 IF SC_Y=SHIP_Y AND SC_X=SHIP_X THEN RETURN
4520 IF SC_Y=SHIP_Y+1 AND SC_X=SHIP_X THEN RETURN
4530 IF SC_Y=SHIP_Y+2 AND SC_X>=SHIP_X-2 AND SC_X<=SHIP_X+2 THEN RETURN
4540 NEXT
4550 RESULT=0
4560 RETURN
4570 *DISP_SCORE
4580 '--------------------------------
4590 '- 得点をカーソル位置に表示する -
4600 '- PARAM_SCORE 表示する得点 -
4610 '--------------------------------
4620 DS_S$=RIGHT$(" "+STR$(PARAM_SCORE),6)
4630 PRINT DS_S$;
4640 RETURN
画面13、シューティングゲーム、STAR CRUISE

1310行で、STAR_TIMERという変数に500を代入しています。この数は、星が近づいてくる速さを決めています。STAR_TIMERの値を大きくすると、星がゆっくり近づく様になり、ゲームの難易度が下がります。逆に、STAR_TIMERの値を小さくすると、星が早く近づく様になり、ゲームの難易度が上がります。

昔は、マイコンBASICマガジンという雑誌があって、それにBASICで作ったプログラムが数多く載っていました。いきなりゲームを作るのは難しいという初心者も、雑誌に載っているプログラムの一部を書き換えて、難易度の調整など、色々といじって楽しみ、徐々にプログラミングを憶えて行った様です。

目次へ  前のページへ (1) (2) (3) (4) (5) 次のページへ

関連ページ

Arduino 電子工作
このサイトの記事が本になりました。
書名:Arduino 電子工作
ISBN:978-4-7775-1941-5
工学社の書籍の内容の紹介ページ
本のカバーの写真か書名をクリックすると、Amazonの書籍購入ページに移動します。