Microsoft Small Basic

Program Listing: TDL115
' Faces
' Version 0.1
' Copyright © 2018 Nonki Takahashi. The MIT License.
' Last update 2018-01-25

GraphicsWindow.Title = "Faces 0.1"
Init()
While "True"
param = aspect[Math.GetRandomNumber(Array.GetItemCount(aspect))]
param["face"] = face[Math.GetRandomNumber(Array.GetItemCount(face))]
param["color"] = color[Math.GetRandomNumber(Array.GetItemCount(color))]
param["eye"] = eye[Math.GetRandomNumber(Array.GetItemCount(eye))]
param["eyecolor"] = eyecolor[Math.GetRandomNumber(Array.GetItemCount(eyecolor))]
param["eyebrow"] = eyebrow[Math.GetRandomNumber(Array.GetItemCount(eyebrow))]
param["nose"] = nose[Math.GetRandomNumber(Array.GetItemCount(nose))]
param["mouth"] = mouth[Math.GetRandomNumber(Array.GetItemCount(mouth))]
param["haircolor"] = haircolor[Math.GetRandomNumber(Array.GetItemCount(haircolor))]
AddFace()
For θ = 0 To 360
_θ = Math.GetRadians(θ)
a = 10 * Math.Sin(_θ)
k = 1 + 0.3 * Math.Sin(3 * _θ)
Shapes.Rotate(obj[4], -a)
Shapes.Rotate(obj[5], a)
Shapes.Rotate(obj[8], -a)
Shapes.Rotate(obj[9], a)
Shapes.Zoom(obj[11], 1, k)
Program.Delay(10)
EndFor
RemoveFace()
EndWhile

