Microsoft Small Basic

Program Listing: FVD421
' DoubutsuShogi v0.2 - Copyright (c) 2011 Nonki Takahashi
'
' History
' 2010/01/25 v0.1 Created (440 lines)
' 2010/02/03 v0.2 Created GameRecord_ class (595 lines)
'
' Reference
' [1] 北岡, 藤田: "どうぶつしょうぎのほん", 2010, 幻冬舎エデュケーション
' (Kitaoka, Fujita: "Doubutsu Shogi No Hon", 2010, Gentosha Education)
'
' Naming convention
' class Xxx_
' label lXxx
' constant XXX
' variable type integer iXxx
' variable type real rXxx
' variable type string sXxx
' variable type url uXxx
' variable type char cXxx
' variable type boolean bXxx
' variable type object oXxx
'
' Constant
SPACE = 0
CHICK1 = 1
CHICKEN1 = 2
ELEPHANT1 = 3
GIRAFFE1 = 4
LION1 = 5
CHICK2 = 6
CHICKEN2 = 7
ELEPHANT2 = 8
GIRAFFE2 = 9
LION2 = 10
TOP = 1
TOPRIGHT = 2
RIGHT = 3
BOTTOMRIGHT = 4
BOTTOM = 5
BOTTOMLEFT = 6
LEFT = 7
TOPLEFT = 8
FOREST = 1
SKY = 2
VERSION = 0.2
'
' Main
GraphicsWindow.Height = 540
GraphicsWindow.Width = 680
Board_Init()
Console_Init()
GameRecord_Init()
Board_New()
Board_Draw()
GameRecord_Draw()
Debug_Move()
'
Sub GameRecord_Draw
For iRec = 1 To GameRecord_iNum
sTo = Board_sX[GameRecord_iToX[iRec]] + Board_sY[GameRecord_iToY[iRec]]
iPiece = GameRecord_iPiece[iRec]
GameRecord_DrawLine()
EndFor
EndSub
'
Sub GameRecord_Init
sPiece[LION1] = "ライオン"
sPiece[ELEPHANT1] = "ぞう"
sPiece[GIRAFFE1] = "きりん"
sPiece[CHICKEN1] = "ニワトリ"
sPiece[CHICK1] = "ひよこ"
sPiece[LION2] = "ライオン"
sPiece[ELEPHANT2] = "ぞう"
sPiece[GIRAFFE2] = "きりん"
sPiece[CHICKEN2] = "ニワトリ"
sPiece[CHICK2] = "ひよこ"
GameRecord_iNum = 0
EndSub
'
Sub GameRecord_DrawLine
If Math.Remainder(iRec, 2) = FOREST Then
GraphicsWindow.BrushColor = "LawnGreen"
Else
GraphicsWindow.BrushColor = "PowderBlue"
EndIf
GraphicsWindow.FillEllipse(iX1 + idX * 1.6 - 4, iY0 + (iRec - 1) * 30 + 2, 24, 24)
GraphicsWindow.BrushColor = "Black"
GraphicsWindow.DrawText(iX1 + idX * 1.6, iY0 + (iRec - 1) * 30, iRec + " " + sTo + " " + sPiece[iPiece])
EndSub
'
Sub Debug_Move
Program.Delay(300)
iTurn = FOREST
iPiece = CHICK1
iToX = 2 ' 上へ
iToY = 2
Board_Move()
GameRecord_Move()
Program.Delay(300)
iTurn = SKY
iPiece = ELEPHANT2
iToX = 2 ' 下へ
iToY = 2
Board_Move()
GameRecord_Move()
Program.Delay(300)
iTurn = FOREST
iPiece = LION1
iToX = 2 ' 上へ
iToY = 3
Board_Move()
GameRecord_Move()
Program.Delay(300)
iTurn = SKY
iPiece = GIRAFFE2
iToX = 1 ' 下へ
iToY = 2
Board_Move()
GameRecord_Move()
Goto lSkip
Program.Delay(300)
iTurn = FOREST
iPiece = CHICK1
iToX = 1 ' 持ち駒から
iToY = 3
Board_Move()
GameRecord_Move()
lSkip:
EndSub
'
Sub GameRecord_Move
iRec = GameRecord_iNum + 1
GameRecord_iPiece[iRec] = iPiece
GameRecord_iToX[iRec] = iToX
GameRecord_iToY[iRec] = iToY
GameRecord_iNum = iRec
sTo = Board_sX[iToX] + Board_sY[iToY]
GameRecord_DrawLine()
EndSub
'
Sub Console_Init
sTitle[1] = "ど"
sTitle[2] = "う"
sTitle[3] = "ぶ"
sTitle[4] = "つ"
sTitle[5] = "し"
sTitle[6] = "ょ"
sTitle[7] = "う"
sTitle[8] = "ぎ"
sColor[1] = "Red"
sColor[2] = "Gold"
sColor[3] = "Blue"
sColor[4] = "Orange"
sColor[5] = "DeepPink"
sColor[6] = "DeepSkyblue"
sColor[7] = "Purple"
sColor[8] = "SeaGreen"
GraphicsWindow.FontSize = 30
For i = 1 To 8
GraphicsWindow.BrushColor = sColor[i]
GraphicsWindow.DrawText(iX0 + (i - 1) * 38, iY0 - idY * 4 / 5, sTitle[i])
EndFor
GraphicsWindow.BrushColor = "Black"
GraphicsWindow.FontSize = 20
GraphicsWindow.DrawText(iX1 + idX, iY0 -idY * 4 / 5, "バージョン " + VERSION)
EndSub
'
Sub Sound_LionMarch
For i = 1 To 1
Sound.PlayMusic("O4 G2 G4 A4 G2 E2 C2 D2 E1 F2 F4 F4 E2 E4 E4 D4 D4 D4 D4 G1 A4 A4 A4 A4 G4 G4 G4 G4 F2 O3 B2 O4 C1")
EndFor
EndSub
'
Sub Board_Init
iX0 = 50
iY0 = 100
idX = 100
idY = 100
isX = 10
isY = 10
iX1 = iX0 + idX * 3
iY1 = iY0 + idY * 4
sBoard = "http://homepage2.nifty.com/nobukit/smallbasic.files/Board300.png"
Board_sX[1] = "A"
Board_sX[2] = "B"
Board_sX[3] = "C"
Board_sY[1] = "1"
Board_sY[2] = "2"
Board_sY[3] = "3"
Board_sY[4] = "4"
uCell[1][1] = "http://homepage2.nifty.com/nobukit/smallbasic.files/A1.png"
uCell[2][1] = "http://homepage2.nifty.com/nobukit/smallbasic.files/B1.png"
uCell[3][1] = "http://homepage2.nifty.com/nobukit/smallbasic.files/C1.png"
uCell[1][2] = "http://homepage2.nifty.com/nobukit/smallbasic.files/A2.png"
uCell[2][2] = "http://homepage2.nifty.com/nobukit/smallbasic.files/B2.png"
uCell[3][2] = "http://homepage2.nifty.com/nobukit/smallbasic.files/C2.png"
uCell[1][3] = "http://homepage2.nifty.com/nobukit/smallbasic.files/A3.png"
uCell[2][3] = "http://homepage2.nifty.com/nobukit/smallbasic.files/B3.png"
uCell[3][3] = "http://homepage2.nifty.com/nobukit/smallbasic.files/C3.png"
uCell[1][4] = "http://homepage2.nifty.com/nobukit/smallbasic.files/A4.png"
uCell[2][4] = "http://homepage2.nifty.com/nobukit/smallbasic.files/B4.png"
uCell[3][4] = "http://homepage2.nifty.com/nobukit/smallbasic.files/C4.png"
'
uPiece[LION1] = "http://homepage2.nifty.com/nobukit/smallbasic.files/Lion1t.png"
uPiece[GIRAFFE1] = "http://homepage2.nifty.com/nobukit/smallbasic.files/Giraffe1t.png"
uPiece[ELEPHANT1] = "http://homepage2.nifty.com/nobukit/smallbasic.files/Elephant1t.png"
uPiece[CHICK1] = "http://homepage2.nifty.com/nobukit/smallbasic.files/Chick1t.png"
uPiece[CHICKEN1] = "http://homepage2.nifty.com/nobukit/smallbasic.files/Chicken1t.png"
uPiece[LION2] = "http://homepage2.nifty.com/nobukit/smallbasic.files/Lion2t.png"
uPiece[GIRAFFE2] = "http://homepage2.nifty.com/nobukit/smallbasic.files/Giraffe2t.png"
uPiece[ELEPHANT2] = "http://homepage2.nifty.com/nobukit/smallbasic.files/Elephant2t.png"
uPiece[CHICK2] = "http://homepage2.nifty.com/nobukit/smallbasic.files/Chick2t.png"
uPiece[CHICKEN2] = "http://homepage2.nifty.com/nobukit/smallbasic.files/Chicken2t.png"
'
iDirX[TOP] = 0
iDirY[TOP] = -1
iDirX[TOPRIGHT] = 1
iDirY[TOPRIGHT] = -1
iDirX[RIGHT] = 1
iDirY[RIGHT] = 0
iDirX[BOTTOMRIGHT] = 1
iDirY[BOTTOMRIGHT] = 1
iDirX[BOTTOM] = 0
iDirY[BOTTOM] = 1
iDirX[BOTTOMLEFT] = -1
iDirY[BOTTOMLEFT] = 1
iDirX[LEFT] = -1
iDirY[LEFT] = 0
iDirX[TOPLEFT] = -1
iDirY[TOPLEFT] = -1
'
bCanMove[LION1][TOP] = "True"
bCanMove[LION1][TOPRIGHT] = "True"
bCanMove[LION1][RIGHT] = "True"
bCanMove[LION1][BOTTOMRIGHT] = "True"
bCanMove[LION1][BOTTOM] = "True"
bCanMove[LION1][BOTTOMLEFT] = "True"
bCanMove[LION1][LEFT] = "True"
bCanMove[LION1][TOPLEFT] = "True"
bCanMove[GIRAFFE1][TOP] = "True"
bCanMove[GIRAFFE1][TOPRIGHT] = "False"
bCanMove[GIRAFFE1][RIGHT] = "True"
bCanMove[GIRAFFE1][BOTTOMRIGHT] = "False"
bCanMove[GIRAFFE1][BOTTOM] = "True"
bCanMove[GIRAFFE1][BOTTOMLEFT] = "False"
bCanMove[GIRAFFE1][LEFT] = "True"
bCanMove[GIRAFFE1][TOPLEFT] = "False"
bCanMove[ELEPHANT1][TOP] = "False"
bCanMove[ELEPHANT1][TOPRIGHT] = "True"
bCanMove[ELEPHANT1][RIGHT] = "False"
bCanMove[ELEPHANT1][BOTTOMRIGHT] = "True"
bCanMove[ELEPHANT1][BOTTOM] = "False"
bCanMove[ELEPHANT1][BOTTOMLEFT] = "True"
bCanMove[ELEPHANT1][LEFT] = "False"
bCanMove[ELEPHANT1][TOPLEFT] = "True"
bCanMove[CHICKEN1][TOP] = "True"
bCanMove[CHICKEN1][TOPRIGHT] = "True"
bCanMove[CHICKEN1][RIGHT] = "True"
bCanMove[CHICKEN1][BOTTOMRIGHT] = "False"
bCanMove[CHICKEN1][BOTTOM] = "True"
bCanMove[CHICKEN1][BOTTOMLEFT] = "False"
bCanMove[CHICKEN1][LEFT] = "True"
bCanMove[CHICKEN1][TOPLEFT] = "True"
bCanMove[CHICK1][TOP] = "True"
bCanMove[CHICK1][TOPRIGHT] = "False"
bCanMove[CHICK1][RIGHT] = "False"
bCanMove[CHICK1][BOTTOMRIGHT] = "False"
bCanMove[CHICK1][BOTTOM] = "False"
bCanMove[CHICK1][BOTTOMLEFT] = "False"
bCanMove[CHICK1][LEFT] = "False"
bCanMove[CHICK1][TOPLEFT] = "False"
bCanMove[LION2][TOP] = "True"
bCanMove[LION2][TOPRIGHT] = "True"
bCanMove[LION2][RIGHT] = "True"
bCanMove[LION2][BOTTOMRIGHT] = "True"
bCanMove[LION2][BOTTOM] = "True"
bCanMove[LION2][BOTTOMLEFT] = "True"
bCanMove[LION2][LEFT] = "True"
bCanMove[LION2][TOPLEFT] = "True"
bCanMove[GIRAFFE2][TOP] = "True"
bCanMove[GIRAFFE2][TOPRIGHT] = "False"
bCanMove[GIRAFFE2][RIGHT] = "True"
bCanMove[GIRAFFE2][BOTTOMRIGHT] = "False"
bCanMove[GIRAFFE2][BOTTOM] = "True"
bCanMove[GIRAFFE2][BOTTOMLEFT] = "False"
bCanMove[GIRAFFE2][LEFT] = "True"
bCanMove[GIRAFFE2][TOPLEFT] = "False"
bCanMove[ELEPHANT2][TOP] = "False"
bCanMove[ELEPHANT2][TOPRIGHT] = "True"
bCanMove[ELEPHANT2][RIGHT] = "False"
bCanMove[ELEPHANT2][RIGHT] = "False"
bCanMove[ELEPHANT2][BOTTOM] = "False"
bCanMove[ELEPHANT2][BOTTOMLEFT] = "True"
bCanMove[ELEPHANT2][LEFT] = "False"
bCanMove[ELEPHANT2][TOPLEFT] = "True"
bCanMove[CHICKEN2][TOP] = "True"
bCanMove[CHICKEN2][TOPRIGHT] = "False"
bCanMove[CHICKEN2][RIGHT] = "True"
bCanMove[CHICKEN2][BOTTOMRIGHT] = "True"
bCanMove[CHICKEN2][BOTTOM] = "True"
bCanMove[CHICKEN2][BOTTOMLEFT] = "True"
bCanMove[CHICKEN2][LEFT] = "True"
bCanMove[CHICKEN2][TOPLEFT] = "False"
bCanMove[CHICK2][TOP] = "False"
bCanMove[CHICK2][TOPRIGHT] = "False"
bCanMove[CHICK2][RIGHT] = "False"
bCanMove[CHICK2][BOTTOMRIGHT] = "False"
bCanMove[CHICK2][BOTTOM] = "True"
bCanMove[CHICK2][BOTTOMLEFT] = "False"
bCanMove[CHICK2][LEFT] = "False"
bCanMove[CHICK2][TOPLEFT] = "False"
EndSub
'
Sub Board_New
GraphicsWindow.PenColor = "DarkOrange"
GraphicsWindow.BrushColor = "DarkOrange"
GraphicsWindow.PenWidth = 2
GraphicsWindow.FontSize = 20
GraphicsWindow.DrawImage(sBoard, iX0, iY0)
For i = 0 To 3
Dotted_iX0 = iX0 + i * idX
Dotted_iY0 = iY0
Dotted_iX1 = iX0 + i * idX
Dotted_iY1 = iY1
Dotted_Line()
If i > 0 Then
GraphicsWindow.DrawText(iX0 + i * idX - idX / 2 - 5, iY0 - idY / 3, Board_sX[i])
EndIf
EndFor
For i = 0 To 4
Dotted_iX0 = iX0
Dotted_iY0 = iY0 + i * idY
Dotted_iX1 = iX1
Dotted_iY1 = iY0 + i * idY
Dotted_Line()
If i > 0 Then
GraphicsWindow.DrawText(iX0 - idX / 4, iY0 + i * idY - idY / 2 - 10, Board_sY[i])
EndIf
EndFor
Board_iCell[1][1] = GIRAFFE2
Board_iCell[2][1] = LION2
Board_iCell[3][1] = ELEPHANT2
Board_iCell[1][2] = SPACE
Board_iCell[2][2] = CHICK2
Board_iCell[3][2] = SPACE
Board_iCell[1][3] = SPACE
Board_iCell[2][3] = CHICK1
Board_iCell[3][3] = SPACE
Board_iCell[1][4] = ELEPHANT1
Board_iCell[2][4] = LION1
Board_iCell[3][4] = GIRAFFE1
' Captured by SKY
Board_iNumCaptured[SKY] = 0
Board_iCaptured[SKY][1] = SPACE
Board_iCaptured[SKY][2] = SPACE
Board_iCaptured[SKY][3] = SPACE
Board_iCaptured[SKY][4] = SPACE
Board_iCaptured[SKY][5] = SPACE
Board_iCaptured[SKY][6] = SPACE
' Captured by FOREST
Board_iNumCaptured[FOREST] = 0
Board_iCaptured[FOREST][1] = SPACE
Board_iCaptured[FOREST][2] = SPACE
Board_iCaptured[FOREST][3] = SPACE
Board_iCaptured[FOREST][4] = SPACE
Board_iCaptured[FOREST][5] = SPACE
Board_iCaptured[FOREST][6] = SPACE
EndSub
'
Sub Board_Draw
For iY = 1 To 4
For iX = 1 To 3
Board_DrawCell()
EndFor
EndFor
For i = FOREST To SKY
For j = 1 To 6
Board_DrawCaptured()
EndFor
EndFor
EndSub
'
Sub Board_DrawCell
If Board_iCell[iX][iY] = SPACE Then
GraphicsWindow.DrawImage(uCell[iX][iY], iX0 + (iX - 1) * idX + 2, iY0 + (iY - 1) * idY + 2)
Else
GraphicsWindow.DrawImage(uPiece[Board_iCell[iX][iY]], iX0 + (iX - 1) * idX + isX, iY0 + (iY - 1) * idY + isY)
Sound.PlayClickAndWait()
EndIf
EndSub
'
Sub Board_DrawCaptured
If i = FOREST Then
iX = iX1 + (Math.Floor((j + 1) / 2) - 1) * idX / 2
iY = iY0 + idY * 3 + Math.Remainder(8 - j, 2) * idY / 2
Else ' i = SKY
iX = iX1 + (Math.Floor((j + 1) / 2) - 1) * idX / 2
iY = iY0 + Math.Remainder(j + 1, 2) * idY / 2
EndIf
If Board_iCaptured[i][j] = SPACE Then
GraphicsWindow.BrushColor = "White"
GraphicsWindow.FillRectangle(iX + 1, iY + 1, 48, 48)
Else
GraphicsWindow.DrawResizedImage(uPiece[Board_iCaptured[i][j]], iX + isX / 2, iY + isY / 2, 42, 42)
Sound.PlayClickAndWait()
EndIf
EndSub
'
Sub Board_FindPiece
bFound = "False"
For iY = 1 To 4
For iX = 1 To 3
If Board_iCell[iX][iY] = iPiece Then
bFound = "True"
iFromX = iX
iFromY = iY
Goto lFound
EndIf
EndFor
EndFor
For i = FOREST To SKY
For j = 1 To 6
If Board_iCaptured[i][j] = iPiece Then
bFound = "True"
iTurn = i
iSlot = j
Goto lFound
EndIf
EndFor
EndFor
lFound:
EndSub
'
Sub Board_Move
Board_FindPiece()
If iFromX < 1 Or iFromX > 3 Then
Goto lNotMatch
EndIf
If iToX < 1 Or iToX > 3 Then
Goto lNotMatch
EndIf
If iFromY < 1 Or iFromY > 4 Then
Goto lNotMatch
EndIf
If iToY < 1 Or iToY > 4 Then
Goto lNotMatch
EndIf
If Board_iCell[iFromX][iFromY] > (iTurn - 1) * 5 And Board_iCell[iFromX][iFromY] < 6 + (iTurn - 1) * 5 Then
For i = TOP To TOPLEFT
If iDirX[i] = iToX - iFromX And iDirY[i] = iToY - iFromY Then
If bCanMove[Board_iCell[iFromX][iFromY]][i] Then
Goto lMatch
EndIf
EndIf
EndFor
Sound.PlayChimeAndWait()
Goto lNotMatch
EndIf
lMatch:
If Board_iCell[iToX][iToY] = SPACE Then
iX = iFromX
iY = iFromY
iPiece = Board_iCell[iX][iY]
Board_iCell[iX][iY] = SPACE
Board_DrawCell()
iX = iToX
iY = iToY
Board_iCell[iX][iY] = iPiece
Board_DrawCell()
ElseIf Board_iCell[iToX][iToY] > (2 - iTurn) * 5 And Board_iCell[iToX][iToY] < 6 + (2 - iTurn) * 5 Then
' Opposite team peace already exists ... capture it
iCaptured = Board_iCell[iToX][iToY]
iX = iFromX
iY = iFromY
iPiece = Board_iCell[iX][iY]
Board_iCell[iX][iY] = SPACE
Board_DrawCell()
iX = iToX
iY = iToY
Board_iCell[iX][iY] = iPiece
Board_DrawCell()
iOpposite = iTurn * 10 - 15
iCaptured = iCaptured + iOpposite
Board_AddCaptured()
Else
' Same team piece already exists
Sound.PlayChimeAndWait()
EndIf
Goto lExit
lNotMatch:
Sound.PlayChimeAndWait()
lExit:
EndSub
'
Sub Board_AddCaptured
If iCaptured <= 5 Then
i = FOREST
Else
i = SKY
EndIf
j = Board_iNumCaptured[i]
j = j + 1
Board_iCaptured[i][j] = iCaptured
Board_iNumCaptured[i] = j
Board_DrawCaptured()
EndSub
'
Sub Debug_UnderConstruction
oLion2 = Shapes.AddImage(uPiece[LION2])
Shapes.HideShape(oLion2)
oElephant2 = Shapes.AddImage(uPiece[ELEPHANT2])
Shapes.HideShape(oElephant2)
oGiraffe2 = Shapes.AddImage(uPiece[GIRAFFE2])
Shapes.HideShape(oGiraffe2)
oChick2 = Shapes.AddImage(uPiece[CHICK2])
Shapes.HideShape(oChick2)
oLion1 = Shapes.AddImage(uPiece[LION1])
Shapes.HideShape(oLion1)
oElephant1 = Shapes.AddImage(uPiece[ELEPHANT1])
Shapes.HideShape(oElephant1)
oGiraffe1 = Shapes.AddImage(uPiece[GIRAFFE1])
Shapes.HideShape(oGiraffe1)
oChick1 = Shapes.AddImage(uPiece[CHICK1])
Shapes.HideShape(oChick1)

