ニャオニャオ21世紀

レトロゲーム(MSX、PCエンジン、ファミコン、メガドライブセガサターン)と、MSXのゲーム開発と、最新ゲーム(PS4、SWITCH)、身体(身体意識など)、ライフハック、電子工作ほか雑記を綴っています

迷路で敵を徘徊させる MSX BASIC基礎その19




スポンサーリンク



スポンサーリンク


久しぶりにMSX BASICの基礎について書きます^^

 

基礎的なことはかなり書いてきたので、

あとは応用かなぁと思っていたのですが、

そういえば、

敵キャラクターを動かしていなかったなぁ、と思い立ちまして^^;

 

今回はよくある、迷路内を徘徊する敵です(ΦωΦ)

 

ハイドライドのダンジョン内で、モンスターが徘徊していましたよね!

あれです!

 

完全ランダムであちこち、彷徨い歩きます。

(ハイドライドのプログラムはどうなっているんでしょうねぇ?)

 

プログラムは、以前書いた、パッ○マンもどきのものを改良します。

 

じつは見下ろし型のマップ内で敵が徘徊するのって、

書いたことがなかったので、

どうしようかなぁと思っていたのですが、

BASICマガジンにそれらしい記事があったので、

そちらを参考にしてみました(*´﹃`*)

 

本のサンプルは、じつにうまく作られているのですが、

なんかややこしくて...

 

最初読んだときは、なぜ?

って思って、データを1つずつ入れて検証していって

はじめて理解できました(-_-;)

 

僕のスキルでは、解説が難しいので無理かも...

 

そこで、少し改良して、プログラムを書いたのですが、

なんか、こう、アレですよ、

 

増築を繰り返した結果できた違法建築みたいなプログラムに

なりました(´・ω・`)

なんでこんなところに階段があるのぉ?

家、傾いているよね?

みたいなプログラムです。

 

なんかところどころ無駄が発生していて、

うーん、な感じですが、

とりあえず、公開してしまいます(ΦωΦ)

 

スピードもちょっとアレな感じなので、

次回、もう少し効率を考えてみたいと思います。

(できるかなぁ)

 

 


