Generating random direction in C64 Basic

I have run the ‘More Bouncing Balls’ Basic program from chapter 5 of the C64 user’s manual, with the addition from the final page of the chapter. The code is as follows:

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

To this were added the lines at the end, ɔ:

21 FOR L=1 TO 10
25 POKE 1024+INT(RND(1)*1000),160
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

These lines are not relevant to the question, but I included them for sake of completeness.

I wanted to add randomness to the direction of the ball (chr$(81)), and noticed that by changing DX and DY to other numbers, I would get it to move at angles other than 45°; of course, having both DX and DY set to 1, would have them both ‘push’ the ball in perpendicularly opposite directions, ɔ: halfway between both, equalling 45°.

But when trying to use a random number, I would get truly odd behaviour. I assumed the number had to be between 0 and 1, and so tried (INT(10*RND(1))+1)/10, and changed line 40 to set DX and DY to this random number. What I got instead was some very odd behaviour. The ball would move very fast at a predictable angle, disappearing at the right side and reappearing on the left, moving a few lines down, then disappearing completely, then turning up on top of the screen drawing unmoving balls one after another horizontally, then crash. When instead setting DX or DY to an integer, i.e. 2, I would still get some strange behaviour, such as the ball disappearing at one end and reappearing at the opposite, and on this occasion the program would end after a few seconds.

What is causing this erratic behaviour? And how can I set the parameters in line 40 to allow the ball to move in different directions (kind of like in Pong) when it hits a wall?

Note 1: When changing DX and DY in lines 80 and 100 instead, I got some interesting jittering movement, but as expected, as though the ball drawn on-screen was an uneven sphere.

Note 2: I am aware one generally should not include tags in titles, but was unsure whether the question would be too unsearchable if I left them out. Feel free to edit the title if need be; I am happy to be educated.


  • I modified the program in this way:

    1-DX is step for X.
    2-DY is step for Y.
    2-VX is direction of X, -1 left and +1 rigth.
    3-XY is direction of Y, -1 up and +1 down.
    3-When Bouncing Ball angle changes randomly (subroutine 300)
    Calculation of DX and DY is for a right triangle with hypotenuse of 1 (one).
    4-When plotting use only integer numbers so the "ball" doesn't have odd moves.
    5-Control off limits, so "ball" doesn't disappear.

    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
    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

    On C64 replace {pi} using SHIFT+UP_ARROW.
    If line 110 is REM then you can see the walk.