Shapes.Move(oElephant1, iX0 + isX, iY0 + isY + 3 * idY)
Shapes.ShowShape(oElephant1)
Sound.PlayClickAndWait()
Shapes.Move(oLion1, iX0 + isX + idX, iY0 + isY + 3 * idY)
Shapes.ShowShape(oLion1)
Sound.PlayClickAndWait()
Shapes.Move(oGiraffe1, iX0 + isX + 2 * idX, iY0 + isY + 3 * idY)
Shapes.ShowShape(oGiraffe1)
Sound.PlayClickAndWait()
Shapes.Move(oChick1, iX0 + isX + idX, iY0 + isY + 2 * idY)
Shapes.ShowShape(oChick1)
Sound.PlayClickAndWait()
Shapes.Move(oElephant2, iX0 + isX + 2 * idX, iY0 + isY)
Shapes.ShowShape(oElephant2)
Sound.PlayClickAndWait()
Shapes.Move(oLion2, iX0 + isX + idX, iY0 + isY)
Shapes.ShowShape(oLion2)
Sound.PlayClickAndWait()
Shapes.Move(oGiraffe2, iX0 + isX, iY0 + isY)
Shapes.ShowShape(oGiraffe2)
Sound.PlayClickAndWait()
Shapes.Move(oChick2, iX0 + isX + idX, iY0 + isY + idY)
Shapes.ShowShape(oChick2)
Sound.PlayClickAndWait()
GraphicsWindow.MouseMove = Player_OnMouseMove
For iY = 1 To 4
For iX = 1 To 3
GraphicsWindow.DrawImage(uCell[iX][iY], iX0 + (iX - 1) * idX + 2, iY0 + (iY - 1) * idY + 2)
EndFor
EndFor

