モラこじ! ブログモードでGo!

レトロゲーム界隈にずぶずぶハマりつつある40代おっさんの生き様です!

趣味のプログラミング(4)~デバッグ篇

昨晩リハビリ中さんがニコ生の配信で、拙作のゲーム(ヌルいバージョン):

nyagbon.hatenablog.com

のBASICコードをお勉強する放送をしてくださいました!

live.nicovideo.jp

しかもそこでバグを発見して修正してくださったのです! (*´▽`*)アリガタヤ

その様子を書かれたブログ記事はこちら。

gamerihabiri.hatenablog.com

 

バグ

バグとは、コードが意図通りに動かない現象を言います。どんなバグかというと、

 

    斜め移動ができない

 

バグでした。コードを書いたときは、斜め移動をするつもりで書いていたのですが、いざ動かしてみると4方向(上下左右)にしか動かないぞ?!

 

  …あれ? MSXってこうなのかなぁ? まぁいっかw

 

と思い、そのままにしてしまいました。(∩´∀`)∩

すみません、MSX を軽くみていました。斜め移動できないわけがないじゃないですか!  グラディウスだって沙羅曼蛇だって自機が斜めに動くし!

MSX ファンの皆様、ごめんなさい。m(_ _)m

 

バグの箇所と修正方法

STICK 関数の戻り値の判定のところが間違っていました。MSX では、ジョイスティック(またはカーソルキー)と数値の対応は、

         8   1    2

            ↖ ↑  ↗

         7←0→3

            ↙ ↓ ↘

         6   5    4

となっています。だから、STICK 関数の戻り値が

  • 8か1か2のとき、上に移動
  • 2から4のとき、右に移動
  • 4から6のとき、下に移動
  • 6から8のとき、左に移動

としなければなりませんでした。その判定 340行目~370行目が間違っていました。

340 IF ST>=1 AND ST<=2 AND Y>0 THEN Y=Y-8
350 IF ST>=3 AND ST<=4 AND X<240 THEN X=X+8
360 IF ST>=5 AND ST<=6 AND Y<180 THEN Y=Y+8
370 IF ST>=7 AND ST<=8 AND X>0 THEN X=X-8    

正しくは

340 IF (ST=1 OR ST=2 OR ST=8) AND Y>0 THEN Y=Y-8
350 IF ST>=2 AND ST<=4 AND X<240 THEN X=X+8
360 IF ST>=4 AND ST<=6 AND Y<180 THEN Y=Y+8
370 IF ST>=6 AND ST<=8 AND X>0 THEN X=X-8

