ニャオニャオ21世紀

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

MSX BASICの高速化の方法。自分で時間を測りながらプログラムを書くのって、たのしー^^基礎その10

MSXの機体の情報が一杯 これは必見の書籍!! 僕らの好きなMSXハードカタログ

BASICで避けて通れないのが、速いプログラムを書くことではないでしょうか?

大変そう(~~)なんて声が聞こえてきそうですが、

僕は楽しかったです^^

 

まず、時間の計測をしないといけません。

 

10 TIME = 0

 

TIMEというのは、(タイム)システム変数といいます。

1/60づつプラス1されていきます。

10行で初期化します。

 

ループの最初の位置(例えば100行)

100 A=TIME

 

ループの最後の位置(500行とすると)

470 B=TIME

480 C=B-A

490 LOCATE 0,0 : PRINT C

 

このようなプログラムを追加してやります。

 

前回の、BGMを追加したなんちゃってパッ◯マンに

このTIMEを追加してみます。

 

スポンサーリンク

 

 

 

 

f:id:nyaonyaokun:20181023072637p:plain

 

1ループあたり、15 / 60秒掛かっています!

今風のゲームでいうと、1 / 4フレームということになります!

遅い!!!

格闘ゲームだったら1 / 60フレームで動かないといけないとよく言われますが

1 / 4フレームってw

 

経験的にいうと、1ループ当たり、10 / 60前後だと、

わりとスムーズに動く印象です^^

 

今回は少しだけ速くしてやればOKですね。

(できるかな〜^^)

 

 

その他、MSX BASICの基本のページについての

目次はこちら

www.nyaonyao21.com

 

 

サンプルプログラム (ソースコード)

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<TEKI NO NUMBER>,EK<TEKI NO KAZU>,EX()<TEKI X ZAHYOU>,EY()<TEKI Y ZAHYOU>,EM()<TEKI NO MOVE RYOU>
44 EN=0:EK=4:DIMEX(4):DIMEY(4):DIMEM(4):DIMUX(4):DIMUY(4)
45 X=160:Y=120:H=0
46 EX(0)=160:EY(0)=8:EX(1)=96:EY(1)=32:EX(2)=160:EY(2)=144: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 "b b"
520 LOCATE 0,2:PRINT "b b"
530 LOCATE 0,3:PRINT "b j haaaaaaad haaaaaaaaaai b"
540 LOCATE 0,4:PRINT "b b b b"
550 LOCATE 0,5:PRINT "b b b b"
560 LOCATE 0,6:PRINT "b eaaaaaaai b caaaaaaaaaad b"
570 LOCATE 0,7:PRINT "b b b b b"
580 LOCATE 0,8:PRINT "b k b b b"
590 LOCATE 0,9:PRINT "b cd caaad b j cad b b"
600 LOCATE 0,10:PRINT"b bb b b b b b b b b"
610 LOCATE 0,11:PRINT"b bb b b j b b eaf k b"
620 LOCATE 0,12:PRINT"b ef eaaaf b b b b"
630 LOCATE 0,13:PRINT"b b b b b"
640 LOCATE 0,14:PRINT"b b b eaaaaaaai b"
650 LOCATE 0,15:PRINT"b cd caaaaaab b b"
660 LOCATE 0,16:PRINT"b bb b b b b"
670 LOCATE 0,17:PRINT"b ef b k eaaaaaaaaaai b"
680 LOCATE 0,18:PRINT"b b b"
690 LOCATE 0,19:PRINT"b b b"
700 LOCATE 0,20: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 M=ASC("a")-1
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$)>M THEN X=TX:Y=TY
1150 IF ASC(B$)>M THEN X=TX:Y=TY
1160 IF ASC(C$)>M THEN X=TX:Y=TY
1170 IF ASC(D$)>M THEN X=TX:Y=TY
1210 'ENEMY
1220 UX(EN)=EX(EN):UY(EN)=EY(EN)
1230 EX(EN)=EX(EN)+EM(EN)
1240 AE$="#":BE$="#":CE$="#":DE$="#"
1250 AE$=CHR$(VPEEK(&H1800+(EX(EN)\8)+(EY(EN)\8)*32))
1260 BE$=CHR$(VPEEK(&H1800+(EX(EN)\8)+1+(EY(EN)\8)*32))
1270 CE$=CHR$(VPEEK(&H1800+(EX(EN)\8)+(EY(EN)\8+1)*32))
1280 DE$=CHR$(VPEEK(&H1800+(EX(EN)\8)+1+(EY(EN)\8+1)*32))
1290 IF ASC(AE$)>M THEN EX(EN)=UX(EN):EY(EN)=UY(EN)
1300 IF ASC(BE$)>M THEN EX(EN)=UX(EN):EY(EN)=UY(EN)
1310 IF ASC(CE$)>M THEN EX(EN)=UX(EN):EY(EN)=UY(EN):EM(EN)=-EM(EN)
1320 IF ASC(DE$)>M THEN EX(EN)=UX(EN):EY(EN)=UY(EN):EM(EN)=-EM(EN)
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##

 

 

