Microsoft Small Basic

Program Listing: QDX521
' 8-Queens 0.2
' Copyright (c) 2012 Nonki Takahashi
'
' History :
' 0.2 2013/01/03 Rewrote for 8-Queens probrem. ()
' 0.1 2012/08/04 Code for chessmen written in hexadecimal.
' 0.0 2012/08/04 25-line version created. (CLP327)
'
GraphicsWindow.Title = "8-Queens 0.2"
GraphicsWindow.BackgroundColor = "#004C00"
GraphicsWindow.BrushColor = "Black"
oNum = Controls.AddTextBox(440, 30)
num = 12345678
Controls.SetTextBoxText(oNum, num)
InitBoard()
CheckValid()
DrawBoard()
Controls.TextTyped = OnTextTyped

Sub OnTextTyped
num = Controls.GetTextBoxText(oNum)
len = Text.GetLength(num)
correct = "False"
If len = 8 Then
correct = "True"
For i = 1 To 8
If Text.IsSubText(num, Text.GetSubText("12345678", i, 1)) = "False" Then
correct = "False"
EndIf
EndFor
EndIf
If correct Then
board = ""
For c = 1 To 8
board[Text.GetSubText(num, c, 1)][Text.GetSubText("abcdefgh", c, 1)] = "BQ"
EndFor
CheckValid()
DrawBoard()
EndIf
EndSub

Sub CheckValid
valid = "True"
For c1 = 1 To 8
For c2 = c1 + 1 To 8
r1 = Text.GetSubText(num, c1, 1)
r2 = Text.GetSubText(num, c2, 1)
dc = Math.Abs(c2 - c1)
dr = Math.Abs(r2 - r1)
If dc = dr Then
valid = "False"
board[r1][Text.GetSubText("abcdefgh", c1, 1)] = "RQ"
board[r2][Text.GetSubText("abcdefgh", c2, 1)] = "RQ"
EndIf
EndFor
EndFor
EndSub

Sub DrawBoard
For r = 8 To 1 Step - 1
y = pos["y0"] + (8 - r) * size
For c = 1 To 8
x = pos["x0"] + (c - 1) * size
GraphicsWindow.BrushColor = color[Math.Remainder((c + r), 2)]
GraphicsWindow.FillRectangle(x, y, size, size)
p = board[r][Text.GetSubText("abcdefgh", c, 1)]
If p <> "" Then
GraphicsWindow.BrushColor = color[Text.GetSubText(p, 1, 1)]
sHex = pieces[Text.GetSubText(p, 2, 1)]
Math_Hex2Dec()
GraphicsWindow.DrawText(x, y - size * 0.12, Text.GetCharacter(iDec))
EndIF
EndFor
EndFor
EndSub

Sub InitChessmen
size = 48 ' font height and square size
GraphicsWindow.FontSize = size
pieces = "P=265F;N=265E;B=265D;R=265C;Q=265B;K=265A;"
EndSub

Sub InitBoard
pos = "x0=30;y0=30;" ' left, top
For c = 1 To 8
board[c][Text.GetSubText("abcdefgh", c, 1)] = "BQ"
EndFor
color = "W=White;B=Black;R=Red;0=SaddleBrown;1=BurlyWood;"
InitChessmen()
EndSub

Sub Math_Hex2Dec
' Math | Convert sHex to iDec
iDec = 0
iLen = Text.GetLength(sHex)
For iPtr = 1 To iLen
iDec = iDec * 16 + Text.GetIndexOf("0123456789ABCDEF", Text.GetSubText(sHex, iPtr, 1)) - 1
EndFor
EndSub

Sub DumpBoard
For r = 8 To 1 Step -1
For c = 1 To 8
If board[r][Text.GetSubText("abcdefgh", c, 1)] <> "" Then
TextWindow.Write(board[r][Text.GetSubText("abcdefgh", c, 1)] + " ")
Else
TextWindow.Write(" ")
EndIf
EndFor
TextWindow.WriteLine("")
EndFor
EndSub