5 'TIME=0
10 COLOR15,1,1:SCREEN2:SCREEN1,2:COLOR15,1,1:WIDTH32:DEFINTA-Z:KEYOFF
20 DEFUSR=&H7E:A=USR(0)
30 KEY1,"SCREEN1"+CHR$(13)
40 'EN,EK,EX(),EY(),EM()
44 EN=0:EK=3:DIMEX(4):DIMEY(4):DIMEM(4):DIMUX(4):DIMUY(4):DIMHK(4):DIMEO(4)
45 X=160:Y=128:H=0
46 EX(0)=160:EY(0)=8:EX(1)=96:EY(1)=32:EX(2)=144:EY(2)=160:EX(3)=96:EY(3)=104
47 EM(0)=8:EM(1)=8:EM(2)=8:EM(3)=8
48 IF GO=1 THEN GO=0:GOTO500
50 'MOJI TEIGI
51 N=33
52 FOR J=0 TO 63
53 FOR I=0 TO 7
54 VPOKE &H800+N*8+I,VPEEK(N*8+I)
55 VPOKE &H1000+N*8+I,VPEEK(N*8+I)
56 'COLOR TEIGI
57 VPOKE &H2000+N*8+I,&HF1
58 VPOKE &H2800+N*8+I,&HF1
59 VPOKE &H3000+N*8+I,&HF1
60 NEXT
61 N=N+1
62 NEXT
63 LOCATE10,10:PRINT"PLEASE WAIT!"
70 'SPRITE TEIGI
75 RESTORE 2000
77 FOR J=0 TO 9
80 S$=""
90 FOR I=0 TO31
100 READ DT$:
110 S$=S$+CHR$(VAL("&H"+DT$))
120 NEXT
130 SPRITE$(J)=S$
140 NEXT
160 'BLOCK TEIGI
170 M=ASC("a")
175 RESTORE 4000
178 FOR J=0 TO 10
180 FOR I=0 TO 7
190 READ BG$
200 VPOKE M*8+I,VAL("&H"+BG$)
210 VPOKE &H800+M*8+I,VAL("&H"+BG$)
220 VPOKE &H1000+M*8+I,VAL("&H"+BG$)
222 NEXT
225 M=M+1
230 NEXT
234 M=ASC("a")
235 RESTORE 5000
236 FOR J=0 TO 10
240 FOR I=0 TO 7
250 READ CR$
260 VPOKE &H2000+M*8+I,VAL("&H"+CR$)
270 VPOKE &H2800+M*8+I,VAL("&H"+CR$)
280 VPOKE &H3000+M*8+I,VAL("&H"+CR$)
283 NEXT
285 M=M+1
290 NEXT
490 'MAP
500 LOCATE 0,0:PRINT "caaaaaaaaaaaaaaaaaaaaaaaaaaaaaad"
510 LOCATE 0,1:PRINT "bxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxb"
520 LOCATE 0,2:PRINT "bxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxb"
530 LOCATE 0,3:PRINT "bxxjxxcaaaaaaaixxhaaaaaaaaaaixxb"
540 LOCATE 0,4:PRINT "bxxbxxbxxxxxxxxxxxxxxxxxxxxxxxxb"
550 LOCATE 0,5:PRINT "bxxbxxbxxxxxxxxxxxxxxxxxxxxxxxxb"
560 LOCATE 0,6:PRINT "bxxkxxeaaaaaaadxxcaaaaaaaaaaixxb"
570 LOCATE 0,7:PRINT "bxxxxxxxxxxxxxbxxbxxxxxxxxxxxxxb"
580 LOCATE 0,8:PRINT "bxxxxxxxxxxxxxbxxbxxxxxxxxxxxxxb"
590 LOCATE 0,9:PRINT "bxxcaaaaaaadxxbxxbxxcadxxhaadxxb"
600 LOCATE 0,10:PRINT"bxxbxxxxxxxbxxbxxbxxbxbxxxxxbxxb"
610 LOCATE 0,11:PRINT"bxxbxxxxxxxbxxbxxbxxbxbxxxxxbxxb"
620 LOCATE 0,12:PRINT"bxxeaaaaaaafxxbxxbxxeafxxhaafxxb"
630 LOCATE 0,13:PRINT"bxxxxxxxxxxxxxbxxbxxxxxxxxxxxxxb"
640 LOCATE 0,14:PRINT"bxxxxxxxxxxxxxbxxbxxxxxxxxxxxxxb"
650 LOCATE 0,15:PRINT"bxxcaadxxcaaaafxxeaaaaaaaixxjxxb"
660 LOCATE 0,16:PRINT"bxxbxxbxxbxxxxxxxxxxxxxxxxxxbxxb"
670 LOCATE 0,17:PRINT"bxxbxxbxxbxxxxxxxxxxxxxxxxxxbxxb"
680 LOCATE 0,18:PRINT"bxxeaafxxkxxhaaaaaaixxhaaaaafxxb"
690 LOCATE 0,19:PRINT"bxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxb"
700 LOCATE 0,20:PRINT"bxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxb"
710 LOCATE 0,21:PRINT"eaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaf"
890 'BGM WARIKOMI
900 RESTORE 21000
910 GOSUB 1860
920 ON INTERVAL=80 GOSUB 1860
930 INTERVAL ON
995 'MAIN LOOP
996 'PLAYER
998 M2=ASC("k")
999 H=4
1000 S=STICK(0) OR STICK(1)
1001 'A=TIME
1005 'PLAYER
1010 TX=X:TY=Y
1020 IF S=1 THEN Y=Y-8:H=(H+1)MOD 2
1040 IF S=3 THEN X=X+8:H=( (H+1)MOD 2)+2
1060 IF S=5 THEN Y=Y+8:H=( (H+1)MOD 2)+4
1080 IF S=7 THEN X=X-8:H=( (H+1)MOD 2)+6
1100 A$=CHR$(VPEEK(&H1800+(X\8)+(Y\8)*32))
1110 B$=CHR$(VPEEK(&H1800+(X\8)+1+(Y\8)*32))
1120 C$=CHR$(VPEEK(&H1800+(X\8)+(Y\8+1)*32))
1130 D$=CHR$(VPEEK(&H1800+(X\8)+1+(Y\8+1)*32))
1140 IF ASC(A$)<=M2 THEN X=TX:Y=TY
1150 IF ASC(B$)<=M2 THEN X=TX:Y=TY
1160 IF ASC(C$)<=M2 THEN X=TX:Y=TY
1170 IF ASC(D$)<=M2 THEN X=TX:Y=TY
1210 'ENEMY
1220 UX(EN)=EX(EN):UY(EN)=EY(EN)
1235 EH=0:EI=0:A=RND(-TIME):ES=0
1240 AE$="#":BE$="#":CE$="#":DE$="#":HK(0)=0:HK(1)=0:HK(2)=0:HK(3)=0
1245 'UP
1246 EY(EN)=EY(EN)-8
1247 AE$=CHR$(VPEEK(&H1800+(EX(EN)\8)+(EY(EN)\8)*32))
1248 BE$=CHR$(VPEEK(&H1800+(EX(EN)\8)+1+(EY(EN)\8)*32))
1249 IF ASC(AE$)>M2 THEN IF ASC(BE$)>M2 THEN ES=1:IF EO(EN)<>3 THEN EH=EH+1:HK(EI)=1:EI=EI+1
1250 'RIGHT
1251 EX(EN)=UX(EN):EY(EN)=UY(EN):EX(EN)=EX(EN)+8
1252 BE$=CHR$(VPEEK(&H1800+(EX(EN)\8)+1+(EY(EN)\8)*32))
1253 DE$=CHR$(VPEEK(&H1800+(EX(EN)\8)+1+(EY(EN)\8+1)*32))
1254 IF ASC(BE$)>M2 THEN IF ASC(DE$)>M2 THEN ES=2:IF EO(EN)<>4 THEN EH=EH+2:HK(EI)=2:EI=EI+1
1260 'DOWN
1261 EX(EN)=UX(EN):EY(EN)=UY(EN):EY(EN)=EY(EN)+8
1262 CE$=CHR$(VPEEK(&H1800+(EX(EN)\8)+(EY(EN)\8+1)*32))
1263 DE$=CHR$(VPEEK(&H1800+(EX(EN)\8)+1+(EY(EN)\8+1)*32))
1264 IF ASC(CE$)>M2 THEN IF ASC(DE$)>M2 THEN ES=3:IF EO(EN)<>1 THEN EH=EH+4:HK(EI)=3:EI=EI+1
1270 'LEFT
1271 EX(EN)=UX(EN):EY(EN)=UY(EN):EX(EN)=EX(EN)-8
1272 CE$=CHR$(VPEEK(&H1800+(EX(EN)\8)+(EY(EN)\8+1)*32))
1273 AE$=CHR$(VPEEK(&H1800+(EX(EN)\8)+(EY(EN)\8)*32))
1274 IF ASC(CE$)>M2 THEN IF ASC(AE$)>M2 THEN ES=4:IF EO(EN)<>2 THEN EH=EH+8:HK(EI)=4
1275 EX(EN)=UX(EN):EY(EN)=UY(EN)
1280 ON EH GOTO 1314,1315,1310,1316,1310,1310,1311,1317,1310,1310,1311,1310,1311,1311,1312
1290 ON ES GOTO 1314,1315,1316,1317
1300 GOTO 1325
1310 ER=RND(1)*2:EO(EN)=HK(ER):ON HK(ER) GOTO 1314,1315,1316,1317
1311 ER=RND(1)*3:EO(EN)=HK(ER):ON HK(ER) GOTO 1314,1315,1316,1317
1312 ER=RND(1)*4:EO(EN)=HK(ER):ON HK(ER) GOTO 1314,1315,1316,1317
1314 EO(EN)=1:EY(EN)=EY(EN)-8:GOTO1325
1315 EO(EN)=2:EX(EN)=EX(EN)+8:GOTO1325
1316 EO(EN)=3:EY(EN)=EY(EN)+8:GOTO1325
1317 EO(EN)=4:EX(EN)=EX(EN)-8:GOTO1325
1322 'ATARI HANTEI
1325 GOSUB1680
1327 'GAME OVER HANTEI
1330 IF GO=1 THEN GOTO1820
1332 'SPRITE HYOUJI
1333 PUT SPRITE 0,(X ,Y-1),11,H
1335 PUT SPRITE EN+1,(EX(EN),EY(EN)-1),13,8
1340 EN=EN+1:IF EN>EK-1 THEN EN=0
1345 'B=TIME
1346 'C=B-A
1347 'LOCATE0,0:PRINT C;"/60S"
1350 GOTO1000
1680 'PLAYER ATARI HANTEI
1690 ED=99
1700 FOR I=0 TO EK-1
1710 IF ABS(X-EX(I))<16 AND ABS(Y-EY(I))<16 THEN ED=I
1720 NEXT
1730 IF ED=99 THEN RETURN
1740 X=TX:Y=TY
1747 'PLAYER OUT SPRITE
1750 PUT SPRITE 0,(X,Y-1),8,9
1760 'WAIT
1770 FOR I=0 TO 25
1775 BEEP
1780 NEXT
1790 GO=1
1800 RETURN
1810 'GAME OVER
1820 LOCATE 11,10:PRINT"GAME OVER"
1830 LOCATE 10,12:PRINT"PUSH RETURN"
1840 IF INKEY$<>CHR$(13) GOTO1840
1850 GOTO45
1855 'BGM
1860 IF PEEK(&HFB40)<>0 THEN RETURN
1870 READ U$
1880 IF U$="##" THEN RESTORE 21000:READ U$
1890 'PLAY"O5"+U$
1900 RETURN
1995 'SPRITE UP0 DATA
2000 DATA 0F,1F,3F,7F,7F,7F,7F,7F,3F,1F,0F,30,03,01,1C,1C
2010 DATA F0,F8,FC,FE,FE,FE,FE,FE,FC,F8,F0,0C,CC,C0,38,00
2015 'SPRITE UP1 DATA
2020 DATA 0F,1F,3F,7F,7F,7F,7F,7F,3F,1F,0F,18,1B,03,1C,00
2030 DATA F0,F8,FC,FE,FE,FE,FE,FE,FC,F8,F0,0C,C0,B8,38,38
2035 'SPRITE RIGHT2 DATA
2040 DATA 0F,1F,3D,7D,7F,7F,7F,7F,3F,1F,0F,00,03,19,04,0E
2050 DATA F0,F8,F0,E0,C0,80,00,00,80,E0,F0,0C,CC,C0,30,38
2055 'SPRITE RIGHT3 DATA
2060 DATA 0F,1F,3F,7F,7F,7F,7E,7F,3F,1F,0F,00,1B,19,03,03
2070 DATA E0,F0,B8,B8,FC,FC,FC,00,F8,F0,E0,00,D8,C0,60,60
2075 'SPRITE DOWN4 DATA
2080 DATA 0F,1F,3B,7B,7B,7F,7F,77,38,1F,0F,30,03,1D,1E,1C
2090 DATA F0,F8,DC,DE,DE,FE,FE,EE,1C,F8,F0,0C,CC,C0,38,00
2095 'SPRITE DOWN5 DATA
2100 DATA 0F,1F,3B,7B,7F,7F,7B,7B,3C,1F,0F,18,1B,03,1C,00
2110 DATA F0,F8,DC,DE,FE,FE,DE,DE,3C,F8,F0,0C,C0,B8,78,38
2115 'SPRITE LEFT6 DATA
2120 DATA 0F,1F,0F,07,03,01,00,00,01,07,0F,30,33,03,0C,1C
2130 DATA F0,F8,BC,BE,FE,FE,FE,FE,FC,F8,F0,00,C0,98,20,70
2135 'SPRITE LEFT7 DATA
2140 DATA 07,0F,1D,1D,3F,3F,3F,00,1F,0F,07,00,1B,03,06,06
2150 DATA F0,F8,FC,FE,FE,FE,7E,FE,FC,F8,F0,00,D8,98,C0,C0
3275 'SPRITE SLIME DATA
3280 DATA 3F,7F,FF,FF,FF,CF,F3,FF,EB,E3,FF,FF,FF,FF,FF,ED
3290 DATA FC,FE,FF,FF,E7,DB,FF,C7,D7,C7,FF,FF,FF,FF,FF,B7
3300 'SPRITE DAMAGE
3310 DATA 00,01,21,11,09,04,00,78,00,04,09,11,21,01,00,00
3320 DATA 00,00,08,10,20,40,00,3C,00,40,20,10,08,00,00,00
3990 'YUKA
4000 'DATAE7,E7,E7,00,7E,7E,7E,00
4010 DATAFF,FF,00,00,00,00,FF,FF
4020 DATAC3,C3,C3,C3,C3,C3,C3,C3
4030 DATA0F,1F,38,70,E0,C0,C1,C3
4040 DATAF0,F8,1C,0E,07,03,83,C3
4050 DATAC3,C1,C0,E0,70,38,1F,0F
4060 DATAC3,83,03,07,0E,1C,F8,F0
4070 DATAC3,83,03,07,0E,1C,F8,F0
4080 DATA7F,FF,E0,C0,C0,E0,FF,7F
4090 DATAFE,FF,07,03,03,07,FF,FE
4100 DATA7E,FF,E7,C3,C3,C3,C3,C3
4110 DATAC3,C3,C3,C3,C3,E7,FF,7E
4990 'COLOR
5000 DATAF1,51,41,41,41,41,51,41
5010 DATA41,41,41,41,41,41,41,41
5020 DATAF1,51,41,41,41,41,41,41
5030 DATAF1,51,41,41,41,41,41,41
5040 DATA41,41,41,41,41,41,51,41
5050 DATA41,41,41,41,41,41,51,41
5060 DATA41,41,41,41,41,41,41,41
5070 DATAF1,51,41,41,41,41,51,41
5080 DATAF1,51,41,41,41,41,51,41
5090 DATAF1,51,41,41,41,41,41,41
5100 DATA41,41,41,41,41,41,51,41
20990 'MUSIC DATA
21000 DATAG4E8E4F8E8D8C8
21010 DATAG4E8E8D4R4
21020 DATAE8E8G8G8A8A8R8A8
21030 DATAO6C4O5E8E8G4R4
21040 DATAGE8E8F8E8D8C8
21050 DATAGE8E8D4R4
21060 DATAGE8E8A4G8G8
21070 DATAA8A8B8B8O6C4O5R4
21080 DATA##


