在C64 Basic中生成随机方向

Can*_*Man 5 random graphics basic c64 commodore

我从C64用户手册的第5章开始运行'More Bouncing Balls'Basic程序,并从本章的最后一页添加.代码如下:

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
Run Code Online (Sandbox Code Playgroud)

为此添加了最后的行,ɔ:

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
Run Code Online (Sandbox Code Playgroud)

这些行与问题无关,但为了完整起见,我将它们包括在内.

我想在球的方向上添加随机性(chr$(81)),并注意到通过改变DXDY其他数字,我会让它以45°以外的角度移动; 当然,将DX和DY都设置为1,将使它们在垂直相反的方向上"推"球,ɔ:两者之间,等于45°.

但是当试图使用随机数时,我会得到真正奇怪的行为.我假设数字必须介于0和1之间,因此尝试了(INT(10*RND(1))+1)/10,并将第40行更改为设置DXDY此随机数.我得到的是一些非常奇怪的行为.球将以可预测的角度快速移动,在右侧消失并再次出现在左侧,向下移动几条线,然后完全消失,然后在屏幕顶部向上转动,一个接一个地水平移动不动的球,然后崩溃.当改为设置DXDY整数,即2时,我仍会得到一些奇怪的行为,例如球在一端消失并再次出现在相反的位置,此时程序将在几秒后结束.

造成这种不稳定行为的原因是什么?如何设置第40行的参数,让球在撞到墙壁时朝不同的方向移动(有点像Pong)?

注1:当改变时DX,DY在80和100行中,我得到了一些有趣的抖动运动,但正如预期的那样,好像在屏幕上绘制的球是一个不均匀的球体.

注2:我知道一般不应该在标题中包含标签,但不确定如果我把它们排除在外,这个问题是否太难以检测.如果需要,随意编辑标题; 我很高兴接受教育.

alv*_*ngo 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 /sf/ask/3633492481/
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
Run Code Online (Sandbox Code Playgroud)

在 C64 上,使用 SHIFT+UP_ARROW 替换 {pi}。
如果 110 路是 REM,那么您可以看到步行路线。