プログラムの説明

 何気に注意していただきたいのが、こちら。

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

時間を表示するのに、こちらをやっておかないとできません。

フォントの色の関係なのかなぁ?

 

それでは高速化していきます!

まず、一番の基本が、メインループの行数を短くするということ。

なにもしないREM文( 50 ' とかの文)があるだけでも

遅くなります^^;

 

できるだけGOSUBやGOTOでサブルーチンに飛ばしてやります。

現在メインループは40行あります。

マイキャラを動かすと、16  /60s  ~ 21 /60sのあたりを行ったり来たりしています。

 

まずは、

キャラクターの移動部分を変更したいと思います。

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

この部分です。

 

これを、

1020 ON S GOSUB 1400,1100,1410,1100,1420,1100,1430,1100

こう!

1000 S=STICK(0) OR STICK(1)

でSの値を取得しますが、

Sは 0 ~ 8 までの値になります。

 

そこで、

ON ~  GOSUB ~を使います。

ON S GOSUB 1400,1100,1410,1100,1420,1100,1430,1100

 

Sの値が1なら、GOSUBの1つ目の1400行へ飛びます。

Sの値が2なら、GOSUBの2つ目の1100行へ飛びます

Sの値が3なら、3つ目の1410行へ

Sの値が4なら、4つ目の1100行へ

Sの値が5なら、5つ目の1420行へ

Sの値が6なら、6つ目の1100行へ

Sの値が7なら、7つ目の1430行へ

Sの値が8なら、8つ目の1100行へ

となります。

 

 カーソルキーの上右下左は、1,3,5,7なので、その値のときだけ、

メインループの外のサブルーチンに飛ばします。

右上にあたるS=2のときは、なにもせずに下の行へ流す感じです。

 

メインループの外(1350行でGOTO1000なので)

1395 'UP
1400 Y=Y-8:H=(H+1)MOD 2
1405 RETURN
1409 'RIGHT
1410 X=X+8:H=( (H+1)MOD 2)+2
1415 RETURN
1419 'DOWN
1420 Y=Y+8:H=( (H+1)MOD 2)+4
1425 RETURN
1429 'DOWN
1430 X=X-8:H=( (H+1)MOD 2)+6
1435 RETURN

 

 

結構使われるやり方みたいですね。

この方法を使って時間を計測すると、

メインループは、15 / 60s  ~  19 / 60s になりました。

 

2 / 60sほど速くなりました!!

 

こうやって少しづつ速くしていきます^^

 

次に、

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$)>M THEN X=TX:Y=TY
1150 IF ASC(B$)>M THEN X=TX:Y=TY
1160 IF ASC(C$)>M THEN X=TX:Y=TY
1170 IF ASC(D$)>M THEN X=TX:Y=TY

ここを短くします。

8行も使っています。

 

しかも、無駄なVPEEKをしています!

1100行は、移動先のマイキャラの左上の下の文字を取得しています。

1110行は、移動先のマイキャラの右上の下の文字を取得しています。

1120行は、移動先のマイキャラの左下の下の文字を取得しています。

1130行は、移動先のマイキャラの右下の下の文字を取得しています。

 

毎回、4つVPEEKしていますが、これは無駄なのです!

例えば、カーソルキーのを入力した場合、

右上右下の下の文字がなにか分かればそれでOKです。

f:id:nyaonyaokun:20181023085155p:plain

 

2つのVPEEKでいいので、そのようにしてやります。

先ほどのサブルーチンに書いていきます。

