在C64 Basic中生成随机方向

5

我已经运行了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行的参数,以使球碰到墙壁时可以在不同方向上移动(类似于乒乓球)?
注意1:当在80和100行中更改DX DY时,我得到了一些有趣的抖动运动,但正如预期的那样,好像屏幕上绘制的球是不均匀的球体。
注意2:我知道通常不应在标题中包含标记,但不确定如果省略它们是否会使问题过于难以搜索。 如果需要,请随意编辑标题; 我很乐意接受教育。

2
第60行应该是“60 for t=1 to 10:next t”吗? - alvalongo
当然!我的错。现在已经编辑好了。 - Canned Man
2个回答

3
我以以下方式修改了程序:
1-DX是X方向的步长。 2-DY是Y方向的步长。 2-VX是X方向的方向,-1表示左,+1表示右。 3-XY是Y方向的方向,-1表示向上,+1表示向下。 3-当弹跳球的角度随机变化时(子例程300),DX和DY的计算是基于一个斜边为1(一)的直角三角形的。 4-在绘图时只使用整数,以避免“球”产生奇怪的动作。 5-控制球的范围,以防止“球”消失。
5 rem 2018-08-24 bouncing balls
6 rem https://dev59.com/Ea3la4cB1Zd3GeqPRb7y
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,则可以看到该步行。


1
我修改了程序,具体如下:
- 起始位置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

你能解释一下40-45行的代码吗? - Canned Man
4
在C64 BASIC中,真值为数值-1(负一),而假值为数值0(零)。如果RND(1)<0.5,则随机数小于0.5时为-1,DX向左或DY向上;如果大于或等于0.5,则值为零,因此“IF”将DX设置为1以向右移动,将DY设置为1以向下移动。 - alvalongo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接