# Microsoft Small Basic

Program Listing:
' Challenge of the month August 2012 Free throw basketball by NaochanON MMQ961-1
' Throwed ball traced
' Click ball , move(slide) ball and release ball within blue circle
'
GUI()
GraphicsWindow.MouseDown=Onmousedown
GraphicsWindow.MouseMove=Onmousemove
GraphicsWindow.Mouseup=Onmouseup

While "true"
If move="true" Then
Shoot()            ' ball is throwed
Goalcheck()        ' if ball goals in or not
Goalin()           ' ball goes down throgh goal net
EndIf
Program.Delay(20)
endwhile

sub Goalin
If goal="true" Then
Vx=0
newx=RX+(RW-BD)/2                 ' ball falling position
Vy=Vy/3                           ' ball falling speed
Gravity=Gravity*0.8
If (PY+BD/2)<Shapes.GetTop(BBall) and Shapes.GetTop(BBall)<(PY+BD) Then
For i=1 To 11
Shapes.Rotate(line[i],10)      ' goal net swings
EndFor
Program.Delay(50)
EndIf
'
If (PY+BD)<Shapes.GetTop(BBall) then
staynet()                        ' Net return initial state
Gravity=7
EndIf
endif
EndSub

Sub staynet
For i=1 To 11
Shapes.Rotate(line[i],0)           ' goal net stay
EndFor
EndSub

Sub goalcheck
If goal="false" and RX<newx And newx<RX+RW-BD and  math.Abs(newY-PY)<BD/2 Then
Shapes.SetText(smsg," Goal !!!!! ")
Shapes.Animate(smsg,1000,150,1500)
goal="true"
MM=MM+1                            ' count up goals
resultshow()
EndIf
endsub

Sub resultshow
result=" Click , move(slide) and release ball within blue circle. " +Text.GetCharacter(10)+ " Throwing = "+NN +" times Goal= "+MM+" times"
Shapes.SetText(sresult,result)
EndSub

Sub Shoot
dn=dn+1
Shapes.ShowShape(gball[dn])           ' trace ball
Shapes.Move(gball[dn],newx,newy)
t3=clock.ElapsedMilliseconds
newx=newx-vx*PM
newy=newy-vy +(t3-t2)*(t3-t2)*Gravity/2/1000000
Shapes.Move(BBall,newx,newy)
GraphicsWindow.Title="Now Ball X= "+math.Floor(newx)+ " Y= "+math.Floor(newy)+" Vx = "+math.Floor(Vx) + " Vy = "+math.Floor(Vy)
If (RX-PW<newx and newx<RX+4)   And (PY-PH/2-BD/2<newY And newY<PY) Then ' if ball taches the panel
PM=-1
EndIf
If GH-BD-20<newy Then
move="false"
newx=0
newy=0
Shapes.Animate(BBall,x0,y0,4000)   ' ball backs initial position
Program.Delay(4000)
Shapes.Move(smsg,-100,-50)         ' hide goal message
GraphicsWindow.Title="Now Ball is "+X0+ " : "+Y0
For i=1 To dn
Shapes.HideShape(gball[i])
EndFor
dn=0
EndIf
EndSub

Sub onmousedown
gx= GraphicsWindow.MouseX
gy= GraphicsWindow.MouseY
If math.Abs(gx-x0)<50 And math.Abs(gy-y0)<50 Then
NN=NN+1
PM=1
catch="true"
goal="false"
Gravity=9.8
t1=clock.ElapsedMilliseconds        ' ball caught time
resultshow()                        ' result
staynet()                           ' Net return initial state
EndIf
endsub

Sub onmousemove
If catch="true" Then
gx1= GraphicsWindow.MouseX
gy1= GraphicsWindow.MouseY
Shapes.Move(BBall,gx1,gy1)
r=Math.SquareRoot((gx1-x0)*(gx1-x0)+ (gy1-y0)*(gy1-y0))  ' distance from initial position
If r>410 Then
onmouseup()                       ' forced throwing
endif
EndIf
endsub

Sub onmouseup
If catch="true" Then
gx2= GraphicsWindow.MouseX
gy2= GraphicsWindow.MouseY
t2=clock.ElapsedMilliseconds        ' Ball release time
catch="false"
Vx=(gx-gx2)/(t2-t1)*10              ' Ball speed X
Vy=(gy-gy2)/(t2-t1)*10              ' Ball speed Y
newx=shapes.GetLeft(BBall)
newy=shapes.Gettop(BBall)
Move="true"
EndIf
endsub

Sub GUI
GraphicsWindow.Show()
GraphicsWindow.Hide()
GraphicsWindow.Top=20
GraphicsWindow.Left=20
'---------------- initial value ----------------------
GW=1200
GH=650
GraphicsWindow.BackgroundColor="Darkgreen"
GraphicsWindow.Width=GW
GraphicsWindow.Height=GH
GraphicsWindow.BrushColor="Lightcyan"
GraphicsWindow.PenColor="Navy"
GraphicsWindow.PenWidth=3
Shapes.Move(circle,GW-400,GH-400)
BD=50
GraphicsWindow.BrushColor="lightgray"
GraphicsWindow.penColor="gray"
For i=1 To 300
Shapes.Move(gball[i],1200,900)
Shapes.HideShape(gball[i])
endfor
GraphicsWindow.BrushColor="Brown"
GraphicsWindow.PenColor="Coral"
X0=GW-BD
Y0=GH-BD
Shapes.Move(BBall,X0,Y0)
'---------------- Message ----------------------
GraphicsWindow.BrushColor="Yellow"
GraphicsWindow.FontSize=25
GraphicsWindow.FontItalic="True"
Shapes.Move(smsg,-100,-50)
result=" Click , move(slide) and release ball within blue circle. " +Text.GetCharacter(10)+ " Throwing = "+NN +" times Goal= "+MM+" times"
Shapes.Move(sresult,200,10)
'---------------- Goal Net ----------------------
GraphicsWindow.BrushColor="Yellow"
PW=20                                  ' Panel Width
PH=200                                 ' Panel Height
PY=200                                 ' Panel position Y
RX=90                                  ' Ring position X
RW=110                                 ' Ring width
GraphicsWindow.BrushColor="Darkgreen"
GraphicsWindow.PenColor="lightcyan"
For i=1 To 11
EndFor
setgoal()
GraphicsWindow.Show()
'--------------------------------------
catch="false"
NN=0
MM=0
EndSub

Sub setgoal
Shapes.Move(panel,RX-PW,PY-PH/2)
Shapes.Move(ring,RX,PY)
For i=1 To 11
Shapes.Move(line[i],RX,PY)
EndFor
endsub