としなければならなかったのです。(ノ∀`)アチャー

 

リハビリ中さんは、ST の値 1 個 1 個に対して 1 行ずつ IF 文を記述されていましたが、もちろんそれでも正解です!

 

なんと便利な MSXPen

さて、修正したコードで遊びましょう! ここで、なんと、

www.nyaonyao21.com

でお馴染みの nao さんから、コードを保存して WebMSX を起動してくれて、さらにそれを URL にしてくれる

msxpen.com

というサイトを教えていただきました! ありがとうございます!

早速、MSXPen に修正版のコードを保存しました。以下の URL をクリックするだけで、斜め移動ができるようになったゲームが遊べます!

斜め移動ができるようになったので、ゲームとしては簡単になったかもしれません。是非ともコードをいろいろいじってゲームバランスを調整してみてください。

というわけで

思いがけずも第4回の「趣味のプログラミング」の記事を書くことになりました。楽しくプログラミングして楽しく記事を書く機会を与えてくださったリハビリ中さんnaoさんに感謝です!

最後に、全コードも載せておきます。それでは~。

 

10 SCREEN 1,2,0:KEY OFF:COLOR 15,1,1
20 ' INITIALIZE
30 SC=0:RIHA=3:XT=5000:XS=5000
40 GOSUB 980
50 ' :ENEMY COLORS
60 DIM EC(2):EC(0)=6:EC(1)=10:EC(2)=3
100 ' READ SPRITE
110 FOR S=1 TO 4:L$="":R$=""
120 FOR I=1 TO 16:READ I$
130 L$=L$+CHR$(VAL("&B"+LEFT$(I$,8)))
140 R$=R$+CHR$(VAL("&B"+RIGHT$(I$,8)))
150 NEXT
160 SPRITE$(S)=L$+R$
170 NEXT
200 ' INITIALIZE POSITIONS
210 X=180:Y=80:BB=0
220 EX=0:EY=INT(RND(1)*180):EH=0:EV=0:EL=3
300 ' MOVE BY CURSOR KEY OR JOY STICK
310 ST=STICK(0) OR STICK(1)
320 SG=STRIG(0) OR STRIG(1)
330 IF ST=0 THEN 400
340 IF (ST=1 OR ST=2 OR ST=8) AND Y>0 THEN Y=Y-8
350 IF ST>=2 AND ST<=4 AND X<240 THEN X=X+8
360 IF ST>=4 AND ST<=6 AND Y<180 THEN Y=Y+8
370 IF ST>=6 AND ST<=8 AND X>0 THEN X=X-8
400 ' BULLET
410 IF BB=1 THEN 430
420 IF SG<>0 THEN BB=1:BX=X:BY=Y
430 BX=BX-10
440 IF BX<0 THEN BB=0
500 ' ENEMY
510 EX=EX+EH:EY=EY+EV
520 EH=EH+SGN(X-EX)*INT(RND(1)*(9-EL*2)+1)
530 EV=EV+SGN(Y-EY)*INT(RND(1)*(9-EL*2)+1)
540 IF EH>10 THEN EH=10
550 IF EH<-10 THEN EH=-10
560 IF EV>10 THEN EV=10
570 IF EV<-10 THEN EV=-10
600 ' PUT SPRITES
610 PUTSPRITE 1,(X,Y),11,1
620 IF BB=1 THEN PUTSPRITE 2,(BX,BY),8,2 ELSE PUTSPRITE 2,,,0
630 PUTSPRITE 3,(EX,EY),EC(EL-1),3
700 ' COLLISION CHECK
710 ' :BULLET VS EMENY
720 IF BB=0 THEN 800
730 IF NOT(BX+2<=EX+13 AND EX+2<=BX+13 AND BY+2<=EY+13 AND EY+2<=BY+13) THEN 800
740 PUTSPRITE 3,(EX,EY),15,3:BEEP
742 EH=-10:EL=EL-1
744 IF EL=0 THEN 750
746 SC=SC+20:GOSUB 980
748 BB=0:GOTO 800
750 PUTSPRITE 3,(EX,EY),5,4:BEEP:PUTSPRITE 3,,,4:BEEP
760 SC=SC+60:BB=0:EH=0:EV=0:EL=3
770 EX=INT(RND(1)*240):EY=INT(RND(1)*180)
780 IF X-48<=EX+64 AND EX-48<=X+64 AND Y-48<=EY+64 AND EY-48<=Y+64 THEN 770
790 GOSUB 980
800 ' :ENEMY AND ME
810 IF NOT(X+2<=EX+13 AND EX+2<=X+13 AND Y+2<=EY+13 AND EY+2<=Y+13) THEN 900
820 ' :DEAD!
830 FOR I=0 TO 5
840 PUTSPRITE 1,(X,Y),8,4:BEEP:PUTSPRITE 1,,,0:BEEP
850 NEXT
860 RIHA=RIHA-1
870 GOSUB 980
880 IF RIHA=0 THEN 1010
890 GOTO 210
900 ' FINISHED A CYCLE
901 IF SC<XT THEN 910 
902 XT=XT+XS:RIHA=RIHA+1:GOSUB 980 
903 FOR I=0 TO 2 
904 PUTSPRITE 1,(X,Y),15,1:BEEP:PUTSPRITE 1,(X,Y),4,1:BEEP 
905 NEXT 
909 ' END THIS GAME 
910 K$=INKEY$ 
920 IF K$="q" THEN 1010 
930 GOTO 300 
970 ' SUBROUTINE TO SHOW SCORE AND LEFT RIHA 
980 LOCATE 0,0:PRINT USING "SCORE:##### RIHA: #";SC;RIHA 
990 RETURN 
1000 ' GAME OVER 
1010 SCREEN 1,1,1:KEY ON:COLOR 15,4,7 
1020 GOSUB 980 
1030 PRINT "GAME OVER!" 
1040 END 
2000 ' MINI RIHABILLY
2010 DATA 0000000000000000
2020 DATA 0000000110000000
2030 DATA 0000001111000000
2040 DATA 0000011111100000
2050 DATA 0000011001100000
2060 DATA 0000111111100000
2070 DATA 0000111111100000
2080 DATA 0011000000000000
2090 DATA 0111111011100000
2100 DATA 0001011101100000
2110 DATA 0000011111100000
2120 DATA 0000010011100000
2130 DATA 0000001111000000
2140 DATA 0000010000100000
2150 DATA 0000100000010000
2160 DATA 0000000000000000
2200 ' BULLET
2210 DATA 0000000000000000
2220 DATA 0000000000000000
2230 DATA 0000000000000000
2240 DATA 0000000000000000
2250 DATA 0000000000000000
2260 DATA 0000000000000000
2270 DATA 0000011111100000
2280 DATA 0001110000111000
2290 DATA 0000011111100000
2300 DATA 0000000000000000
2310 DATA 0000000000000000
2320 DATA 0000000000000000
2330 DATA 0000000000000000
2340 DATA 0000000000000000
2350 DATA 0000000000000000
2360 DATA 0000000000000000
2400 ' ENEMY
2410 DATA 0000000000000000
2420 DATA 0000000000000000
2430 DATA 0011000001100000
2440 DATA 0100100010010000
2450 DATA 0000011100000000
2460 DATA 0000011110000000
2470 DATA 0000111111000000
2480 DATA 0000111111100000
2490 DATA 0000110101100000
2500 DATA 0000110101110000
2510 DATA 0000111111110000
2520 DATA 0001111111110000
2530 DATA 0001111111111000
2540 DATA 0011111111111100
2550 DATA 0000000000000000
2560 DATA 0000000000000000
2600 ' KILLED
2610 DATA 0000000000000000
2620 DATA 0000000100000000
2630 DATA 0010000100001000
2640 DATA 0001000100010000
2650 DATA 0000100000100000
2660 DATA 0000000000000000
2670 DATA 0000000000000000
2680 DATA 0111000000011100
2690 DATA 0000000000000000
2700 DATA 0000000000000000
2710 DATA 0000100000100000
2720 DATA 0001000100010000
2730 DATA 0010000100001000
2740 DATA 0000000100000000
2750 DATA 0000000000000000
2760 DATA 0000000000000000