' GraphicsWindow.MouseDown = Player_OnMouseDown
While "True"
EndWhile

EndSub ' Debug_UnderConstruction
'
Sub Player_OnMouseDown
GraphicsWindow.MouseMove = Player_OnMouseMove
While Mouse.IsLeftButtonDown
Program.Delay(100)
EndWhile
GraphicsWindow.MouseMove = Player_DoNothing
EndSub
'
Sub Player_OnMouseMove
iMX = GraphicsWindow.MouseX
iMY = GraphicsWindow.MouseY
Shapes.HideShape(oChick1)
Shapes.ShowShape(oChick1)
Shapes.Animate(oChick1, iMX - 40, iMY - 40, 50)
EndSub
'
Sub Player_DoNothing
EndSub
'
Sub Dotted_Line
iLen = 10
iSqX = (Dotted_iX1 - Dotted_iX0) * (Dotted_iX1 - Dotted_iX0)
iSqY = (Dotted_iY1 - Dotted_iY0) * (Dotted_iY1 - Dotted_iY0)
For rLen = 0 To Math.SquareRoot(iSqX + iSqY) - iLen Step iLen * 2
rRatio = rLen / Math.SquareRoot(iSqX + iSqY)
iDX0 = Dotted_iX0 + rRatio * (Dotted_iX1 - Dotted_iX0)
iDY0 = Dotted_iY0 + rRatio * (Dotted_iY1 - Dotted_iY0)
rRatio = (rLen + iLen) / Math.SquareRoot(iSqX + iSqY)
iDX1 = Dotted_iX0 + rRatio * (Dotted_iX1 - Dotted_iX0)
iDY1 = Dotted_iY0 + rRatio * (Dotted_iY1 - Dotted_iY0)
GraphicsWindow.DrawLine(iDX0, iDY0, iDX1, iDY1)
EndFor
EndSub