在 C64 Basic 中生成随机方向
Generating random direction in C64 Basic
我有 运行 C64 用户手册第 5 章的“更多弹跳球”基本程序,以及该章最后一页的补充。代码如下:
10 PRINT CHR$(147):REM SHIFT CLR/HOME
20 POKE 53280,7 : POKE 53281,13
30 X=1:Y=1
40 DX=1:DY=1
50 POKE 1024 + X + 40*Y, 81
60 FOR T=1 TO 10: NEXT T
70 POKE 1024 + X + 40*Y, 32
80 X=X+DX
90 IF X=0 OR X=39 THEN DX=-DX
100 Y=Y+DY
110 IF Y=0 OR Y=24 THEN DY=-DY
120 GOTO 50
最后添加了一行,ɔ:
21 FOR L=1 TO 10
25 POKE 1024+INT(RND(1)*1000),160
27 NEXT L
85 IF PEEK(1024+X+40*Y)=160 THEN DX=-DX:GOTO 80
105 IF PEEK(1024+X+40*Y)=160 THEN DY=-DY:GOTO 100
这些行与问题无关,但为了完整起见,我将它们包括在内。
我想为球的方向添加随机性 (chr$(81)
),并注意到通过将 DX
和 DY
更改为其他数字,我可以让它移动45°以外的角度;当然,将 DX 和 DY 都设置为 1,将使它们都沿垂直相反的方向“推动”球,ɔ:两者之间的一半,等于 45°。
但是当尝试使用随机数时,我会得到非常奇怪的行为。我假设数字必须在 0 和 1 之间,所以尝试 (INT(10*RND(1))+1)/10
,并更改第 40 行以将 DX
和 DY
设置为这个随机数。相反,我得到的是一些非常奇怪的行为。球会以可预测的角度快速移动,在右侧消失并在左侧重新出现,向下移动几行,然后完全消失,然后在屏幕上方出现,一个接一个地水平绘制不动的球,然后坠落.
当将 DX
或 DY
设置为整数时,即 2,我仍然会得到一些奇怪的行为,例如球在一端消失并在另一端重新出现,在这种情况下程序会几秒后结束。
是什么导致了这种不稳定的行为?我如何设置第 40 行中的参数以允许球在撞墙时向不同方向移动(有点像 Pong)?
注意 1:当在第 80 行和第 100 行更改 DX
和 DY
时,我得到了一些有趣的抖动,但正如预期的那样,好像绘制的球 on-screen 是不均匀的球体。
注意 2:我知道通常不应该在标题中包含标签,但不确定如果我将它们排除在外,问题是否会太难搜索。如果需要,请随意编辑标题;我很高兴接受教育。
我修改了程序:
- 起始位置 X 和 Y 是随机的
- 方向 DX 和 DY 是随机的,值 -1 或 +1
10 PRINT CHR$(147):REM SHIFT CLR/HOME
20 POKE 53280,7:POKE 53281,13
25 REM RANDOM INITIAL POSITION
30 X=INT(RND(1)*39)+1:Y=INT(RND(1)*24)+1
35 REM RANDOM DIRECTION
40 DX=(RND(1)<0.5):IF DX>=0 THEN DX=1
45 DY=(RND(1)<0.5):IF DY>=0 THEN DY=1
50 POKE 1024+X+40*Y,81
60 FOR T=1 TO 30:NEXT T
70 POKE 1024+X+40*Y,32
80 X=X+DX
90 IF X<=0 OR X>=39 THEN DX=-DX
100 Y=Y+DY
110 IF Y<=0 OR Y>=24 THEN DY=-DY
120 GOTO 50
我把程序改成这样:
1-DX 是 X 的步骤。
2-DY 是 Y 的步骤。
2-VX 为 X 方向,-1 左,+1 右。
3-XY 为 Y 方向,-1 向上,+1 向下。
3-当Bouncing Ball角度随机变化时(子程序300)
DX 和 DY 的计算是针对斜边为 1(一)的直角三角形。
4-绘图时仅使用整数,因此 "ball" 没有奇怪的移动。
5-控制越界,所以 "ball" 不会消失。
5 rem 2018-08-24 bouncing balls
6 rem
7 rem /generating-random-direction-in-c64-basic
10 print chr$(147);:rem shift+clr/home=clear screen
20 poke 53280,7:poke 53281,13
25 rem random initial position
40 p=rnd(1)*40:x=p
45 q=rnd(1)*25:y=q
50 gosub 300
60 rem vector direction
70 vx=(rnd(1)<0.5):if vx>=0 then vx=1
80 vy=(rnd(1)<0.5):if vy>=0 then vy=1
100 rem plot
110 poke 1024+int(p)+40*int(q),32
120 poke 1024+int(x)+40*int(y),81
130 for t=1 to 30:next t
140 p=x:q=y
150 x=x+dx*vx
160 ca=0:rem change angle
170 if x<=0 or x>=39 then vx=-vx:ca=-1
175 if x<0 then x=0
176 if x>39 then x=39
180 y=y+dy*vy
190 if y<=0 or y>=24 then vy=-vy:ca=-1
195 if y<0 then y=0
196 if y>24 then y=24
200 if ca then gosub 300
210 goto 100
300 rem random angle between 15 and 75 d
egrees
305 rem a=angle in degrees r=radians
310 a=15+rnd(1)*(75-15+1):r=a*{pi}/180
320 dx=cos(r)
330 dy=sin(r)
340 return
在 C64 上使用 SHIFT+UP_ARROW 替换 {pi}。
如果第110行是REM那么你就可以看到walk了。
我有 运行 C64 用户手册第 5 章的“更多弹跳球”基本程序,以及该章最后一页的补充。代码如下:
10 PRINT CHR$(147):REM SHIFT CLR/HOME
20 POKE 53280,7 : POKE 53281,13
30 X=1:Y=1
40 DX=1:DY=1
50 POKE 1024 + X + 40*Y, 81
60 FOR T=1 TO 10: NEXT T
70 POKE 1024 + X + 40*Y, 32
80 X=X+DX
90 IF X=0 OR X=39 THEN DX=-DX
100 Y=Y+DY
110 IF Y=0 OR Y=24 THEN DY=-DY
120 GOTO 50
最后添加了一行,ɔ:
21 FOR L=1 TO 10
25 POKE 1024+INT(RND(1)*1000),160
27 NEXT L
85 IF PEEK(1024+X+40*Y)=160 THEN DX=-DX:GOTO 80
105 IF PEEK(1024+X+40*Y)=160 THEN DY=-DY:GOTO 100
这些行与问题无关,但为了完整起见,我将它们包括在内。
我想为球的方向添加随机性 (chr$(81)
),并注意到通过将 DX
和 DY
更改为其他数字,我可以让它移动45°以外的角度;当然,将 DX 和 DY 都设置为 1,将使它们都沿垂直相反的方向“推动”球,ɔ:两者之间的一半,等于 45°。
但是当尝试使用随机数时,我会得到非常奇怪的行为。我假设数字必须在 0 和 1 之间,所以尝试 (INT(10*RND(1))+1)/10
,并更改第 40 行以将 DX
和 DY
设置为这个随机数。相反,我得到的是一些非常奇怪的行为。球会以可预测的角度快速移动,在右侧消失并在左侧重新出现,向下移动几行,然后完全消失,然后在屏幕上方出现,一个接一个地水平绘制不动的球,然后坠落.
当将 DX
或 DY
设置为整数时,即 2,我仍然会得到一些奇怪的行为,例如球在一端消失并在另一端重新出现,在这种情况下程序会几秒后结束。
是什么导致了这种不稳定的行为?我如何设置第 40 行中的参数以允许球在撞墙时向不同方向移动(有点像 Pong)?
注意 1:当在第 80 行和第 100 行更改 DX
和 DY
时,我得到了一些有趣的抖动,但正如预期的那样,好像绘制的球 on-screen 是不均匀的球体。
注意 2:我知道通常不应该在标题中包含标签,但不确定如果我将它们排除在外,问题是否会太难搜索。如果需要,请随意编辑标题;我很高兴接受教育。
我修改了程序:
- 起始位置 X 和 Y 是随机的
- 方向 DX 和 DY 是随机的,值 -1 或 +1
10 PRINT CHR$(147):REM SHIFT CLR/HOME
20 POKE 53280,7:POKE 53281,13
25 REM RANDOM INITIAL POSITION
30 X=INT(RND(1)*39)+1:Y=INT(RND(1)*24)+1
35 REM RANDOM DIRECTION
40 DX=(RND(1)<0.5):IF DX>=0 THEN DX=1
45 DY=(RND(1)<0.5):IF DY>=0 THEN DY=1
50 POKE 1024+X+40*Y,81
60 FOR T=1 TO 30:NEXT T
70 POKE 1024+X+40*Y,32
80 X=X+DX
90 IF X<=0 OR X>=39 THEN DX=-DX
100 Y=Y+DY
110 IF Y<=0 OR Y>=24 THEN DY=-DY
120 GOTO 50
我把程序改成这样:
1-DX 是 X 的步骤。
2-DY 是 Y 的步骤。
2-VX 为 X 方向,-1 左,+1 右。
3-XY 为 Y 方向,-1 向上,+1 向下。
3-当Bouncing Ball角度随机变化时(子程序300)
DX 和 DY 的计算是针对斜边为 1(一)的直角三角形。
4-绘图时仅使用整数,因此 "ball" 没有奇怪的移动。
5-控制越界,所以 "ball" 不会消失。
5 rem 2018-08-24 bouncing balls
6 rem
7 rem /generating-random-direction-in-c64-basic
10 print chr$(147);:rem shift+clr/home=clear screen
20 poke 53280,7:poke 53281,13
25 rem random initial position
40 p=rnd(1)*40:x=p
45 q=rnd(1)*25:y=q
50 gosub 300
60 rem vector direction
70 vx=(rnd(1)<0.5):if vx>=0 then vx=1
80 vy=(rnd(1)<0.5):if vy>=0 then vy=1
100 rem plot
110 poke 1024+int(p)+40*int(q),32
120 poke 1024+int(x)+40*int(y),81
130 for t=1 to 30:next t
140 p=x:q=y
150 x=x+dx*vx
160 ca=0:rem change angle
170 if x<=0 or x>=39 then vx=-vx:ca=-1
175 if x<0 then x=0
176 if x>39 then x=39
180 y=y+dy*vy
190 if y<=0 or y>=24 then vy=-vy:ca=-1
195 if y<0 then y=0
196 if y>24 then y=24
200 if ca then gosub 300
210 goto 100
300 rem random angle between 15 and 75 d
egrees
305 rem a=angle in degrees r=radians
310 a=15+rnd(1)*(75-15+1):r=a*{pi}/180
320 dx=cos(r)
330 dy=sin(r)
340 return
在 C64 上使用 SHIFT+UP_ARROW 替换 {pi}。
如果第110行是REM那么你就可以看到walk了。