randomgraphicsbasicc64commodore# 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:

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

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

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

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.

Solution

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

On C64 replace {pi} using SHIFT+UP_ARROW.

If line 110 is REM then you can see the walk.

- What is wrong with my code? It just randomly stops
- Fill elements of a vector randomly depending on constraints
- How to generate a random int in C?
- Generate N random numbers whose sum is a constant K - Excel
- Spectral Test in R
- Generating a random uint64_t
- Update Table with random value in one column for all rows
- Select single random sample from group by in Hive
- Clarifying the Process of Generating iid Gaussian Random Vectors in MATLAB
- Using "$RANDOM" to generate a random string in Bash
- Generate alphanumeric string with 2 letters and 5 digits
- How to generate uniformly distributed subintervals of an interval?
- Generating random number in a non-power-of-2 range from random bits
- Why are all the strings the same
- How to pick between 2 numbers
- Randomly placed circles sometimes go out of the canvas when the code says otherwise
- random.seed() does not work with np.random.choice()
- how does this logic work: num=(rand()%(a+1));
- Fastest way to generate a matrix using beta.rvs in python
- c++ rand() insignificant change
- Is there functionality to generate a random character in Java?
- How do I create a random String by sampling from alphanumeric characters?
- Generating a (random) sequence of multiple characters in R
- random.random vs. numPy.random
- How do I select a random value from an enumeration?
- How do you generate an image where each pixel is a random color in python
- Is this a stupid way to handle session storage with PostgreSQL? Should I use GENERATED values?
- C++17: g++ Version 8.5 Seems to not be Properly Generating Unsigned 64-Bit Pseudorandom Integers
- Generating random numbers over a range in Go
- Is it good practice to shuffle character set before they are picked randomly