それでは説明していきます。


1210行〜1317行が、敵の徘徊になります。

 

ちなみに敵モンスターは3匹となっています。

この敵の数は、

44行のEK=3で変更可能です。

このプログラムは、1000行~1350行を繰り返しています。

敵は1ループにつき1匹づつ動かしています。

 

1回目のループで、敵モンスターのナンバーEN=0を動かし、

2回目のループで、ナンバーEN=1を動かし、

3回目でナンバーEN=2を動かしています。

 

この方法では、プレイヤーに対して、敵モンスターのスピードが

遅くなります。

敵1匹なら、プレイヤーと同じスピード。

敵2匹なら、プライヤーの半分のスピード。

3匹なら、1/3のスピードとなります。

(敵はある程度、遅いほうがゲームとしては面白いかな?)

 


1210 'ENEMY
1220 UX(EN)=EX(EN):UY(EN)=EY(EN)
1235 EH=0:EI=0:A=RND(-TIME):ES=0
1240 AE$="#":BE$="#":CE$="#":DE$="#":HK(0)=0:HK(1)=0:HK(2)=0:HK(3)=0
1245 'UP
1246 EY(EN)=EY(EN)-8
1247 AE$=CHR$(VPEEK(&H1800+(EX(EN)\8)+(EY(EN)\8)*32))
1248 BE$=CHR$(VPEEK(&H1800+(EX(EN)\8)+1+(EY(EN)\8)*32))
1249 IF ASC(AE$)>M2 THEN IF ASC(BE$)>M2 THEN ES=1:IF EO(EN)<>3 THEN EH=EH+1:HK(EI)=1:EI=EI+1
1250 'RIGHT
1251 EX(EN)=UX(EN):EY(EN)=UY(EN):EX(EN)=EX(EN)+8
1252 BE$=CHR$(VPEEK(&H1800+(EX(EN)\8)+1+(EY(EN)\8)*32))
1253 DE$=CHR$(VPEEK(&H1800+(EX(EN)\8)+1+(EY(EN)\8+1)*32))
1254 IF ASC(BE$)>M2 THEN IF ASC(DE$)>M2 THEN ES=2:IF EO(EN)<>4 THEN EH=EH+2:HK(EI)=2:EI=EI+1
1260 'DOWN
1261 EX(EN)=UX(EN):EY(EN)=UY(EN):EY(EN)=EY(EN)+8
1262 CE$=CHR$(VPEEK(&H1800+(EX(EN)\8)+(EY(EN)\8+1)*32))
1263 DE$=CHR$(VPEEK(&H1800+(EX(EN)\8)+1+(EY(EN)\8+1)*32))
1264 IF ASC(CE$)>M2 THEN IF ASC(DE$)>M2 THEN ES=3:IF EO(EN)<>1 THEN EH=EH+4:HK(EI)=3:EI=EI+1
1270 'LEFT
1271 EX(EN)=UX(EN):EY(EN)=UY(EN):EX(EN)=EX(EN)-8
1272 CE$=CHR$(VPEEK(&H1800+(EX(EN)\8)+(EY(EN)\8+1)*32))
1273 AE$=CHR$(VPEEK(&H1800+(EX(EN)\8)+(EY(EN)\8)*32))
1274 IF ASC(CE$)>M2 THEN IF ASC(AE$)>M2 THEN ES=4:IF EO(EN)<>2 THEN EH=EH+8:HK(EI)=4
1275 EX(EN)=UX(EN):EY(EN)=UY(EN)
1280 ON EH GOTO 1314,1315,1310,1316,1310,1310,1311,1317,1310,1310,1311,1310,1311,1311,1312
1290 ON ES GOTO 1314,1315,1316,1317
1300 GOTO 1325
1310 ER=RND(1)*2:EO(EN)=HK(ER):ON HK(ER) GOTO 1314,1315,1316,1317
1311 ER=RND(1)*3:EO(EN)=HK(ER):ON HK(ER) GOTO 1314,1315,1316,1317
1312 ER=RND(1)*4:EO(EN)=HK(ER):ON HK(ER) GOTO 1314,1315,1316,1317
1314 EO(EN)=1:EY(EN)=EY(EN)-8:GOTO1325
1315 EO(EN)=2:EX(EN)=EX(EN)+8:GOTO1325
1316 EO(EN)=3:EY(EN)=EY(EN)+8:GOTO1325
1317 EO(EN)=4:EX(EN)=EX(EN)-8:GOTO1325   

 

