Tuesday, April 10, 2012

SmallBasic Turtle Logo Source Code 3

This is my polished version of Logo Turtle example code implementation in Small Basic. I hope you can easily understand the code. The code is optimized for simplicity, not execution speed. I will be bringing you more examples as time goes by. I don't really teach, but hopefully, by showing you the source codes, this can be a self-guided tutorial for you.

'Turtle Logo in Small Basic - NMC672
'by Harry Hardjono
'Turtle angle speed x1 y1 x0 y0
'Turtle move moveto penup pendown
'Turtle turn turnleft turnright
'Turtle show hide
'
' I hope this program is a good tutorial on how you can do your own programs!

GraphicsWindow.Show()
GraphicsWindow.Clear()

'----------------------------------------------
' Example Turtle Operation Code
'----------------------------------------------

cmd1="init"
Toitle()
cmd1="size"
cmd2=10
Toitle()
Program.Delay(1000)
cmd1="color"
cmd2="green"
Toitle()
Program.Delay(1000)
cmd1="color"
cmd2="red"
Toitle()
Program.Delay(1000)
cmd1="size"
cmd2=4
Toitle()
Program.Delay(1000)
cmd1="size"
cmd2=8
Toitle()



For loop=0 to 360 Step 20
cmd1="moveto"
cmd2=sx/2
cmd3=sy/2
Toitle()
cmd1="turn"
cmd2=loop
Toitle()
cmd1="move"
cmd2=200
Toitle()
Program.Delay(1000)
endfor



beginloop:
GraphicsWindow.Clear()
cmd1="init"
Toitle()
Program.Delay(2000)
cmd1="show"
Toitle()

For loop=1 to 50
cmd1="penup"
Toitle()
cmd1="moveto"
cmd2=Math.GetRandomNumber(sx)
cmd3=Math.GetRandomNumber(sy)
Toitle()
cmd1="pendown"
Toitle()
cmd1="color"
cmd2=GraphicsWindow.GetRandomColor()
Toitle()
cmd1="size"
cmd2=Math.GetRandomNumber(10)
Toitle()
For loop2=1 to Math.GetRandomNumber(6)
cmd1="turn"
cmd2=Math.GetRandomNumber(360)
Toitle()
cmd1="move"
cmd2=Math.GetRandomNumber(1000)
Toitle()
endfor
endfor
Program.Delay(15000)
Goto beginloop

'----------------------------------------------
' Main Turtle function.
'----------------------------------------------


Sub Toitle
'cmd1=command (input)
'cmd2=param1 (input)
'cmd3=param2 (input)
If (cmd1="init") then
sy=GraphicsWindow.Height
sx=GraphicsWindow.Width
x0=0
y0=0
x1=sx/2
y1=sy/2
px=x1
py=y1
p=1
angle=180
col="blue"
speed=100
siz=1
ts=1
DrawTurtle()
elseif (cmd1="penup") then
p=0
elseif (cmd1="pendown") then
p=1
elseif (cmd1="move") then
'forward
x0=x1
y0=y1
x1=x0+cmd2*Math.Sin(Math.GetRadians(angle))
y1=y0+cmd2*Math.Cos(Math.GetRadians(angle))
draw()
elseif (cmd1="moveto") then
x0=x1
y0=y1
x1=cmd2
y1=cmd3
draw()
elseif (cmd1="turn") then
angle=cmd2
DrawTurtle()
elseif (cmd1="turnleft") then
angle=angle+cmd2
DrawTurtle()
elseif (cmd1="turnright") then
angle=angle-cmd2
DrawTurtle()
elseif (cmd1="color") then
col=cmd2
DrawTurtle()
elseif (cmd1="size") then
siz=math.Max(1,cmd2)
siz=math.Min(10,siz)
DrawTurtle()
elseif (cmd1="speed") then
speed=cmd2
speed=Math.Max(0,speed)
speed=Math.Min(100,speed)
elseif (cmd1="show") then
ts=1
elseif (cmd1="hide") then
ts=0
endif

If (ts=1) then
MoveTurtle()
ShowTurtle()
Else
HideTurtle()
endif
endsub

'Draw
Sub Draw
If (p>0) then
If (x0<>x1 or y0<>y1) then
m=math.Max(math.Abs(x1-x0),math.Abs(y1-y0))
map_var["mx1"]=0
map_var["mx3"]=m
For i=0 To m
map_var["my1"]=x0
map_var["my3"]=x1
map_var["mx2"]=i
map()
px=map_var["my2"]
map_var["my1"]=y0
map_var["my3"]=y1
map_var["mx2"]=i
map()
py=map_var["my2"]
RemBugFix()
px=Math.Remainder(px,sx)
py=Math.Remainder(py,sy)
GraphicsWindow.BrushColor=col
GraphicsWindow.FillEllipse(px,py,siz,siz)
MoveTurtle()
If (speed<100) then
Program.Delay(100-speed)
endif
EndFor
endif
endif

'These really need to be Mod
'Seems buggy - doesn't work with negative number?
RemBugFix2()
x1=Math.Remainder(x1,sx)
y1=Math.Remainder(y1,sy)
angle=Math.Remainder(angle,360)

endsub

'----------------------------------------------
'map function
'----------------------------------------------
Sub map
'x1-x2-x3 y1-y2-y3
'(x2-x1)/(x3-x1)=(y2-y1)/(y3-y1)
'y1+(y3-y1)*(x2-x1)/(x3-x1)=y2
map_var["my2"]=((map_var["my3"]-map_var["my1"])*(map_var["mx2"]-map_var["mx1"])/(map_var["mx3"]-map_var["mx1"]))+map_var["my1"]
EndSub


'----------------------------------------------
'Turtle Operations - Could've been Shape Operation had Rotate Triangle not buggy
'----------------------------------------------
Sub DrawTurtle
'Sets size, color, and rotation of Turtle
Shapes.Remove(TT) 'Nothing happens if you remove empty shape. Good!
DrawTurtle_local["tx1"]=(10+siz)*Math.Sin(Math.GetRadians(angle))
DrawTurtle_local["ty1"]=(10+siz)*Math.Cos(Math.GetRadians(angle))
DrawTurtle_local["tx2"]=(10+siz)*Math.Sin(Math.GetRadians(angle+140))
DrawTurtle_local["ty2"]=(10+siz)*Math.Cos(Math.GetRadians(angle+140))
DrawTurtle_local["tx3"]=(10+siz)*Math.Sin(Math.GetRadians(angle+220))
DrawTurtle_local["ty3"]=(10+siz)*Math.Cos(Math.GetRadians(angle+220))
GraphicsWindow.BrushColor=col
TT=Shapes.AddTriangle(DrawTurtle_local["tx1"],DrawTurtle_local["ty1"],DrawTurtle_local["tx2"],DrawTurtle_local["ty2"],DrawTurtle_local["tx3"],DrawTurtle_local["ty3"])
endsub

Sub MoveTurtle
'Move the turtle
Shapes.Move(TT,px+(siz/2),py+(siz/2))
endsub

Sub ShowTurtle
Shapes.ShowShape(TT)
endsub

Sub HideTurtle
Shapes.HideShape(TT)
endsub
'----------------------------------------------
' Various bug fix
'----------------------------------------------

Sub RemBugFix
While (px<0)
px=px+sx
EndWhile
While (py<0)
py=py+sy
EndWhile
endsub
Sub RemBugFix2
While (x1<0)
x1=x1+sx
EndWhile
While (y1<0)
y1=y1+sy
EndWhile
While (angle<0)
angle=angle+360
EndWhile
endsub

No comments: