チェックポイント FOR文のバグ回避の対策済みサンプルプログラムです。
|
申し訳ありませんがしばらくの間行番号は付加しません。
行番号をつけるのがかなり面倒な作業になってきたので、
省略させていただきます。
| ■プログラム |
' initialize GOSUB @SYS_INI GOSUB @PLY_INI GOSUB @WPN_INI GOSUB @UFO_INI ' game loop @LOOP GOSUB @SYS_MAIN ' task GOSUB @PLY_TASK GOSUB @WPN_TASK GOSUB @UFO_TASK GOTO @LOOP ' ' system ' @SYS_INI CLEAR SYS_CNT = 0 SYS_KEY = BUTTON() RETURN ' @SYS_MAIN VSYNC 1 CLS SYS_CNT = SYS_CNT + 1 OLD_KEY = SYS_KEY SYS_KEY = BUTTON() TRG_KEY = SYS_KEY XOR OLD_KEY ON_KEY = TRG_KEY AND SYS_KEY RETURN ' ' UFO task ' @UFO_INI UFO_SX = 0.1 UFO_F = 0 UFO_CNT = 60 RETURN ' @UFO_TASK ON UFO_F GOTO @UFO_WAIT,@UFO_MVR,@UFO_MVL STOP ' @UFO_WAIT UFO_CNT = UFO_CNT - 1 IF UFO_CNT > 0 THEN RETURN GOTO @UFO_RSET ' move right @UFO_MVR LOCATE UFO_X, 0 PRINT "A" UFO_X = UFO_X + UFO_SX IF UFO_X > 32 GOTO @UFO_LSET HITX = UFO_X HITY = 0 GOSUB @WPN_HITC IF HITF GOTO @UFO_DETH RETURN ' @UFO_LSET UFO_X = 31 UFO_F = 2 RETURN ' move left @UFO_MVL LOCATE UFO_X, 0 PRINT "A" UFO_X = UFO_X - UFO_SX IF UFO_X < 0 GOTO @UFO_RSET HITX = UFO_X HITY = 0 GOSUB @WPN_HITC IF HITF GOTO @UFO_DETH RETURN ' @UFO_RSET UFO_X = 0 UFO_F = 1 RETURN ' @UFO_DETH UFO_F = 0 UFO_CNT = 60 RETURN ' ' player task ' @PLY_INI PLY_X = 15 PLY_SX = 0.5 PLY_F = 0 RETURN ' @PLY_TASK LOCATE PLY_X,21 PRINT "P" IF ON_KEY AND 16 THEN GOSUB @WPN_FIRE ON PLY_F GOTO @PLY_STOP,@PLY_MVR,@PLY_MVL STOP ' stop @PLY_STOP IF SYS_KEY AND 8 GOTO @PLY1 IF SYS_KEY AND 4 GOTO @PLY2 RETURN @PLY1 PLY_F = 1 RETURN @PLY2 PLY_F = 2 RETURN ' move right @PLY_MVR PLY_X = PLY_X + PLY_SX IF PLY_X > 31 THEN PLY_X = 31 IF SYS_KEY AND 8 THEN RETURN PLY_F = 0 RETURN ' move left @PLY_MVL PLY_X = PLY_X - PLY_SX IF PLY_X < 0 THEN PLY_X = 0 IF SYS_KEY AND 4 THEN RETURN PLY_F = 0 RETURN ' ' weapon task ' @WPN_INI WPN_MAX = 3 DIM WPN_F(WPN_MAX) DIM WPN_X(WPN_MAX) DIM WPN_Y(WPN_MAX) FOR I=0 TO WPN_MAX-1 WPN_F(i) = 0 NEXT I WPN_SY = 0.5 RETURN ' @WPN_TASK FOR WPN_I=0 TO WPN_MAX-1 GOSUB @WPN_SUB NEXT WPN_I RETURN ' @WPN_SUB ON WPN_F(WPN_I) GOTO @WPN_WAIT,@WPN_MOVE STOP ' @WPN_WAIT RETURN ' @WPN_MOVE LOCATE WPN_X(WPN_I),WPN_Y(WPN_I) PRINT "!" WPN_Y(WPN_I) = WPN_Y(WPN_I) + WPN_SY IF WPN_Y(WPN_I) >= 0 THEN RETURN WPN_F(WPN_I) = 0 RETURN ' @WPN_FIRE GOSUB @WPN_GET IF WPN_N < 0 THEN RETURN BEEP 10 WPN_F(WPN_N) = 1 WPN_X(WPN_N) = PLY_X WPN_Y(WPN_N) = 20 RETURN ' @WPN_HITC HITF = 0
'FOR WPN_N=0 TO WPN_MAX-1 WPN_N=0 @LBL003
IF WPN_F(WPN_N) == 0 GOTO @WPN_NEXT IF FLOOR(WPN_X(WPN_N)) != FLOOR(HITX) GOTO @WPN_NEXT
IF FLOOR(WPN_Y(WPN_N)) == FLOOR(HITY) GOTO @WPN_HOK
@WPN_NEXT
'NEXT WPN_N IF WPN_N==WPN_MAX-1 THEN RETURN WPN_N=WPN_N+1 GOTO @LBL003
' @WPN_HOK HITF = 1 ' BEEP 13 WPN_F(WPN_N) = 0 RETURN ' @WPN_GET
'FOR WPN_N=0 TO WPN_MAX-1 WPN_N=0 @LBL001
IF WPN_F(WPN_N)==0 THEN RETURN
'NEXT WPN_N IF WPN_N==WPN_MAX-1 GOTO @LBL002 WPN_N=WPN_N+1 GOTO @LBL001 @LBL002
WPN_N = -1 RETURN 'End of line |