全体の流れとしては、

敵キャラクターの移動先の上下左右(2文字分)をチェックし、

壁がないか(移動可能かどうか)チェックします。

 

そして、空いている(壁でない)箇所が、何箇所あるか

調べます。(上と下が空いていたら2つ。上下左が空いていたら3つ)

 

その数により、ON  EH GOTOでその行に飛ばします。

1280 ON EH GOTO 1314,1315,1310,1316,1310,1310,1311,1317,1310,1310,1311,1310,1311,1311,1312

 

(ON 数値 GOTO行番号、行番号、行番号は、

数値によってGOTOで飛ぶ行を決めることが出来ます。

1なら1つ目の行番号、2なら2つ目の行番号となります。)

 

このGOTO以降の行番号がたくさんある理由は、あとで説明します。

(このあたりが、僕の今回のプログラムが駄目なところだと思っています^^;)

 

空いている場所が2つなら、RND命令(ランダムに数値をだす)で、

0か1を出し、

ON HK(ER) GOTO ~ ,~,~,~で行へ飛ばします。

(このGOTO以降の行は、上下左右へ動かす行へ飛びます。)

1310 ER=RND(1)*2:EO(EN)=HK(ER):ON HK(ER) GOTO 1314,1315,1316,1317

 

1314行が上移動。

1314 EO(EN)=1:EY(EN)=EY(EN)-8:GOTO1325

1315行が右移動。

1315 EO(EN)=2:EX(EN)=EX(EN)+8:GOTO1325

1316行が下移動。

1316 EO(EN)=3:EY(EN)=EY(EN)+8:GOTO1325

1317行が左移動。

1317 EO(EN)=4:EX(EN)=EX(EN)-8:GOTO1325

 

このあたりが少し分かりづらいかもしれないですね〜。

ランダムに数値を出します(RND命令で)。

RND(1)*2だと、0か1ですね。(RND(1)*3だと0,1,2のどれかです。)

そしてそれを変数ERに入れます。

そんままON 変数 GOTO ~に入れたくなりますが、

それでは駄目なんです^^;

 

ON 変数 GOTO 上移動(を行っている行番号) , 右移動 , 下移動 , 左移動

という形になっていますので

RNDで0か1がでると、上か右移動になります。

それでは駄目なので、

HK( )という配列を使います。

 

HK( ) とい配列がなにか?

これは、例えば、敵キャラクターの上が空いていた(壁じゃない)とすると、

HK( )に1を入れます。

 

同じように、敵キャラの右が空いていたら、HK( )に2を入れます。

 

下はHK( )=3、左はHK( )=4という感じです。

 