1395 'UP
1400 Y=Y-8:H=(H+1)MOD 2
1401 IF VPEEK(&H1800+(X\8)+(Y\8)*32)>M THEN X=TX:Y=TY
1401 IF VPEEK(&H1800+(X\8)+1+(Y\8)*32)>M THEN X=TX:Y=TY
1405 RETURN
1409 'RIGHT
1410 X=X+8:H=( (H+1)MOD 2)+2
1411 IF VPEEK(&H1800+(X\8)+1+(Y\8)*32)>M THEN X=TX:Y=TY
1412 IFVPEEK(&H1800+(X\8)+1+(Y\8+1)*32)>M THEN X=TX:Y=TY
1415 RETURN
1419 'DOWN
1420 Y=Y+8:H=( (H+1)MOD 2)+4
1421 IF VPEEK(&H1800+(X\8)+(Y\8+1)*32)>M THEN X=TX:Y=TY
1422 IF VPEEK(&H1800+(X\8)+1+(Y\8+1)*32)>M THEN X=TX:Y=TY
1425 RETURN
1429 'LEFT
1430 X=X-8:H=( (H+1)MOD 2)+6
1431 IF VPEEK(&H1800+(X\8)+(Y\8)*32)>M THEN X=TX:Y=TY
1432 IF VPEEK(&H1800+(X\8)+(Y\8+1)*32)>M THEN X=TX:Y=TY
1435 RETURN

 

まとめただけです。

これにより、

メインループが、12 / 60s ~ 17 /60sになりました!

結構スムーズになった感じがします^^

 

あとは、敵キャラです。

1240 AE$="#":BE$="#":CE$="#":DE$="#"
1250 AE$=CHR$(VPEEK(&H1800+(EX(EN)\8)+(EY(EN)\8)*32))
1260 BE$=CHR$(VPEEK(&H1800+(EX(EN)\8)+1+(EY(EN)\8)*32))
1270 CE$=CHR$(VPEEK(&H1800+(EX(EN)\8)+(EY(EN)\8+1)*32))
1280 DE$=CHR$(VPEEK(&H1800+(EX(EN)\8)+1+(EY(EN)\8+1)*32))
1290 IF ASC(AE$)>M THEN EX(EN)=UX(EN):EY(EN)=UY(EN)
1300 IF ASC(BE$)>M THEN EX(EN)=UX(EN):EY(EN)=UY(EN)
1310 IF ASC(CE$)>M THEN EX(EN)=UX(EN):EY(EN)=UY(EN):EM(EN)=-EM(EN)
1320 IF ASC(DE$)>M THEN EX(EN)=UX(EN):EY(EN)=UY(EN):EM(EN)=-EM(EN)

ここをサブルーチン化します。

こちらも4つのVPEEKを2つにできます。

メインルーチンでは、

右に動いた時と、左に動いた時に場合分けします。

1240 EF=0

1250 IF EM(EN)>0 GOTO1440
1260 IF EM(EN)<0 GOTO1450

 

敵が右に動いた時、
1439 'ENEMY RIGHT

1440 IF VPEEK(&H1800+(EX(EN)\8)+1+(EY(EN)\8)*32) > M THEN EX(EN)=UX(EN):EY(EN)=UY(EN):EF=1

1441 IF VPEEK(&H1800+(EX(EN)\8)+1+(EY(EN)\8+1)*32) > M THEN EX(EN)=UX(EN):EY(EN)=UY(EN):EF=1

1442 IF EF=1 THEN EM(EN)=-EM(EN)

1443 GOTO1270

 

敵が左に動いた時、

1449 'ENEMY LEFT

1450 IF VPEEK(&H1800+(EX(EN)\8)+(EY(EN)\8)*32) > M THEN EX(EN)=UX(EN):EY(EN)=UY(EN):EF=1

1451 IF VPEEK(&H1800+(EX(EN)\8)+(EY(EN)\8+1)*32) > M THEN EX(EN)=UX(EN):EY(EN)=UY(EN):EF=1

1452 IF EF=1 THEN EM(EN)=-EM(EN)

1453 GOTO1270

 

難しくみえますが、以前のプログラムを1文にまとめてあるだけですので^^

9 / 60s ~ 13 / 60s になりました!

 

一番最初が16 / 60s ~ 21 / 60sだったので、

7 / 60sほど速くなっています!

 

まぁ別に高速化というわけではないのですが、

うまくまとめるとこれぐらいスピードが違ってきますw

 

メインループは全部で23行になりました!

TIME関係とREM文で9行ありますので、もう少し速くなります。

どうでしょうか?

