Microsoft Small Basic

Program Listing: PMD031-0
Initialise() 'http://smallbasic.com/program/?PMD031-0

While 0=0
UpdateModel()
UpdateFrame()
FrameRate()
EndWhile

'======================================================
'MAIN SUBROUTINES
'======================================================
Sub UpdateModel
'SET SPEED DIRECTION & AXIS
For i = 1 To Array.GetItemCount(ball)
If tY[i] > Y[i] Then
dY[i] = speed
ElseIf tY[i] < Y[i] Then
dY[i] = -speed
EndIf

If tX[i] > X[i] Then
dX[i] = speed
ElseIf tX[i] < X[i] Then
dX[i] = -speed
EndIf
EndFor

'UPDATE POSITION
For i = 1 To Array.GetItemCount(ball)
X[i] = X[i] + dX[i]
Y[i] = Y[i] + dY[i]
EndFor
CollisionWithTarget()
EndSub

Sub UpdateFrame
'UPDATE FRAME
For i = 1 To Array.GetItemCount(ball)
Shapes.Move(ball[i], X[i], Y[i])
EndFor
EndSub

Sub FrameRate
delay = 15 - (Clock.ElapsedMilliseconds - start)
If delay > 0 Then
Program.Delay(delay)
EndIf
start = Clock.ElapsedMilliseconds
EndSub

'==============================================================
'COLLISIONS
'=============================================================
Sub CollisionWithTarget
'WHEN TARGET REACHED - SET NEW TARGET & CANCEL PRIOR AXIS
For i = 1 To Array.GetItemCount(ball)
If tY[i] = Y[i] And dX[i] = 0 Then 'SET X-AXIS TARGET & CANCEL Y-AXIS SPEED
dY[i] = 0
tX[i] = (Math.GetRandomNumber(cols)-1) * gap + origin
EndIf

If tX[i] = X[i] And dY[i] = 0 Then 'SET Y-AXIS TARGET & CANCEL X-AXIS SPEED
dX[i] = 0
tY[i] = (Math.GetRandomNumber(rows)-1) * gap + origin
EndIf
EndFor
EndSub

'=======================================================
'INITIAL SETUP
'=======================================================
Sub Initialise
origin = 20
cols = 12
rows = 8
gap = 50 'BETWEEN GRID LINES

GraphicsWindow.PenColor = "Gray"
GraphicsWindow.BrushColor = "Black"

'DRAW GRID
For r = 0 To rows - 1
For c = 0 To cols - 1
GraphicsWindow.FillRectangle(gap * c + origin, gap * r + origin, gap, gap)
GraphicsWindow.DrawRectangle(gap * c + origin, gap * r + origin, gap, gap)
EndFor
EndFor

GraphicsWindow.CanResize = "False"
GraphicsWindow.Width = cols * gap + origin * 2
GraphicsWindow.Height = rows * gap + origin * 2

GraphicsWindow.BrushColor = "Yellow"

'ADD 10 BALLS, SET THEIR POSITION, TARGET & AXIS
For i = 1 To 10
ball[i] = Shapes.AddEllipse(gap gap)

X[i] = gap * (Math.GetRandomNumber(cols)-1) + origin
Y[i] = gap * (Math.GetRandomNumber(rows)-1) + origin

'SETS TARGET FOR Y-AXIS MOTION
tX[i] = X[i]
tY[i] = (Math.GetRandomNumber(rows)-1) * gap + origin'
dX[i] = 0
EndFor

speed = gap / 10 'SPEED MUST BE A FACTOR OF GAP
EndSub