()の中は添字なのですが、空いていたとき(壁じゃない)のみ、

添字が増えます。

1249 IF ASC(AE$)>M2 THEN IF ASC(BE$)>M2 THEN ES=1:IF EO(EN)<>3 THEN EH=EH+1:HK(EI)=1:EI=EI+1

(EIが添字用ですね)

 

壁じゃないのが2箇所(例えば上、右とか)なら、

上 : HK(0) = 1

左 : HK(1) = 4

となります。

 

例えば、壁じゃないのが3箇所なら、(上、下、右)なら、

上 : HK(0) = 1

下 : HK(1) = 3

左 : HK(2) = 4

となります。

うーん、ややこしいかも^^;

 

とりあえず、HK( )=数値

この数値は、上下左右に対応しています。(上1、右2、下3、左4)

 

HK( )に移動可能な方向を順番に放り込んでいきます。

1310 ER=RND(1)*2:EO(EN)=HK(ER):ON HK(ER) GOTO 1314,1315,1316,1317

 

HK(0)が上方向かもしれないし、HK(0)が右方向かもしれない。(移動可能なのを順番に放り込んでいるから)

(上だったら1右だったら2)

(ON HK(0) GOTO~ だと、上なら1314行右なら1315行です)

 

すみません...

うまくまとめられない(-_-;)

 

