Microsoft Small Basic

Program Listing:
Embed this in your website
' 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
Copyright (c) Microsoft Corporation. All rights reserved.