体感的に結構速くなったのではないでしょうか?

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<TEKI NO NUMBER>,EK<TEKI NO KAZU>,EX()<TEKI X ZAHYOU>,EY()<TEKI Y ZAHYOU>,EM()<TEKI NO MOVE RYOU>
44 EN=0:EK=4:DIMEX(4):DIMEY(4):DIMEM(4):DIMUX(4):DIMUY(4)
45 X=160:Y=120:H=0
46 EX(0)=160:EY(0)=8:EX(1)=96:EY(1)=32:EX(2)=160:EY(2)=144: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 "b b"
520 LOCATE 0,2:PRINT "b b"
530 LOCATE 0,3:PRINT "b j haaaaaaad haaaaaaaaaai b"
540 LOCATE 0,4:PRINT "b b b b"
550 LOCATE 0,5:PRINT "b b b b"
560 LOCATE 0,6:PRINT "b eaaaaaaai b caaaaaaaaaad b"
570 LOCATE 0,7:PRINT "b b b b b"
580 LOCATE 0,8:PRINT "b k b b b"
590 LOCATE 0,9:PRINT "b cd caaad b j cad b b"
600 LOCATE 0,10:PRINT"b bb b b b b b b b b"
610 LOCATE 0,11:PRINT"b bb b b j b b eaf k b"
620 LOCATE 0,12:PRINT"b ef eaaaf b b b b"
630 LOCATE 0,13:PRINT"b b b b b"
640 LOCATE 0,14:PRINT"b b b eaaaaaaai b"
650 LOCATE 0,15:PRINT"b cd caaaaaab b b"
660 LOCATE 0,16:PRINT"b bb b b b b"
670 LOCATE 0,17:PRINT"b ef b k eaaaaaaaaaai b"
680 LOCATE 0,18:PRINT"b b b"
690 LOCATE 0,19:PRINT"b b b"
700 LOCATE 0,20: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 M=ASC("a")-1
999 H=4
1000 S=STICK(0) OR STICK(1)
1001 A=TIME
1005 'PLAYER
1010 TX=X:TY=Y
1020 ON S GOSUB 1400,1100,1410,1100,1420,1100,1430,1100
1100 'ENEMY
1220 UX(EN)=EX(EN):UY(EN)=EY(EN)
1230 EX(EN)=EX(EN)+EM(EN)
1240 EF=0
1250 IF EM(EN)>0 GOTO1440
1260 IF EM(EN)<0 GOTO1450
1270 '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
1395 'UP
1400 Y=Y-8:H=(H+1)MOD 2
1401 IF VPEEK(&H1800+(X\8)+(Y\8)*32)>M THEN X=TX:Y=TY
1401 IF VPEEK(&H1800+(X\8)+1+(Y\8)*32)>M THEN X=TX:Y=TY
1405 RETURN
1409 'RIGHT
1410 X=X+8:H=( (H+1)MOD 2)+2
1411 IF VPEEK(&H1800+(X\8)+1+(Y\8)*32)>M THEN X=TX:Y=TY
1412 IFVPEEK(&H1800+(X\8)+1+(Y\8+1)*32)>M THEN X=TX:Y=TY
1415 RETURN
1419 'DOWN
1420 Y=Y+8:H=( (H+1)MOD 2)+4
1421 IF VPEEK(&H1800+(X\8)+(Y\8+1)*32)>M THEN X=TX:Y=TY
1422 IF VPEEK(&H1800+(X\8)+1+(Y\8+1)*32)>M THEN X=TX:Y=TY
1425 RETURN
1429 'LEFT
1430 X=X-8:H=( (H+1)MOD 2)+6
1431 IF VPEEK(&H1800+(X\8)+(Y\8)*32)>M THEN X=TX:Y=TY
1432 IF VPEEK(&H1800+(X\8)+(Y\8+1)*32)>M THEN X=TX:Y=TY
1435 RETURN
1438 'ENEMY CHIKEI
1439 'ENEMY RIGHT
1440 IF VPEEK(&H1800+(EX(EN)\8)+1+(EY(EN)\8)*32) > M THEN EX(EN)=UX(EN):EY(EN)=UY(EN):EF=1
1441 IF VPEEK(&H1800+(EX(EN)\8)+1+(EY(EN)\8+1)*32) > M THEN EX(EN)=UX(EN):EY(EN)=UY(EN):EF=1
1442 IF EF=1 THEN EM(EN)=-EM(EN)
1443 GOTO1270
1449 'ENEMY LEFT
1450 IF VPEEK(&H1800+(EX(EN)\8)+(EY(EN)\8)*32) > M THEN EX(EN)=UX(EN):EY(EN)=UY(EN):EF=1
1451 IF VPEEK(&H1800+(EX(EN)\8)+(EY(EN)\8+1)*32) > M THEN EX(EN)=UX(EN):EY(EN)=UY(EN):EF=1
1452 IF EF=1 THEN EM(EN)=-EM(EN)
1453 GOTO1270
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##

 