Sub AddFace
GraphicsWindow.BrushColor = param["color"]
If param["color"] = "Black" Then
GraphicsWindow.PenColor = "Gray"
Else
GraphicsWindow.PenColor = "Black"
EndIf
GraphicsWindow.PenWidth = 5
n = 0
' ears
n = n + 1
width = param["width"] / 6
height = param["height"] / 4
obj[n] = Shapes.AddEllipse(width, height)
obj[n + 1] = Shapes.AddEllipse(width, height)
gap = param["width"]
x = gw / 2 - gap / 2 - width / 2
y = (gh - height) / 2
Shapes.Move(obj[n], x, y)
x = gw / 2 + gap / 2 - width / 2
Shapes.Move(obj[n + 1], x, y)
' face
n = n + 2
If param["face"] = "Rectangle" Then
obj[n] = Shapes.AddRectangle(param["width"], param["height"])
Else
obj[n] = Shapes.AddEllipse(param["width"], param["height"])
EndIf
x = (gw - param["width"]) / 2
y = (gh - param["height"]) / 2
Shapes.Move(obj[n], x, y)
' eyes
n = n + 1
GraphicsWindow.BrushColor = "White"
width = param["width"] / 4
height = param["height"] / 10
If param["eye"] = "Rectangle" Then
obj[n] = Shapes.AddRectangle(width, height)
obj[n + 1] = Shapes.AddRectangle(width, height)
ElseIf param["eye"] = "Ellipse" Then
obj[n] = Shapes.AddEllipse(width, height)
obj[n + 1] = Shapes.AddEllipse(width, height)
ElseIf param["eye"] = "Triangle" Then
obj[n] = Shapes.AddTriangle(width / 2, 0, 0, height, width, height)
obj[n + 1] = Shapes.AddTriangle(width / 2, 0, 0, height, width, height)
Else
obj[n] = Shapes.AddLine(0, 0, width, 0)
obj[n + 1] = Shapes.AddLine(0, 0, width, 0)
height = 0
EndIf
gap = param["width"] / 2
x = gw / 2 - gap / 2 - width / 2
y = (gh - height) * 0.45
Shapes.Move(obj[n], x, y)
x = gw / 2 + gap / 2 - width / 2
Shapes.Move(obj[n + 1], x, y)
If 0 < height Then
If param["eye"] = "Triangle" Then
y = y + 7
Else
y = y + 5
EndIf
height = height - 10
Stack.PushValue("local", GraphicsWindow.PenColor)
Stack.PushValue("local", GraphicsWindow.PenWidth)
GraphicsWindow.PenColor = param["eyecolor"]
GraphicsWindow.PenWidth = height / 3
GraphicsWindow.BrushColor = "Black"
obj[n + 2] = Shapes.AddEllipse(height, height)
obj[n + 3] = Shapes.AddEllipse(height, height)
x = gw / 2 - gap / 2 - height / 2
Shapes.Move(obj[n + 2], x, y)
x = gw / 2 + gap / 2 - height / 2
Shapes.Move(obj[n + 3], x, y)
GraphicsWindow.PenWidth = Stack.PopValue("local")
GraphicsWindow.PenColor = Stack.PopValue("local")
EndIf
' eyebrows
n = n + 4
GraphicsWindow.PenWidth = 0
GraphicsWindow.BrushColor = param["haircolor"]
width = param["width"] / 4
height = param["height"] / 20
If param["eyebrow"] = "Rectangle" Then
obj[n] = Shapes.AddRectangle(width, height)
obj[n + 1] = Shapes.AddRectangle(width, height)
ElseIf param["eyebrow"] = "Ellipse" Then
obj[n] = Shapes.AddEllipse(width, height)
obj[n + 1] = Shapes.AddEllipse(width, height)
ElseIf param["eyebrow"] = "Triangle" Then
obj[n] = Shapes.AddTriangle(width / 2, 0, 0, height, width, height)
obj[n + 1] = Shapes.AddTriangle(width / 2, 0, 0, height, width, height)
Else
GraphicsWindow.PenWidth = 5
Stack.PushValue("local", GraphicsWindow.PenColor)
GraphicsWindow.PenColor = param["haircolor"]
obj[n] = Shapes.AddLine(0, 0, width, 0)
obj[n + 1] = Shapes.AddLine(0, 0, width, 0)
GraphicsWindow.PenColor = Stack.PopValue("local")
height = 0
EndIf
gap = param["width"] / 2
x = gw / 2 - gap / 2 - width / 2
y = (gh - height) * 0.38
Shapes.Move(obj[n], x, y)
x = gw / 2 + gap / 2 - width / 2
Shapes.Move(obj[n + 1], x, y)
' nose
n = n + 2
GraphicsWindow.PenWidth = 5
GraphicsWindow.BrushColor = param["color"]
width = param["width"] / 6
height = param["height"] / 4
If param["nose"] = "Rectangle" Then
obj[n] = Shapes.AddRectangle(width, height)
ElseIf param["nose"] = "Ellipse" Then
obj[n] = Shapes.AddEllipse(width, height)
ElseIf param["nose"] = "Triangle" Then
obj[n] = Shapes.AddTriangle(width / 2, 0, 0, height, width, height)
Else
obj[n] = Shapes.AddLine(0, 0, 0, height)
width = 0
EndIf
x = (gw - width) / 2
y = (gh - height) * 0.53
Shapes.Move(obj[n], x, y)
' mouth
n = n + 1
width = param["width"] / 3
height = param["height"] / 10
GraphicsWindow.BrushColor = "White"
If param["color"] = "Black" Then
GraphicsWindow.PenColor = "Gray"
EndIf
If param["mouth"] = "Rectangle" Then
obj[n] = Shapes.AddRectangle(width, height)
ElseIf param["mouth"] = "Ellipse" Then
obj[n] = Shapes.AddEllipse(width, height)
ElseIf param["mouth"] = "Triangle" Then
obj[n] = Shapes.AddTriangle(width / 2, height, 0, 0, width, 0)
EndIf
x = (gw - width) / 2
y = (gh - height) * 0.7
Shapes.Move(obj[n], x, y)
' hair
GraphicsWindow.PenWidth = 0
GraphicsWindow.BrushColor = param["haircolor"]
width = param["width"] / 5
height = width
ox = gw / 2
oy = gh / 2
rx = param["width"] / 2
ry = param["height"] / 2
If param["face"] = "Rectangle" Then
y = oy - ry
For x = ox To ox + rx Step width * 0.7
AddHair()
EndFor
For x = ox - width * 0.7 To ox - rx Step -width * 0.7
AddHair()
EndFor
Else
For θ = 0 To 72 Step 12
_θ = Math.GetRadians(θ)
x = ox + rx * Math.Sin(_θ)
y = oy - ry * Math.Cos(_θ)
AddHair()
EndFor
For θ = -12 To -72 Step -12
_θ = Math.GetRadians(θ)
x = ox + rx * Math.Sin(_θ)
y = oy - ry * Math.Cos(_θ)
AddHair()
EndFor
EndIf
EndSub

Sub AddHair
n = n + 1
obj[n] = Shapes.AddEllipse(width, height)
Shapes.Move(obj[n], x - width / 2, y - height / 2)
n = n + 1
obj[n] = Shapes.AddTriangle(width / 2, height, 0, 0, width, 0)
Shapes.Move(obj[n], x - width / 2, y)
EndSub

Sub Init
gw = 598
gh = 428
GraphicsWindow.Width = gw
GraphicsWindow.Height = gh
GraphicsWindow.BackgroundColor = "DimGray"
face = "1=Rectangle;2=Ellipse;"
color = "1=Black;2=White;3=Khaki;4=PeachPuff;5=Peru;"
aspect[1] = "width=200;height=300;"
aspect[2] = "width=250;height=300;"
aspect[3] = "width=300;height=300;"
eye = "1=Rectangle;2=Ellipse;3=Triangle;4=Line;"
eyebrow = "1=Rectangle;2=Ellipse;3=Triangle;4=Line;"
eyecolor = "1=Black;2=Brown;3=Cyan;4=Green;5=Gray;"
nose = "1=Rectangle;2=Ellipse;3=Triangle;4=Line;"
mouth = "1=Rectangle;2=Ellipse;3=Triangle;"
haircolor = "1=DarkRed;2=SaddleBrown;3=LightGray;4=#333333;"
EndSub

Sub RemoveFace
For i = 1 To n
Shapes.Remove(obj[i])
EndFor
EndSub