Microsoft Small Basic

Program Listing: JPH449
' Frustration 0.1a
' Small Basic version written by Nonki Takahashi.
'
' History:
' 0.1a 2014-06-09 Created as alpha version. ()
'
GraphicsWindow.Title = "Frustration 0.1a"
gw = 598
gh = 428
GraphicsWindow.Width = gw
GraphicsWindow.Height = gh
DrawBoard()
DumpBoard()
Sub DrawBoard
color = "1=ForestGreen;2=Gold;3=MediumBlue;4=Crimson;"
init = "1=g;2=y;3=b;4=r;"
GraphicsWindow.BrushColor = "Gray"
rBoard = 190
x = gw / 2 - rBoard
y = gh / 2 - rBoard
GraphicsWindow.FillEllipse(x, y, rBoard * 2, rBoard * 2)
x0 = gw / 2
y0 = gh / 2
For i = 1 To 4
GraphicsWindow.PenWidth = 40
GraphicsWindow.PenColor = color[i]
param["a1"] = (2 + i) * 90 - 45
param["a2"] = (2 + i) * 90 + 45
param["x"] = x0
param["y"] = y0
param["r"] = rBoard * 0.75
param["da"] = 5
DrawArc()
sin = Math.Sin((i - 1) * Math.Pi / 2)
cos = Math.Cos((i - 1) * Math.Pi / 2)
x1 = x0 + rBoard * 0.7 * sin
y1 = y0 - rBoard * 0.7 * cos
GraphicsWindow.DrawLine(x0, y0, x1, y1)
EndFor
For i = 1 To 4
DrawQuarter()
EndFor
GraphicsWindow.PenWidth = 5
GraphicsWindow.PenColor = "LightGray"
GraphicsWindow.BrushColor = "Black"
param="x="+ (x0 - 40) + ";y="+ (y0 - 40) +";width=80;height=80;border-radius=20;"
FillRoundRectangle()
DrawRoundRectangle()
param="x="+ (x0 - 20) + ";y="+ (y0 - 20) +";width=40;height=40;border-radius=10;"
GraphicsWindow.BrushColor = "White"
FillRoundRectangle()
GraphicsWindow.BrushColor = "Black"
GraphicsWindow.FontName = "Courier New"
GraphicsWindow.FontSize = 20
dice = Shapes.AddText(1)
Shapes.Move(dice, x0 - 6, y0 - 10)
GraphicsWindow.BrushColor = "White"
GraphicsWindow.PenWidth = 0
dome = Shapes.AddEllipse(70, 70)
Shapes.SetOpacity(dome, 20)
Shapes.Move(dome, x0 - 35, y0 - 35)
EndSub
Sub DrawQuarter
' param i
sin = Math.Sin((i - 1) * Math.Pi / 2)
cos = Math.Cos((i - 1) * Math.Pi / 2)
rPiece = 10
x = x0 + (rBoard - rPiece * 1.7) * sin
y = y0 - (rBoard - rPiece * 1.7) * cos
GraphicsWindow.BrushColor = color[i]
GraphicsWindow.PenWidth = 2
GraphicsWindow.PenColor = "LightGray"
For j = 1 To 4
xj = x + (j - 2.5) * rPiece * 2.2 * cos - rPiece
yj = y + (j - 2.5) * rPiece * 2.2 * sin - rPiece
GraphicsWindow.FillEllipse(xj, yj, rPiece * 2, rPiece * 2)
GraphicsWindow.DrawEllipse(xj, yj, rPiece * 2, rPiece * 2)
board[j + (i - 1) * 15]["x"] = xj
board[j + (i - 1) * 15]["y"] = yj
EndFor
For j = 1 To 7
sinj = Math.Sin((i - 1 + (j - 0.5) / 7) * Math.Pi / 2)
cosj = Math.Cos((i - 1 + (j - 0.5) / 7) * Math.Pi / 2)
xj = x0 + (rBoard * 0.75 * sinj) - rPiece
yj = y0 - (rBoard * 0.75 * cosj) - rPiece
If j = 1 Then
GraphicsWindow.BrushColor = "Black"
Else
GraphicsWindow.BrushColor = "#80FFFFFF"
EndIf
GraphicsWindow.FillEllipse(xj, yj, rPiece * 2, rPiece * 2)
GraphicsWindow.DrawEllipse(xj, yj, rPiece * 2, rPiece * 2)
board[j + 4 + (i - 1) * 15]["x"] = xj
board[j + 4 + (i - 1) * 15]["y"] = yj
EndFor
GraphicsWindow.BrushColor = "Black"
For j = 1 To 4
xj = x0 + (rBoard * (0.18 + j / 4 * 0.46) * sin) - rPiece
yj = y0 - (rBoard * (0.18 + j / 4 * 0.46) * cos) - rPiece
GraphicsWindow.FillEllipse(xj, yj, rPiece * 2, rPiece * 2)
GraphicsWindow.DrawEllipse(xj, yj, rPiece * 2, rPiece * 2)
board[(5 - j) + 11 + (i - 1) * 15]["x"] = xj
board[(5 - j) + 11 + (i - 1) * 15]["y"] = yj
EndFor
EndSub
Sub DrawRoundRectangle
' JMN410
Stack.PushValue("local", param)
Stack.PushValue("local", local)
local = param
param = ""
param["r"] = local["border-radius"]
If (local["width"] / 2 < param["r"]) Or (local["height"] / 2 < param["r"]) Then
param["r"] = Math.Min(local["width"] / 2, local["height"] / 2)
EndIf
param["da"] = 5
param["x"] = local["x"] + param["r"]
param["y"] = local["y"] + param["r"]
param["a1"] = 180
param["a2"] = 270
DrawArc()
GraphicsWindow.DrawLine(local["x"] + param["r"], local["y"], local["x"] + local["width"] - param["r"], local["y"])
param["x"] = local["x"] + local["width"] - param["r"]
param["y"] = local["y"] + param["r"]
param["a1"] = 270
param["a2"] = 360
DrawArc()
GraphicsWindow.DrawLine(local["x"] + local["width"], local["y"] + param["r"], local["x"] + local["width"], local["y"] + local["height"] - param["r"])
param["x"] = local["x"] + local["width"] - param["r"]
param["y"] = local["y"] + local["height"] - param["r"]
param["a1"] = 0
param["a2"] = 90
DrawArc()
GraphicsWindow.DrawLine(local["x"] + param["r"], local["y"] + local["height"], local["x"] + local["width"] - param["r"], local["y"] + local["height"])
param["x"] = local["x"] + param["r"]
param["y"] = local["y"] + local["height"] - param["r"]
param["a1"] = 90
param["a2"] = 180
DrawArc()
GraphicsWindow.DrawLine(local["x"], local["y"] + param["r"], local["x"], local["y"] + local["height"] - param["r"])
local = Stack.PopValue("local")
param = Stack.PopValue("local")
EndSub
Sub DumpBoard
n = Array.GetItemCount(board)
For i = 1 To n
GraphicsWindow.DrawText(board[i]["x"], board[i]["y"], i)
EndFor
EndSub
Sub FillRoundRectangle
Stack.PushValue("local", param)
If (param["width"] / 2 < param["border-radius"]) Or (param["height"] / 2 < param["border-radius"]) Then
param["border-radius"] = Math.Min(param["width"] / 2, param["height"] / 2)
EndIf
GraphicsWindow.FillEllipse(param["x"], param["y"], param["border-radius"] * 2, param["border-radius"] * 2)
GraphicsWindow.FillRectangle(param["x"] + param["border-radius"], param["y"], param["width"] - param["border-radius"] * 2, param["height"])
GraphicsWindow.FillEllipse(param["x"] + param["width"] - param["border-radius"] * 2, param["y"], param["border-radius"] * 2, param["border-radius"] * 2)
GraphicsWindow.FillRectangle(param["x"], param["y"] + param["border-radius"], param["width"], param["height"] - param["border-radius"] * 2)
GraphicsWindow.FillEllipse(param["x"], param["y"] + param["height"] - param["border-radius"] * 2, param["border-radius"] * 2, param["border-radius"] * 2)
GraphicsWindow.FillEllipse(param["x"] + param["width"] - param["border-radius"] * 2, param["y"] + param["height"] - param["border-radius"] * 2, param["border-radius"] * 2, param["border-radius"] * 2)
param = Stack.PopValue("local")
EndSub
Sub DrawArc
' param x, y - center of arc
' param r - radius of arc
' param a1, a2 - start and end angle
Stack.PushValue("local", param)
Stack.PushValue("local", local)
Stack.PushValue("local", a)
local = param
param = ""
local["pw"] = GraphicsWindow.PenWidth
local["pc"] = GraphicsWindow.PenColor
local["bc"] = GraphicsWindow.BrushColor
GraphicsWindow.BrushColor = local["pc"]
local["r1"] = local["r"] - local["pw"] / 2
local["r2"] = local["r"] + local["pw"] / 2
For a = local["a1"] To local["a2"] Step local["da"]
local["rad"] = Math.GetRadians(a)
param["x1"] = local["x"] + local["r1"] * Math.Cos(local["rad"])
param["y1"] = local["y"] + local["r1"] * Math.Sin(local["rad"])
param["x2"] = local["x"] + local["r2"] * Math.Cos(local["rad"])
param["y2"] = local["y"] + local["r2"] * Math.Sin(local["rad"])
If local["a1"] < a Then
FillQuadrangle()
EndIf
param["x4"] = param["x1"]
param["y4"] = param["y1"]
param["x3"] = param["x2"]
param["y3"] = param["y2"]
EndFor
GraphicsWindow.BrushColor = local["bc"]
a = Stack.PopValue("local")
local = Stack.PopValue("local")
param = Stack.PopValue("local")
EndSub
Sub FillQuadrangle
' param x1, y1, x2, y2, x3, y3, x4, y4 - edges
GraphicsWindow.FillTriangle(param["x1"], param["y1"], param["x2"], param["y2"], param["x3"], param["y3"])
GraphicsWindow.FillTriangle(param["x3"], param["y3"], param["x4"], param["y4"], param["x1"], param["y1"])
EndSub