Random 在C64 Basic中生成随机方向

Random 在C64 Basic中生成随机方向,random,graphics,basic,c64,commodore,Random,Graphics,Basic,C64,Commodore,我已经运行了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

我已经运行了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:我知道一般情况下,标题中不应包含标签,但不确定如果我将标签遗漏,问题是否太难搜索。如果需要,可以自由编辑标题;我很高兴接受教育。

我修改了课程,所以:
-起始位置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
10打印CHR$(147):REM SHIFT CLR/HOME
20戳53280,7:戳53281,13
25雷姆随机初始位置
30 X=INT(RND(1)*39)+1:Y=INT(RND(1)*24)+1
35雷姆随机方向
40 DX=(RND(1)=0然后DX=1
45 DY=(RND(1)=0然后DY=1
50+X+40*Y,81
T=1到30时为60:下一个T
70*1024+X+40*Y,32
80 X=X+DX
90如果X=39,则DX=-DX
100 Y=Y+DY
110如果Y=24,则DY=-DY
120转到50

我这样修改了程序:

1-DX是X的步长。
2-DY是Y的步长。
2-VX是X的方向,-1左和+1右。
3-XY是Y的方向,-1向上和+1向下。
3-当弹跳球角度随机变化时(子程序300)
DX和DY的计算是针对斜边为1(1)的直角三角形。
4-打印时仅使用整数,这样“球”就不会有奇数移动。
5-控制禁区,所以“球”不会消失

5 rem 2018-08-24 bouncing balls
6 rem https://stackoverflow.com/questions/51907035
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
5 rem 2018-08-24弹跳球
6雷姆https://stackoverflow.com/questions/51907035
7 rem/生成-随机-方向-in-c64-basic
10打印chr$(147);:rem shift+clr/home=清除屏幕
20戳53280,7:戳53281,13
25雷姆随机初始位置
40 p=rnd(1)*40:x=p
45 q=rnd(1)*25:y=q
50 gosub 300
60雷姆矢量方向
70 vx=(rnd(1)=0然后vx=1
80 vy=(rnd(1)=0然后vy=1
100雷姆图
110*1024+int(p)+40*int(q),32
120*1024+int(x)+40*int(y),81
130对于t=1到30:下一个t
140 p=x:q=y
150 x=x+dx*vx
160 ca=0:rem变化角
170如果x=39,则vx=-vx:ca=-1
175如果是x39,则x=39
180 y=y+dy*vy
190如果y=24,则vy=-vy:ca=-1
195如果y24,则y=24
200如果是ca,则为gosub 300
210转到100
15和75 d之间的300 rem随机角
白鹭
305雷姆a=角度(度)r=弧度
310 a=15+rnd(1)*(75-15+1):r=a*{pi}/180
320 dx=cos(r)
330 dy=sin(r)
340返回
在C64上,使用SHIFT+向上箭头替换{pi}。

如果第110行是REM,那么你可以看到行走。

第60行应该是“t=1到10的60:下一个t”吗?当然!我的不好。现在编辑。你能解释一下第40-45行吗?在C64 BASIC上,真值是数字-1(减1),假值是数字0(零)。RND(1)