そして!!!

さらにややこしいことを書きます!!

(すみません^^;)

1280 ON EH GOTO 1314,1315,1310,1316,1310,1310,1311,1317,1310,1310,1311,1310,1311,1311,1312

 

このEHなのですが、これも壁じゃない方向を表していいるのですが、

申し訳ありませんm(_ _)m

上下左右でさきほどのものと値が違うのです^^;

EHにおいては、

上 : 1

右 : 2

下 : 4

左 : 8

となります^^;

 

このEHはなにかといいますと、

壁じゃない方向を表します。

 

なぜこんな飛び飛びの数値になるか?

それは、合計するとすべての方向を表すことができるのです。

(これはベーマガの応用ですが...)

 

例えば、上と右の両方が空いていたとします。

上1  +  右2  = 3

となるのですが、この3という値は上と右のみでしか

でてこない数値なんです。

逆に言うと、3だったら上と右だな!とわかるのです(ΦωΦ)

 

それがすべての数値でいえるのです!

これは凄い!!!

 

ON EH GOTO 1314,1315,右上,1316,上下,右下,上右下,1317,上左,右左,上右左,下左,上下左,右下左,上下左右

 

こういうことです。

EHが3なら右と上、

EHが5なら上と下、

EHが6なら右と下

が空いている(壁じゃない)ということです。

 

