【はじめてのプチコン】バグ対策済みサンプル | りょうのゲーム塾

りょうのゲーム塾

再開、準備中。

チェックポイント
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