赤文字がメインループです。

オレンジがマイキャラのサブルーチン、

紫が敵キャラのサブルーチン。

 

 

どの程度速くなったか、2つのプログラムを比較してみてください^^

 

・前回の遅いプログラム

 サンプル実行はこちらWebMSX

 

 ・今回の速いプログラム

サンプルはこちらで実行 ( WebMSX )

 

ダウンロード

 

どうでしょうか?

面白いですよね〜^^

 

もっと速くする方法もあるようですが、とりあえずはここまでにしておきます^^

 

追伸:

Twitterで、

ハイドライド で有名な内藤さんと、

スタークルーザーで有名な吉村ことりさんのご指導頂きました^^

 

修正して頂いたプログラムがこちらです。

(少し自分でやっているのでダメなところがあるかもしれません^^;)

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)
35 DIMXO(4),YO(4),XS(4),YS(4),XT(4),YT(4),EX(4),EY(4),EM(4),UX(4),UY(4),ES(4)
36 XO(0)=0:XO(1)=1:XO(2)=0:XO(3)=-1
37 YO(0)=-1:YO(1)=0:YO(2)=1:YO(3)=0
38 XS(0)=0:XS(1)=1:XS(2)=0:XS(3)=0:XT(0)=1:XT(1)=1:XT(2)=1:XT(3)=0:YS(0)=-32:YS(1)=0:YS(2)=64:YS(3)=0:YT(0)=-32:YT(1)=32:YT(2)=64:YT(3)=32
39 EN=0:EK=4
40 X=20:Y=15:H=0
41 EX(0)=20:EY(0)=1:EX(1)=12:EY(1)=4:EX(2)=20:EY(2)=18:EX(3)=12:EY(3)=13
42 EM(0)=1:EM(1)=-1:EM(2)=1:EM(3)=-1:ES(0)=0:ES(1)=0:ES(2)=1:ES(3)=0
43 BS=&H1800:B2=&H800:B3=&H1000:C1=&H2000:C2=&H2800:C3=&H3000
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 B2+N*8+I,VPEEK(N*8+I)
55 VPOKE B3+N*8+I,VPEEK(N*8+I)
56 'COLOR TEIGI
57 VPOKE C1+N*8+I,&HF1
58 VPOKE C2+N*8+I,&HF1
59 VPOKE C3+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 4010
178 FOR J=0 TO 10
185 BG$="":CR$=""
190 READ BG$,CR$
192 FOR I=0 TO 7
193 BK$="":CK$=""
195 BK$=MID$(BG$,I*2+1,2)
196 CK$=MID$(CR$,I*2+1,2)
200 VPOKE M*8+I,VAL("&H"+BK$)
210 VPOKE B2+M*8+I,VAL("&H"+BK$)
220 VPOKE B3+M*8+I,VAL("&H"+BK$)
250 VPOKE C1+M*8+I,VAL("&H"+CK$)
260 VPOKE C2+M*8+I,VAL("&H"+CK$)
270 VPOKE C3+M*8+I,VAL("&H"+CK$)
280 NEXT
290 M=M+1
300 NEXT
490 'MAP
500 LOCATE 0,0:PRINT "caaaaaaaaaaaaaaaaaaaaaaaaaaaaaad"
510 LOCATE 0,1:PRINT "b b"
520 LOCATE 0,2:PRINT "b b"
530 LOCATE 0,3:PRINT "b j haaaaaaad haaaaaaaaaai b"
540 LOCATE 0,4:PRINT "b b b b"
550 LOCATE 0,5:PRINT "b b b b"
560 LOCATE 0,6:PRINT "b eaaaaaaai b caaaaaaaaaad b"
570 LOCATE 0,7:PRINT "b b b b b"
580 LOCATE 0,8:PRINT "b k b b b"
590 LOCATE 0,9:PRINT "b cd caaad b j cad b b"
600 LOCATE 0,10:PRINT"b bb b b b b b b b b"
610 LOCATE 0,11:PRINT"b bb b b j b b eaf k b"
620 LOCATE 0,12:PRINT"b ef eaaaf b b b b"
630 LOCATE 0,13:PRINT"b b b b b"
640 LOCATE 0,14:PRINT"b b b eaaaaaaai b"
650 LOCATE 0,15:PRINT"b cd caaaaaab b b"
660 LOCATE 0,16:PRINT"b bb b b b b"
670 LOCATE 0,17:PRINT"b ef b k eaaaaaaaaaai b"
680 LOCATE 0,18:PRINT"b b b"
690 LOCATE 0,19:PRINT"b b b"
700 LOCATE 0,20: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 M=ASC("a")-1
999 H=4
1000 S=STICK(0) OR STICK(1)
1001 A=TIME
1010 TX=X:TY=Y
1018 'PLAYER
1019 IX=S/2:IF IX*2=S THEN 1100
1020 IF VPEEK(BS+X+Y*32+XO(IX)+XS(IX)+YS(IX)) >M THEN 1100
1021 IF VPEEK(BS+X+Y*32+XO(IX)+XT(IX)+YT(IX)) >M THEN 1100
1022 X=X+XO(IX):Y=Y+YO(IX):H=( (H+1)MOD2)+IX*2
1100 'ENEMY
1230 IF VPEEK(BS+EX(EN)+EY(EN)*32+EM(EN)+ES(EM(EN)+1) )>M THEN EM(EN)=-EM(EN):GOTO1270
1240 EX(EN)=EX(EN)+EM(EN)
1250 'ATARI HANTEI
1260 GOSUB1680
1270 'GAME OVER HANTEI
1280 IF GO=1 THEN GOTO1820
1330 'SPRITE HYOUJI
1333 PUT SPRITE 0,(X*8 ,Y*8-1),11,H
1335 PUT SPRITE EN+1,(EX(EN)*8,EY(EN)*8-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))<2 AND ABS(Y-EY(I))<2 THEN ED=I
1720 NEXT
1730 IF ED=99 THEN RETURN
1747 'PLAYER OUT SPRITE
1748 X=TX:Y=TY
1750 PUT SPRITE 0,(X*8,Y*8-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 GOTO40
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
4000 'YUKA
4010 DATAFFFF00000000FFFF,F151414141415141
4020 DATAC3C3C3C3C3C3C3C3,4141414141414141
4030 DATA0F1F3870E0C0C1C3,F151414141414141
4040 DATAF0F81C0E070383C3,F151414141414141
4050 DATAC3C1C0E070381F0F,4141414141415141
4060 DATAC38303070E1CF8F0,4141414141415141
4070 DATAC38303070E1CF8F0,4141414141414141
4080 DATA7FFFE0C0C0E0FF7F,F151414141415141
4090 DATAFEFF07030307FFFE,F151414141415141
4100 DATA7EFFE7C3C3C3C3C3,F151414141414141
4110 DATAC3C3C3C3C3E7FF7E,4141414141415141
20990 'MUSIC DATA
21000 DATAG4E8E4F8E8D8C8
21010 DATAG4E8E8D4R4
21020 DATAE8E8G8G8A8A8R8A8
21030 DATAO6C4O5E8E8G4R4
21040 DATAGE8E8F8E8D8C8
21050 DATAGE8E8D4R4
21060 DATAGE8E8A4G8G8
21070 DATAA8A8B8B8O6C4O5R4
21080 DATA##

 

おお!速い!

8 / 60s ~ 11 / 60s になりました!

自分でやったのより2/ 60sくらい速くなりました!!!

そしてプログラムが短い!!

 

しかし、レジェンドの方々に指導して頂くという、ものすごく贅沢な体験をしました^^

(以前からフォローして頂いていましたが^^)

twitterってすごいなぁ〜。

 

f:id:nyaonyaokun:20181026025650p:plain

 

 こちらでサンプルを試すことができます。

MSXPen - MSX Developer Playground & Code Editor in the Browser

 

 (サンプルコードを載せることができますし、サーバーがない人でも

ネットにアップできるし、いいサイトかも!) 

 

 

次回は、敵のアルゴリズムをやろうと思います。

敵のアルゴリズムに必須のランダムなどを書こうと思います。

 

 

 時々チェックすると、いいものがあるかもしれないです^^

 

MSX ゲーム・本体・雑誌など

 

 

 つづき

www.nyaonyao21.com


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

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