しかし、今回の僕のプログラムは、この部分をうまく生かせておりません(・_・;)

これを空いている方向の数としてだけ使っています。

どういうことかといいますと、

EHが3なら右と上が空いてますが、これを2方向空きがあるという意味で使います。

(つまり、RND()命令で2つの内、1つ選ぶという利用方法)

 

EHが7だと上、右、下と3方向空きがあるので、

RND( )命令で3つのうち、1つ選ぶということをします。

 

(みなさんは、もっと上手な方法をやってみてくださいね^^)

 

上方向(1)の壁のある無しチェック:

1249 IF ASC(AE$)>M2 THEN IF ASC(BE$)>M2 THEN ES=1:IF EO(EN)<>3 THEN EH=EH+1:HK(EI)=1:EI=EI+1

この赤文字は、進行方向から戻る、つまりバックしないようにしています。

前回の進行方向が下(3)のときは、進行方向上(1)にはいかないように、と^^

下に行って、すぐ上に行ったら、上下を行ったり来たりすることになってしまうので

それを防ぎます。

 

バックするのを禁止していますが、

例外もあります。

3方向壁に囲まれている場合は、バックします^^

3方向壁で、バックを禁止すると、

 

1280 ON EH GOTO 1314,1315,右上,1316,上下,右下,上右下,1317,上左,右左,上右左,下左,上下左,右下左,上下左右

 

このEHが0になって、GOTOで飛ばされず、下の行に行きます。

1290 ON ES GOTO 1314,1315,1316,1317

ESには、バックする方向が入っています^^

 

 

説明は以上になります。

お疲れさまでした\(^o^)/

f:id:nyaonyaokun:20200608093933p:plain

MSX BASIC



https://msxpen.com/codes/-M9GLrUk8jzZOHKG46M-

(上記リンクをクリックで今回のプログラムのソースコードと、

簡易ゲームが動きます^^)

 

もっといいプログラムがあると思います^^;

しかし、僕が思いついたのは、こんなややこしい方法でした...

次回は、もう少し、効率を良くして、スピードも上げたいと思います。

 

いつか、もっといい方法を思いつくかもしれません。

その時はまたブログに書きたいと思います。

というか、もっといい方法にしないと駄目だなぁ(-_-;)

 

では。

 


「ニャオニャオ21世紀は、Amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、Amazonアソシエイト・プログラムの参加者です。」

当サイトは第三者配信の広告サービス「Google Adsense グーグルアドセンス」を利用しています。 広告配信事業者は、ユーザーの興味に応じた広告を表示するためにCookie(クッキー)を使用することがあります。 Cookie(クッキー)を無効にする設定およびGoogleアドセンスに関する詳細は「広告 – ポリシーと規約 – Google」をご覧ください