12-11-2025, 11:09 AM
This is a copy of my program which first appeared on QB64.net and so it has a long history and is one my earliest QB64 projects. The program simulates a board game very similar to the commercial Scrabble game. You play against the computer. I was not able to get permission from the "Scrabble" copyright/trademark owners to use their name, and any .exe file which you might create cannot be distributed. There is a fair bit of processor computation required doing the searching and the program will run best on a modern machine.
I am particularly self-congratulatory about this program as it featured in the recent Carolina Code Conference which @Dav featured:
Dav's Thread on Carolina Coding Conference 2025
Unzip the file and extract the folder into your PEQB64 directory. In the IDE make sure that you have the Run Option “Save EXE in source folder” checked.
QB64 Scra88le Board Game.zip (Size: 1.3 MB / Downloads: 13)
When first using the program, there is a routine to set the appropriate mouse button used in gameplay.
If you try this program, you will see that this a program which would benefit from being an InForm program. @a740g I shall look at making an InForm version (should look pretty snazzy) at some future date. @bplus, I'd be grateful if you would not have a go at making such an Inform version of this program. I know that you'd knock something impressive up in an hour or two - for me this will be 2-3month absorbing project!!
The program comes with a European English dictionary ('color' and 'colour' both acceptable). A program comes with the project to make your own dictionary if you desire.
The User Guide gives further information and may be helpful but is not required to use the program.
Scra88le Word Game User Guide.pdf (Size: 1.06 MB / Downloads: 17)
I am particularly self-congratulatory about this program as it featured in the recent Carolina Code Conference which @Dav featured:
Dav's Thread on Carolina Coding Conference 2025
Unzip the file and extract the folder into your PEQB64 directory. In the IDE make sure that you have the Run Option “Save EXE in source folder” checked.
QB64 Scra88le Board Game.zip (Size: 1.3 MB / Downloads: 13)
When first using the program, there is a routine to set the appropriate mouse button used in gameplay.
If you try this program, you will see that this a program which would benefit from being an InForm program. @a740g I shall look at making an InForm version (should look pretty snazzy) at some future date. @bplus, I'd be grateful if you would not have a go at making such an Inform version of this program. I know that you'd knock something impressive up in an hour or two - for me this will be 2-3month absorbing project!!
The program comes with a European English dictionary ('color' and 'colour' both acceptable). A program comes with the project to make your own dictionary if you desire.
The User Guide gives further information and may be helpful but is not required to use the program.
Scra88le Word Game User Guide.pdf (Size: 1.06 MB / Downloads: 17)
Code: (Select All)
'Scraáále Board Game 2017-12-13 by Magdha ex Qwerkey
_TITLE "QB64 Scra88le"
$EXEICON:'.\scra88le.ico'
CONST False = 0, True = NOT False
CONST ScreenX% = 888, ScreenY% = 800
DIM SHARED Quartz&(9), ComputerScore%, PlayerScore%, BlankSq%%(1, 2), QtyBlanks%%
DIM TileVal%%(27), TileQty%%(27), Multipliers%%(16, 16), SpaceOcc%%(1, 102), TileSet$(102), Tiles$(102)
DIM TileRack%%(1, 7), ABoard$(16, 16), Orient%%(1, 3), Piece&(27), SavePosn%%(1, 7), TileRack&(1), Options%(2, 2)
DIM TempPicked%%(1, 7), NomDePlume%%(5), Alpha&(9), Taper%%(3, 7), Segment%%(9, 6), MissGo%%(1)
RANDOMIZE (TIMER)
'Load dictionary
PRINT "Loading Dictionary"
IF _FILEEXISTS("user.rnd") THEN
OPEN "user.rnd" FOR RANDOM AS #1 LEN = 15
ELSE
OPEN "collins.rnd" FOR RANDOM AS #1 LEN = 15
END IF
FIELD #1, 15 AS uloc$
DIM SHARED NoElements&
NoElements& = LOF(1) / 15
DIM SHARED Collins$(NoElements&)
FOR N1& = 1 TO NoElements&
GET #1, N1&
Collins$(N1&) = RTRIM$(uloc$)
NEXT N1&
CLOSE #1
'Set orientation data
RESTORE OrientationDat
FOR R%% = 0 TO 3
FOR S%% = 0 TO 1
READ Orient%%(S%%, R%%)
NEXT S%%
NEXT R%%
'Set tile quantities & values
RESTORE Qtys
FOR S%% = 1 TO 27
READ TileVal%%(S%%)
NEXT S%%
TotTiles%% = 0
FOR S%% = 1 TO 27
READ TileQty%%(S%%)
TotTiles%% = TotTiles%% + TileQty%%(S%%)
NEXT S%%
'TotTiles%% = 102 Defined by Above
'Set board multipliers
RESTORE Multipliers
FOR S%% = 1 TO 15
FOR R%% = 1 TO 15
READ Multipliers%%(S%%, R%%)
NEXT R%%
NEXT S%%
'Coder data
RESTORE Nickname
FOR N%% = 0 TO 5
READ NomDePlume%%(N%%)
NEXT N%%
'7-segment data
RESTORE Segments
FOR S%% = 1 TO 3
FOR R%% = 1 TO 7
READ Taper%%(S%%, R%%)
NEXT R%%
NEXT S%%
FOR S%% = 0 TO 9
FOR R%% = 0 TO 6
READ Segment%%(S%%, R%%)
NEXT R%%
NEXT S%%
RESTORE YourOptions
FOR N%% = 0 TO 2
FOR M%% = 0 TO 2
READ Options%(N%%, M%%)
NEXT M%%
NEXT N%%
'Set tileset characters
C%% = 0
FOR S%% = 1 TO 27
FOR R%% = 1 TO TileQty%%(S%%)
C%% = C%% + 1
TileSet$(C%%) = CHR$(S%% + 64)
Tiles$(C%%) = TileSet$(C%%)
NEXT R%%
NEXT S%%
'Load Images
'Alpha Images
FOR N%% = 0 TO 9
TempImg& = _NEWIMAGE(36, 36, 32)
_DEST TempImg&
COLOR _RGB(1, 1, 1), _RGBA(200, 200, 200, 255 * N%% / 9)
CLS
Alpha&(N%%) = HardwareImage&(TempImg&)
NEXT N%%
'Blank Identifier
TempImg& = _NEWIMAGE(36, 36, 32)
_DEST TempImg&
COLOR _RGB(100, 100, 100), _RGBA(200, 0, 0, 50)
CLS
BlankIdent& = HardwareImage&(TempImg&)
'Alphabet Blank
TempImg& = _NEWIMAGE(78, 422, 32)
_DEST TempImg&
COLOR _RGB(200, 200, 100), _RGB(30, 40, 200)
CLS
LINE (1, 1)-(76, 420), , B
LINE (2, 2)-(75, 419), , B
LINE (0, 0)-(77, 421), _RGB(160, 160, 80), B
COLOR _RGB(10, 10, 10), _RGBA(100, 100, 100, 0)
_FONT _LOADFONT("arialbd.ttf", 24)
FOR N%% = 1 TO 26
_PRINTSTRING (36 * ((N%% - 1) \ 13) + 10, 32 * ((N%% - 1) MOD 13) + 8), CHR$(N%% + 64)
NEXT N%%
Alphabet& = HardwareImage&(TempImg&)
'Alphabet Alpha
TempImg& = _NEWIMAGE(36, 32, 32)
_DEST TempImg&
COLOR _RGB(100, 100, 100), _RGBA(150, 150, 150, 150)
CLS
BlankAlpha& = HardwareImage&(TempImg&)
'Tile Scores
TempImg& = _NEWIMAGE(78, 416, 32)
_DEST TempImg&
COLOR _RGB(200, 200, 100), _RGB(15, 150, 15)
CLS
LINE (1, 1)-(76, 414), , B
LINE (2, 2)-(75, 413), , B
LINE (0, 0)-(77, 415), _RGB(160, 160, 80), B
COLOR _RGB(10, 10, 10), _RGBA(100, 100, 100, 0)
_FONT _LOADFONT("arialbd.ttf", 24)
FOR N%% = 1 TO 26
_PRINTSTRING (36 * ((N%% - 1) \ 13) + 4, 30 * ((N%% - 1) MOD 13) + 15), CHR$(N%% + 64)
NEXT N%%
_FONT _LOADFONT("arialbd.ttf", 14)
FOR N%% = 1 TO 26
M%% = TileVal%%(N%%)
IF M%% < 8 THEN
_PRINTSTRING (36 * ((N%% - 1) \ 13) + 16 + 4, 30 * ((N%% - 1) MOD 13) + 8 + 15), STR$(M%%)
ELSE
_PRINTSTRING (36 * ((N%% - 1) \ 13) + 12 + 4, 30 * ((N%% - 1) MOD 13) + 8 + 15), STR$(M%%)
END IF
NEXT N%%
TileScores& = HardwareImage&(TempImg&)
'Tile rack
TileRack&(1) = _NEWIMAGE(300, 54, 32)
_DEST TileRack&(1)
COLOR _RGB(165, 42, 42), _RGBA(150, 150, 150, 0)
CLS
LINE (5, 0)-(294, 53), , BF
LINE (0, 43)-(299, 53), _RGB(90, 20, 20), BF
TileRack&(0) = _NEWIMAGE(300, 54, 32)
_DEST TileRack&(0)
COLOR _RGB(165, 42, 42), _RGBA(150, 150, 150, 0)
CLS
_MAPTRIANGLE (0, 0)-(299, 0)-(0, 53), TempImg& TO(299, 53)-(0, 53)-(299, 0)
_MAPTRIANGLE (299, 53)-(0, 53)-(299, 0), TempImg& TO(0, 0)-(299, 0)-(0, 53)
'Tiles
FOR N%% = 1 TO 26
Piece&(N%%) = _LOADIMAGE("Piece" + CHR$(N%% + 64) + ".png", 33)
NEXT N%%
Piece&(27) = _LOADIMAGE("Piece.png", 33)
'Board Squares
'Standard Square
StdSquare& = _NEWIMAGE(40, 40, 32)
_DEST StdSquare&
COLOR _RGB(200, 200, 100), _RGB(200, 200, 200)
CLS
LINE (1, 1)-(38, 38), , B
LINE (2, 2)-(37, 37), , B
LINE (0, 0)-(39, 39), _RGB(160, 160, 80), B
'Triple Word Square
TripleWord& = _NEWIMAGE(40, 40, 32)
_DEST TripleWord&
COLOR _RGB(200, 200, 100), _RGB(20, 200, 20)
CLS
LINE (1, 1)-(38, 38), , B
LINE (2, 2)-(37, 37), , B
LINE (0, 0)-(39, 39), _RGB(160, 160, 80), B
_FONT _LOADFONT("arialbd.ttf", 16)
COLOR _RGB(10, 10, 10), _RGBA(100, 100, 100, 0)
_PRINTSTRING (12, 6), "W"
_PRINTSTRING (10, 22), "x3"
'Double Word Square
DoubleWord& = _NEWIMAGE(40, 40, 32)
_DEST DoubleWord&
COLOR _RGB(200, 200, 100), _RGB(60, 250, 60)
CLS
LINE (1, 1)-(38, 38), , B
LINE (2, 2)-(37, 37), , B
LINE (0, 0)-(39, 39), _RGB(160, 160, 80), B
_FONT _LOADFONT("arialbd.ttf", 16)
COLOR _RGB(10, 10, 10), _RGBA(100, 100, 100, 0)
_PRINTSTRING (12, 6), "W"
_PRINTSTRING (10, 22), "x2"
'Triple Letter Square
TripleLetter& = _NEWIMAGE(40, 40, 32)
_DEST TripleLetter&
COLOR _RGB(200, 200, 100), _RGB(200, 20, 200)
CLS
LINE (1, 1)-(38, 38), , B
LINE (2, 2)-(37, 37), , B
LINE (0, 0)-(39, 39), _RGB(160, 160, 80), B
_FONT _LOADFONT("arialbd.ttf", 16)
COLOR _RGB(10, 10, 10), _RGBA(100, 100, 100, 0)
_PRINTSTRING (14, 6), "L"
_PRINTSTRING (10, 22), "x3"
'Triple Letter Square
DoubleLetter& = _NEWIMAGE(40, 40, 32)
_DEST DoubleLetter&
COLOR _RGB(200, 200, 100), _RGB(250, 60, 250)
CLS
LINE (1, 1)-(38, 38), , B
LINE (2, 2)-(37, 37), , B
LINE (0, 0)-(39, 39), _RGB(160, 160, 80), B
_FONT _LOADFONT("arialbd.ttf", 16)
COLOR _RGB(10, 10, 10), _RGBA(100, 100, 100, 0)
_PRINTSTRING (14, 6), "L"
_PRINTSTRING (10, 22), "x2"
'Board
Board& = _NEWIMAGE(606, 606, 32)
_DEST Board&
COLOR _RGB(100, 100, 100), _RGB(120, 120, 150)
CLS
FOR N%% = 1 TO 15
FOR M%% = 1 TO 15
SELECT CASE Multipliers%%(N%%, M%%)
CASE 1
_PUTIMAGE (3 + (N%% - 1) * 40, 3 + (M%% - 1) * 40), StdSquare&
CASE 2
_PUTIMAGE (3 + (N%% - 1) * 40, 3 + (M%% - 1) * 40), DoubleLetter&
CASE 3
_PUTIMAGE (3 + (N%% - 1) * 40, 3 + (M%% - 1) * 40), TripleLetter&
CASE 4
_PUTIMAGE (3 + (N%% - 1) * 40, 3 + (M%% - 1) * 40), DoubleWord&
CASE 6
_PUTIMAGE (3 + (N%% - 1) * 40, 3 + (M%% - 1) * 40), TripleWord&
END SELECT
NEXT M%%
NEXT N%%
LINE (2, 2)-(603, 603), _RGB(160, 160, 80), B
LINE (1, 1)-(604, 604), _RGB(160, 160, 80), B
LINE (0, 0)-(605, 605), _RGB(140, 140, 70), B
'Put back tiles
TempImg& = _NEWIMAGE(76, 76, 32)
_DEST TempImg&
COLOR _RGB(200, 150, 100), _RGBA(100, 100, 100, 190)
CLS
COLOR _RGB(200, 150, 100), _RGBA(100, 100, 100, 0)
_FONT _LOADFONT("arialbd.ttf", 20)
_PRINTSTRING (10, 4), "Put"
_PRINTSTRING (10, 26), "Back"
_PRINTSTRING (10, 48), "Tiles"
LINE (0, 0)-(75, 75), _RGB(10, 10, 10), B
LINE (1, 1)-(74, 74), _RGB(10, 10, 10), B
PutBack& = HardwareImage&(TempImg&)
'Swap tiles
TempImg& = _NEWIMAGE(76, 76, 32)
_DEST TempImg&
COLOR _RGB(200, 150, 100), _RGBA(100, 100, 100, 190)
CLS
COLOR _RGB(200, 150, 100), _RGBA(100, 100, 100, 0)
_FONT _LOADFONT("arialbd.ttf", 20)
_PRINTSTRING (10, 16), "Swap"
_PRINTSTRING (10, 42), "Tiles"
LINE (0, 0)-(75, 75), _RGB(10, 10, 10), B
LINE (1, 1)-(74, 74), _RGB(10, 10, 10), B
SwopTiles& = HardwareImage&(TempImg&)
'Miss a Go
TempImg& = _NEWIMAGE(76, 76, 32)
_DEST TempImg&
COLOR _RGB(200, 150, 100), _RGBA(100, 100, 100, 190)
CLS
COLOR _RGB(200, 150, 100), _RGBA(100, 100, 100, 0)
_FONT _LOADFONT("arialbd.ttf", 20)
_PRINTSTRING (10, 16), "Miss"
_PRINTSTRING (10, 42), "Go"
LINE (0, 0)-(75, 75), _RGB(10, 10, 10), B
LINE (1, 1)-(74, 74), _RGB(10, 10, 10), B
MissGo& = HardwareImage&(TempImg&)
'Submit
TempImg& = _NEWIMAGE(76, 76, 32)
_DEST TempImg&
COLOR _RGB(200, 150, 100), _RGBA(100, 100, 100, 190)
CLS
COLOR _RGB(200, 150, 100), _RGBA(100, 100, 100, 0)
_FONT _LOADFONT("arialbd.ttf", 20)
_PRINTSTRING (4, 26), "Submit"
LINE (0, 0)-(75, 75), _RGB(10, 10, 10), B
LINE (1, 1)-(74, 74), _RGB(10, 10, 10), B
Submit& = HardwareImage&(TempImg&)
'Quit
TempImg& = _NEWIMAGE(76, 76, 32)
_DEST TempImg&
COLOR _RGB(200, 150, 100), _RGBA(100, 100, 100, 190)
CLS
COLOR _RGB(200, 150, 100), _RGBA(100, 100, 100, 0)
_FONT _LOADFONT("arialbd.ttf", 20)
_PRINTSTRING (16, 26), "Quit"
LINE (0, 0)-(75, 75), _RGB(10, 10, 10), B
LINE (1, 1)-(74, 74), _RGB(10, 10, 10), B
Quit& = HardwareImage&(TempImg&)
'Choices Alpha
TempImg& = _NEWIMAGE(72, 72, 32)
_DEST TempImg&
COLOR _RGB(200, 150, 100), _RGBA(100, 100, 100, 150)
CLS
ChoiceAlpha& = HardwareImage&(TempImg&)
'Computer Strength
TempImg& = _NEWIMAGE(150, 150, 32)
_DEST TempImg&
COLOR _RGB(200, 150, 100), _RGBA(100, 100, 100, 190)
CLS
COLOR _RGB(200, 150, 100), _RGBA(100, 100, 100, 0)
_FONT _LOADFONT("arialbd.ttf", 20)
_PRINTSTRING (34, 12), "Computer"
_PRINTSTRING (38, 42), "Strength"
_PRINTSTRING (6, 100), "Max"
_PRINTSTRING (56, 100), "Med"
_PRINTSTRING (107, 100), "Min"
LINE (0, 0)-(149, 149), _RGB(10, 10, 10), B
LINE (1, 1)-(148, 148), _RGB(10, 10, 10), B
LINE (0, 74)-(149, 74), _RGB(10, 10, 10)
LINE (0, 75)-(149, 75), _RGB(10, 10, 10)
LINE (49, 74)-(49, 149), _RGB(10, 10, 10)
LINE (50, 74)-(50, 149), _RGB(10, 10, 10)
LINE (99, 74)-(99, 149), _RGB(10, 10, 10)
LINE (100, 74)-(100, 149), _RGB(10, 10, 10)
Macho& = HardwareImage&(TempImg&)
'Computer Strength Alpha
TempImg& = _NEWIMAGE(47, 72, 32)
_DEST TempImg&
COLOR _RGB(200, 150, 100), _RGBA(100, 100, 100, 150)
CLS
MachoAlpha& = HardwareImage&(TempImg&)
'Computer Miss Go
TempImg& = _NEWIMAGE(150, 150, 32)
_DEST TempImg&
COLOR _RGB(20, 10, 10), _RGB(220, 50, 50)
CLS
_FONT _LOADFONT("arialbd.ttf", 28)
_PRINTSTRING (8, 30), "Computer"
_PRINTSTRING (26, 63), "Misses"
_PRINTSTRING (40, 96), "A Go"
LINE (2, 2)-(147, 147), _RGB(160, 20, 20), B
LINE (1, 1)-(148, 148), _RGB(160, 20, 20), B
LINE (0, 0)-(149, 149), _RGB(100, 15, 15), B
CompMissGo& = HardwareImage&(TempImg&)
'Computer Swap Tiles
TempImg& = _NEWIMAGE(150, 150, 32)
_DEST TempImg&
COLOR _RGB(20, 10, 10), _RGB(220, 50, 50)
CLS
_FONT _LOADFONT("arialbd.ttf", 28)
_PRINTSTRING (8, 30), "Computer"
_PRINTSTRING (30, 63), "Swaps"
_PRINTSTRING (40, 96), "Tiles"
LINE (2, 2)-(147, 147), _RGB(160, 20, 20), B
LINE (1, 1)-(148, 148), _RGB(160, 20, 20), B
LINE (0, 0)-(149, 149), _RGB(100, 15, 15), B
CompSwop& = HardwareImage&(TempImg&)
'Complete Draw
TempImg& = _NEWIMAGE(150, 200, 32)
_DEST TempImg&
COLOR _RGB(20, 10, 10), _RGB(180, 180, 50)
CLS
_FONT _LOADFONT("arialbd.ttf", 28)
_PRINTSTRING (36, 30), "Game"
_PRINTSTRING (42, 63), "Over"
_PRINTSTRING (40, 129), "Draw"
LINE (2, 2)-(147, 197), _RGB(100, 100, 20), B
LINE (1, 1)-(148, 198), _RGB(100, 100, 20), B
LINE (0, 0)-(149, 199), _RGB(60, 15, 15), B
CompleteDraw& = HardwareImage&(TempImg&)
'Complete Player Win
TempImg& = _NEWIMAGE(150, 220, 32)
_DEST TempImg&
COLOR _RGB(20, 10, 10), _RGB(180, 180, 50)
CLS
_FONT _LOADFONT("arialbd.ttf", 28)
_PRINTSTRING (36, 30), "Game"
_PRINTSTRING (42, 63), "Over"
_PRINTSTRING (30, 129), "Player"
_PRINTSTRING (40, 162), "Wins"
LINE (2, 2)-(147, 217), _RGB(100, 100, 20), B
LINE (1, 1)-(148, 218), _RGB(100, 100, 20), B
LINE (0, 0)-(149, 219), _RGB(60, 15, 15), B
CompletePlayer& = HardwareImage&(TempImg&)
'Complete Computer Win
TempImg& = _NEWIMAGE(150, 220, 32)
_DEST TempImg&
COLOR _RGB(20, 10, 10), _RGB(180, 180, 50)
CLS
_FONT _LOADFONT("arialbd.ttf", 28)
_PRINTSTRING (36, 30), "Game"
_PRINTSTRING (42, 63), "Over"
_PRINTSTRING (8, 129), "Computer"
_PRINTSTRING (40, 162), "Wins"
LINE (2, 2)-(147, 217), _RGB(100, 100, 20), B
LINE (1, 1)-(148, 218), _RGB(100, 100, 20), B
LINE (0, 0)-(149, 219), _RGB(60, 15, 15), B
CompleteComputer& = HardwareImage&(TempImg&)
'Background
TempImg& = _NEWIMAGE(ScreenX%, ScreenY%, 32)
_DEST TempImg&
FOR N%% = 0 TO 24
FOR M%% = 0 TO 22
Theta! = (0.5 - RND) * 2 * 3.141592
x1% = CINT((-18 * COS(Theta!)) - (-18 * SIN(Theta!))) + 18 + (N%% * 36)
y1% = CINT((-18 * SIN(Theta!)) + (-18 * COS(Theta!))) + 18 + (M%% * 36)
x2% = CINT((-18 * COS(Theta!)) - (18 * SIN(Theta!))) + 18 + (N%% * 36)
y2% = CINT((-18 * SIN(Theta!)) + (18 * COS(Theta!))) + 18 + (M%% * 36)
x3% = CINT((18 * COS(Theta!)) - (18 * SIN(Theta!))) + 18 + (N%% * 36)
y3% = CINT((18 * SIN(Theta!)) + (18 * COS(Theta!))) + 18 + (M%% * 36)
x4% = CINT((18 * COS(Theta!)) - (-18 * SIN(Theta!))) + 18 + (N%% * 36)
y4% = CINT((18 * SIN(Theta!)) + (-18 * COS(Theta!))) + 18 + (M%% * 36)
C%% = 1 + INT(RND * 26)
_MAPTRIANGLE (0, 0)-(0, 35)-(35, 35), _LOADIMAGE("Piece" + CHR$(C%% + 64) + ".png", 32) TO(x1%, y1%)-(x2%, y2%)-(x3%, y3%)
_MAPTRIANGLE (35, 35)-(35, 0)-(0, 0), _LOADIMAGE("Piece" + CHR$(C%% + 64) + ".png", 32) TO(x3%, y3%)-(x4%, y4%)-(x1%, y1%)
NEXT M%%
NEXT N%%
FOR N%% = 0 TO 24
FOR M%% = 0 TO 22
Theta! = (0.5 - RND) * 2 * 3.141592
x1% = CINT((-18 * COS(Theta!)) - (-18 * SIN(Theta!))) + (N%% * 36)
y1% = CINT((-18 * SIN(Theta!)) + (-18 * COS(Theta!))) + (M%% * 36)
x2% = CINT((-18 * COS(Theta!)) - (18 * SIN(Theta!))) + (N%% * 36)
y2% = CINT((-18 * SIN(Theta!)) + (18 * COS(Theta!))) + (M%% * 36)
x3% = CINT((18 * COS(Theta!)) - (18 * SIN(Theta!))) + (N%% * 36)
y3% = CINT((18 * SIN(Theta!)) + (18 * COS(Theta!))) + (M%% * 36)
x4% = CINT((18 * COS(Theta!)) - (-18 * SIN(Theta!))) + (N%% * 36)
y4% = CINT((18 * SIN(Theta!)) + (-18 * COS(Theta!))) + (M%% * 36)
C%% = 1 + INT(RND * 26)
_MAPTRIANGLE (0, 0)-(0, 35)-(35, 35), _LOADIMAGE("Piece" + CHR$(C%% + 64) + ".png", 32) TO(x1%, y1%)-(x2%, y2%)-(x3%, y3%)
_MAPTRIANGLE (35, 35)-(35, 0)-(0, 0), _LOADIMAGE("Piece" + CHR$(C%% + 64) + ".png", 32) TO(x3%, y3%)-(x4%, y4%)-(x1%, y1%)
NEXT M%%
NEXT N%%
FOR N%% = 0 TO 5
Theta! = (0.5 - RND) * 0.3
x1% = ScreenX% - 22 + CINT((-18 * COS(Theta!)) - (-18 * SIN(Theta!))) - (N%% * 20)
y1% = 30 + CINT((-18 * SIN(Theta!)) + (-18 * COS(Theta!))) + (N%% * 30)
x2% = ScreenX% - 22 + CINT((-18 * COS(Theta!)) - (18 * SIN(Theta!))) - (N%% * 20)
y2% = 30 + CINT((-18 * SIN(Theta!)) + (18 * COS(Theta!))) + (N%% * 30)
x3% = ScreenX% - 22 + CINT((18 * COS(Theta!)) - (18 * SIN(Theta!))) - (N%% * 20)
y3% = 30 + CINT((18 * SIN(Theta!)) + (18 * COS(Theta!))) + (N%% * 30)
x4% = ScreenX% - 22 + CINT((18 * COS(Theta!)) - (-18 * SIN(Theta!))) - (N%% * 20)
y4% = 30 + CINT((18 * SIN(Theta!)) + (-18 * COS(Theta!))) + (N%% * 30)
_MAPTRIANGLE (0, 0)-(0, 35)-(35, 35), _LOADIMAGE("Piece" + CHR$(NomDePlume%%(N%%) + 64) + ".png", 32) TO(x1%, y1%)-(x2%, y2%)-(x3%, y3%)
_MAPTRIANGLE (35, 35)-(35, 0)-(0, 0), _LOADIMAGE("Piece" + CHR$(NomDePlume%%(N%%) + 64) + ".png", 32) TO(x3%, y3%)-(x4%, y4%)-(x1%, y1%)
NEXT N%%
COLOR _RGBA(25, 25, 94, 220)
LINE (0, 0)-(ScreenX% - 1, ScreenY% - 1), , BF
_PUTIMAGE (97, 97), Board&
_PUTIMAGE (250, 23), TileRack&(0)
_PUTIMAGE (250, 723), TileRack&(1)
LINE (340, 2)-(460, 20), _RGB(250, 250, 250), BF
LINE (340, 779)-(460, 797), _RGB(250, 250, 250), BF
_FONT _LOADFONT("arialbd.ttf", 20)
COLOR _RGB(10, 10, 10), _RGBA(250, 250, 250, 0)
_PRINTSTRING (344, 3), "COMPUTER"
_PRINTSTRING (360, 780), "PLAYER"
Background& = HardwareImage&(TempImg&)
'7-segment
Horiz& = _NEWIMAGE(19, 7, 32)
_DEST Horiz&
COLOR _RGB(3, 220, 3), _RGBA(0, 0, 0, 0)
CLS
FOR S%% = 1 TO 3
FOR R%% = 1 TO 7
IF Taper%%(S%%, R%%) THEN
PSET (S%% - 1, R%% - 1), _RGB(3, 220, 3)
PSET (19 - S%%, 7 - R%%), _RGB(3, 220, 3)
END IF
NEXT R%%
NEXT S%%
LINE (3, 0)-(15, 6), , BF
Vert& = _NEWIMAGE(7, 19, 32)
_DEST Vert&
COLOR _RGB(3, 220, 3), _RGBA(0, 0, 0, 0)
CLS
FOR S%% = 1 TO 3
FOR R%% = 1 TO 7
IF Taper%%(S%%, R%%) THEN
PSET (R%% - 1, S%% - 1), _RGB(3, 220, 3)
PSET (7 - R%%, 19 - S%%), _RGB(3, 220, 3)
END IF
NEXT R%%
NEXT S%%
LINE (0, 3)-(6, 15), , BF
'7-segment image data
W% = 29 + 8: H% = 51 + 8
FOR S%% = 0 TO 9
TempImg& = _NEWIMAGE(W%, H%, 32)
_DEST TempImg&
COLOR _RGB(3, 220, 3), _RGBA(100, 100, 100, 190)
CLS
IF Segment%%(S%%, 0) THEN _PUTIMAGE (5 + 4, 0 + 4), Horiz&
IF Segment%%(S%%, 1) THEN _PUTIMAGE (0 + 4, 5 + 4), Vert&
IF Segment%%(S%%, 2) THEN _PUTIMAGE (22 + 4, 5 + 4), Vert&
IF Segment%%(S%%, 3) THEN _PUTIMAGE (5 + 4, 22 + 4), Horiz&
IF Segment%%(S%%, 4) THEN _PUTIMAGE (0 + 4, 27 + 4), Vert&
IF Segment%%(S%%, 5) THEN _PUTIMAGE (22 + 4, 27 + 4), Vert&
IF Segment%%(S%%, 6) THEN _PUTIMAGE (5 + 4, 44 + 4), Horiz&
Quartz&(S%%) = HardwareImage&(TempImg&)
NEXT S%%
_FREEIMAGE DoubleLetter&
_FREEIMAGE TripleLetter&
_FREEIMAGE DoubleWord&
_FREEIMAGE TripleWord&
_FREEIMAGE StdSquare&
_FREEIMAGE Horiz&
_FREEIMAGE Vert&
_FREEIMAGE TileRack&(0)
_FREEIMAGE TileRack&(1)
_FREEIMAGE Board&
'Routine to Set Mouse Buttons and Location (First Time Only)
IF NOT _FILEEXISTS("mouse.cfg") THEN
Mousey& = _LOADIMAGE("Mickey.png", 32)
SCREEN _NEWIMAGE(500, 500, 32)
_SCREENMOVE 100, 100
_DEST 0
CLS
_PUTIMAGE (50, 100), Mousey&
LOCATE 2, 7
PRINT "Click on the mouse below with your normal button";
LOCATE 3, 5
PRINT "Click (not double-click) to make this screen disappear";
LOCATE 5, 6
PRINT "There may be a delay - Please wait for next screen";
CorrectButton%% = False
WHILE NOT CorrectButton%%
_LIMIT 60
'Assumes hardware has mouse buttons, value <=5
IF _MOUSEINPUT THEN
CorrectButton%% = False
MouseButton%% = 1
WHILE NOT CorrectButton%% AND MouseButton%% <= 5
IF _MOUSEBUTTON(MouseButton%%) THEN
CorrectButton%% = True
ELSE
MouseButton%% = MouseButton%% + 1
END IF
WEND
END IF
WEND
_FREEIMAGE Mousey&
OPEN "mouse.cfg" FOR OUTPUT AS #2
PRINT #2, MouseButton%%
CLOSE #2
_DELAY 0.2
DO 'Make sure that mouse button is released
Dum%% = _MOUSEINPUT
LOOP UNTIL NOT _MOUSEBUTTON(MouseButton%%)
_AUTODISPLAY
CLS
'Also a routine to rate processor would be good for future version
ELSE
OPEN "mouse.cfg" FOR INPUT AS #1
INPUT #1, MouseButton%%
CLOSE #1
END IF
_TITLE "QB64 Scra88le"
'Zero data values
ScoobyDoo%% = True
TileRack%%(0, 0) = 0
TileRack%%(1, 0) = 0
PlayerGo%% = False
ComputerGo%% = False
FirstGo%% = True
PickedUp%% = 0
TempPlaced%% = 0
TilesPlaced%% = 0
TilesUsed%% = 0
CanClick%% = True
PlayerScore% = 0
ComputerScore% = 0
Swop%% = False
SetOptions%% = True
Hawking%% = 0
ChooseBlank%% = False
'Screen
SCREEN _NEWIMAGE(ScreenX%, ScreenY%, 32)
_SCREENMOVE 5, 5
_DEST 0
COLOR _RGB(255, 255, 0), _RGB(128, 128, 128)
CLS
_DISPLAYORDER _HARDWARE
WHILE ScoobyDoo%%
'Player's Go
QtyBlanks%% = 0
WHILE PlayerGo%%
_LIMIT 30
'Display background
_PUTIMAGE (0, 0), Background&
IF NOT ChooseBlank%% THEN
'Display Choices
_PUTIMAGE (794, 712), Quit& 'Q - Quit
IF XMouse% > 798 AND XMouse% < 866 AND YMouse% > 716 AND YMouse% < 784 THEN
' Do nothing
ELSE
_PUTIMAGE (796, 714), ChoiceAlpha&
END IF
IF TempPlaced%% > 0 AND PickedUp%% = 0 THEN _PUTIMAGE (646, 712), Submit& 'Submit Player word
IF XMouse% > 650 AND XMouse% < 718 AND YMouse% > 716 AND YMouse% < 784 THEN
' Do nothing
ELSEIF TempPlaced%% > 0 AND PickedUp%% = 0 THEN
_PUTIMAGE (648, 714), ChoiceAlpha&
END IF
IF TempPlaced%% > 0 AND PickedUp%% = 0 THEN _PUTIMAGE (720, 712), PutBack& 'Remove temporary Player tiles from board back to rack
IF XMouse% > 724 AND XMouse% < 792 AND YMouse% > 716 AND YMouse% < 784 THEN
' Do nothing
ELSEIF TempPlaced%% > 0 AND PickedUp%% = 0 THEN
_PUTIMAGE (722, 714), ChoiceAlpha&
END IF
IF TotTiles%% - TilesUsed%% > 0 AND TempPlaced%% = 0 AND PickedUp%% = 0 THEN _PUTIMAGE (720, 638), SwopTiles& 'Swap Player tiles with kitty
IF XMouse% > 724 AND XMouse% < 792 AND YMouse% > 642 AND YMouse% < 710 THEN
' Do nothing
ELSEIF TotTiles%% - TilesUsed%% > 0 AND TempPlaced%% = 0 AND PickedUp%% = 0 THEN
_PUTIMAGE (722, 640), ChoiceAlpha&
END IF
IF TempPlaced%% = 0 AND PickedUp%% = 0 THEN _PUTIMAGE (794, 638), MissGo& 'Miss Go
IF XMouse% > 798 AND XMouse% < 866 AND YMouse% > 642 AND YMouse% < 710 THEN
' Do nothing
ELSEIF TempPlaced%% = 0 AND PickedUp%% = 0 THEN
_PUTIMAGE (798, 640), ChoiceAlpha&
END IF
END IF
'Display Tile Values
_PUTIMAGE (10, 200), TileScores&
'Display Scores
CALL Scores
'Display blank alphabet choice
IF ChooseBlank%% THEN
_PUTIMAGE (720, 200), Alphabet&
FOR C%% = 1 TO 26
N%% = (C%% - 1) \ 13: M%% = (C%% - 1) MOD 13
IF AlphaXPos%% = N%% AND AlphaYPos%% = M%% THEN
'Do nothing
ELSE
_PUTIMAGE (723 + ((C%% - 1) \ 13) * 36, 203 + ((C%% - 1) MOD 13) * 32), BlankAlpha&
END IF
NEXT C%%
END IF
'Display Computer Options
IF SetOptions%% THEN
_PUTIMAGE (720, 490), Macho&
IF XMouse% > 773 AND XMouse% < 821 AND YMouse% > 568 AND YMouse% < 636 THEN
'Blank left & right
_PUTIMAGE (722, 566), MachoAlpha&
_PUTIMAGE (821, 566), MachoAlpha&
ELSEIF XMouse% > 823 AND XMouse% < 871 AND YMouse% > 568 AND YMouse% < 636 THEN
'Blank left & middle
_PUTIMAGE (722, 566), MachoAlpha&
_PUTIMAGE (771, 566), MachoAlpha&
ELSE
'Blank middle & right
_PUTIMAGE (771, 566), MachoAlpha&
_PUTIMAGE (821, 566), MachoAlpha&
END IF
END IF
'Display masked computer tiles
FOR N%% = 1 TO 7
'IF TileRack%%(0, N%%) <> 0 THEN _PUTIMAGE (222 + (40 * N%%), 35), Piece&(ASC(TileSet$(TileRack%%(0, N%%))) - 64)
IF TileRack%%(0, N%%) <> 0 THEN _PUTIMAGE (222 + (40 * N%%), 35), Alpha&(9)
NEXT N%%
'Display tiles on board
IF TilesPlaced%% + TempPlaced%% > 0 THEN
FOR M%% = 1 TO TilesPlaced%% + TempPlaced%%
_PUTIMAGE (102 + ((SpaceOcc%%(0, M%%) - 1) * 40), 102 + ((SpaceOcc%%(1, M%%) - 1) * 40)), Piece&(ASC(ABoard$(SpaceOcc%%(0, M%%), SpaceOcc%%(1, M%%))) - 64)
IF Multipliers%%(SpaceOcc%%(0, M%%), SpaceOcc%%(1, M%%)) = 0 THEN _PUTIMAGE (102 + ((SpaceOcc%%(0, M%%) - 1) * 40), 102 + ((SpaceOcc%%(1, M%%) - 1) * 40)), BlankIdent&
NEXT M%%
END IF
'Display Player Tiles
FOR N%% = 1 TO 7
IF TileRack%%(1, N%%) <> 0 THEN
IF PickedUp%% <> N%% THEN
_PUTIMAGE (222 + (40 * N%%), 730), Piece&(ASC(TileSet$(TileRack%%(1, N%%))) - 64)
ELSE
_PUTIMAGE (XMouse% - 18, YMouse% - 18), Piece&(ASC(TileSet$(TileRack%%(1, N%%))) - 64)
END IF
END IF
NEXT N%%
'Mouse input
WHILE _MOUSEINPUT
XMouse% = _MOUSEX: YMouse% = _MOUSEY
IF NOT ChooseBlank%% THEN
IF _MOUSEBUTTON(MouseButton%%) AND CanClick%% THEN
CanClick%% = False
ClickStart! = TIMER
IF SetOptions%% AND YMouse% >= 568 AND YMouse% <= 636 AND XMouse% >= 773 AND XMouse% < 821 THEN
SetOptions%% = False
Hawking%% = 1
ELSEIF SetOptions%% AND YMouse% >= 568 AND YMouse% <= 636 AND XMouse% >= 823 AND XMouse% < 871 THEN
SetOptions%% = False
Hawking%% = 2
ELSEIF XMouse% > 790 AND XMouse% < 866 AND YMouse% > 716 AND YMouse% < 784 THEN
'Quit
PlayerGo%% = False
ComputerGo%% = False
ScoobyDoo%% = False
ELSEIF YMouse% >= 716 AND YMouse% <= 784 AND XMouse% >= 724 AND XMouse% < 792 AND TempPlaced%% >= 1 AND PickedUp%% = 0 THEN
'Replace all tiles onto rack
FOR M%% = TempPlaced%% TO 1 STEP -1
XPos%% = SpaceOcc%%(0, M%% + TilesPlaced%%)
YPos%% = SpaceOcc%%(1, M%% + TilesPlaced%%)
ABoard$(XPos%%, YPos%%) = ""
TileRack%%(1, TempPicked%%(0, M%%)) = TempPicked%%(1, M%%)
NEXT M%%
TempPlaced%% = 0
PickedUp%% = 0
QtyBlanks%% = 0
ELSEIF YMouse% >= 642 AND YMouse% <= 710 AND XMouse% >= 798 AND XMouse% < 866 AND TempPlaced%% = 0 AND PickedUp%% = 0 THEN
'Miss Go
ComputerGo%% = True
PlayerGo%% = False
FirstGo%% = False
PickedUp%% = 0
SetOptions%% = False
MissGo%%(1) = MissGo%%(1) + 1
ELSEIF YMouse% >= 642 AND YMouse% <= 710 AND XMouse% >= 724 AND XMouse% < 792 AND TotTiles%% - TilesUsed%% > 0 AND TempPlaced%% = 0 AND PickedUp%% = 0 THEN
'Swap all tiles
Swop%% = True
ComputerGo%% = True
PlayerGo%% = False
FirstGo%% = False
PickedUp%% = 0
SetOptions%% = False
MissGo%%(1) = MissGo%%(1) + 1 'Swapping regarded similar to miss-go
ELSEIF YMouse% >= 716 AND YMouse% <= 784 AND XMouse% >= 650 AND XMouse% < 718 AND TempPlaced%% > 0 AND PickedUp%% = 0 THEN
'Submit - Check & set word into board
FailTest%% = False
'Check validity of single piece & set orientation
IF TempPlaced%% = 1 THEN
XPos%% = SpaceOcc%%(0, 1 + TilesPlaced%%)
YPos%% = SpaceOcc%%(1, 1 + TilesPlaced%%)
IF ABoard$(XPos%%, YPos%% + 1) <> "" OR ABoard$(XPos%%, YPos%% - 1) <> "" THEN
Q%% = 0
ELSEIF ABoard$(XPos%% + 1, YPos%%) <> "" OR ABoard$(XPos%% - 1, YPos%%) <> "" THEN
Q%% = 1
ELSE
'Illegal
FailTest%% = True
END IF
END IF
'Get first and last places
MinS%% = 16: MaxS%% = 0
MinR%% = 16: MaxR%% = 0
FOR M%% = 1 TO TempPlaced%%
IF SpaceOcc%%(0, M%% + TilesPlaced%%) < MinS%% THEN MinS%% = SpaceOcc%%(0, M%% + TilesPlaced%%)
IF SpaceOcc%%(0, M%% + TilesPlaced%%) > MaxS%% THEN MaxS%% = SpaceOcc%%(0, M%% + TilesPlaced%%)
IF SpaceOcc%%(1, M%% + TilesPlaced%%) < MinR%% THEN MinR%% = SpaceOcc%%(1, M%% + TilesPlaced%%)
IF SpaceOcc%%(1, M%% + TilesPlaced%%) > MaxR%% THEN MaxR%% = SpaceOcc%%(1, M%% + TilesPlaced%%)
NEXT M%%
'Check first row/col goes through centre square
IF TilesPlaced%% = 0 THEN
ThroughGo%% = False
FOR N%% = 1 TO TempPlaced%%
XPos%% = SpaceOcc%%(0, N%% + TilesPlaced%%)
YPos%% = SpaceOcc%%(1, N%% + TilesPlaced%%)
IF XPos%% = 8 AND YPos%% = 8 THEN ThroughGo%% = True
NEXT N%%
IF NOT ThroughGo%% THEN FailTest%% = True
END IF
'Check for gaps
IF TempPlaced%% >= 2 THEN
Gaps%% = False
IF Q%% = 1 THEN
FOR S%% = MinS%% + 1 TO MaxS%% - 1
IF ABoard$(S%%, PrevR%%) = "" THEN Gaps%% = True
NEXT S%%
ELSE
FOR R%% = MinR%% + 1 TO MaxR%% - 1
IF ABoard$(PrevS%%, R%%) = "" THEN Gaps%% = True
NEXT R%%
END IF
IF Gaps%% THEN FailTest%% = True
END IF
'Check touching
IF TilesPlaced%% > 0 THEN
Touching%% = False
M%% = 1 'Temp placed pieces
WHILE M%% <= TempPlaced%% AND NOT Touching%%
XPos%% = SpaceOcc%%(0, M%% + TilesPlaced%%)
YPos%% = SpaceOcc%%(1, M%% + TilesPlaced%%)
N%% = 1 'Tiles already placed
WHILE N%% <= TilesPlaced%% AND NOT Touching%%
IF (XPos%% = (SpaceOcc%%(0, N%%) + 1) OR XPos%% = (SpaceOcc%%(0, N%%) - 1)) AND YPos%% = SpaceOcc%%(1, N%%) THEN Touching%% = True
IF (YPos%% = (SpaceOcc%%(1, N%%) + 1) OR YPos%% = (SpaceOcc%%(1, N%%) - 1)) AND XPos%% = SpaceOcc%%(0, N%%) THEN Touching%% = True
N%% = N%% + 1
WEND
M%% = M%% + 1
WEND
IF NOT Touching%% THEN FailTest%% = True
END IF
PrevR%% = MinR%%
PrevS%% = MinS%%
IF TempPlaced%% < 1 THEN FailTest%% = True
'Check word
IF NOT FailTest%% THEN
Qwerkey$ = ""
TotVal% = 0
WordMult%% = 1
'Find filled spaces before
MoreBefore%% = True
M%% = 1
IF Q%% = 1 THEN
WHILE MoreBefore%%
IF ABoard$(MinS%% - M%%, PrevR%%) = "" THEN MoreBefore%% = False
M%% = M%% + 1
WEND
ELSE
WHILE MoreBefore%%
IF ABoard$(PrevS%%, MinR%% - M%%) = "" THEN MoreBefore%% = False
M%% = M%% + 1
WEND
END IF
M%% = M%% - 2
'Find filled spaces after
MoreAfter%% = True
C%% = 0
IF Q%% = 1 THEN
WHILE MoreAfter%%
IF ABoard$(MinS%% - M%% + C%%, PrevR%%) = "" THEN
MoreAfter%% = False
ELSE
T$ = ABoard$(MinS%% - M%% + C%%, PrevR%%)
Qwerkey$ = Qwerkey$ + T$
NewlyPlaced%% = False
Z%% = 1
WHILE NOT NewlyPlaced%% AND Z%% <= TempPlaced%%
IF SpaceOcc%%(0, Z%% + TilesPlaced%%) = (MinS%% - M%% + C%%) AND SpaceOcc%%(1, Z%% + TilesPlaced%%) = PrevR%% THEN NewlyPlaced%% = True 'Tile is newly placed
Z%% = Z%% + 1
WEND
IF NewlyPlaced%% THEN
IF NOT IsItBlank%%((MinS%% - M%% + C%%), (PrevR%%)) THEN
IF Multipliers%%(MinS%% - M%% + C%%, PrevR%%) <= 3 THEN
TotVal% = TotVal% + TileVal%%(ASC(T$) - 64) * Multipliers%%(MinS%% - M%% + C%%, PrevR%%)
ELSE
TotVal% = TotVal% + TileVal%%(ASC(T$) - 64)
WordMult%% = WordMult%% * Multipliers%%(MinS%% - M%% + C%%, PrevR%%) / 2
END IF
END IF
ELSEIF Multipliers%%(MinS%% - M%% + C%%, PrevR%%) > 0 THEN
TotVal% = TotVal% + TileVal%%(ASC(T$) - 64)
END IF
END IF
C%% = C%% + 1
WEND
ELSE
WHILE MoreAfter%%
IF ABoard$(PrevS%%, MinR%% - M%% + C%%) = "" THEN
MoreAfter%% = False
ELSE
T$ = ABoard$(PrevS%%, MinR%% - M%% + C%%)
Qwerkey$ = Qwerkey$ + T$
NewlyPlaced%% = False
Z%% = 1
WHILE NOT NewlyPlaced%% AND Z%% <= TempPlaced%%
IF SpaceOcc%%(0, Z%% + TilesPlaced%%) = PrevS%% AND SpaceOcc%%(1, Z%% + TilesPlaced%%) = (MinR%% - M%% + C%%) THEN NewlyPlaced%% = True
Z%% = Z%% + 1
WEND
IF NewlyPlaced%% THEN
IF NOT IsItBlank%%((PrevS%%), (MinR%% - M%% + C%%)) THEN
IF Multipliers%%(PrevS%%, MinR%% - M%% + C%%) <= 3 THEN
TotVal% = TotVal% + TileVal%%(ASC(T$) - 64) * Multipliers%%(PrevS%%, MinR%% - M%% + C%%)
ELSE
TotVal% = TotVal% + TileVal%%(ASC(T$) - 64)
WordMult%% = WordMult%% * Multipliers%%(PrevS%%, MinR%% - M%% + C%%) / 2
END IF
END IF
ELSEIF Multipliers%%(PrevS%%, MinR%% - M%% + C%%) > 0 THEN
TotVal% = TotVal% + TileVal%%(ASC(T$) - 64)
END IF
END IF
C%% = C%% + 1
WEND
END IF
TotVal% = TotVal% * WordMult%%
IF InCollins%%((Qwerkey$)) THEN
'Check for sideways words
TotExtra% = 0
M%% = 1
WHILE NOT FailTest%% AND M%% <= TempPlaced%%
WordMult%% = 1
EachExtra% = 0
SideWord$ = ""
S0%% = SpaceOcc%%(0, M%% + TilesPlaced%%)
R0%% = SpaceOcc%%(1, M%% + TilesPlaced%%)
IF Q%% = 1 THEN
'For all sideways positions
IF ABoard$(S0%%, R0%% + 1) <> "" OR ABoard$(S0%%, R0%% - 1) <> "" THEN
MoreBefore%% = True
C%% = 1
WHILE MoreBefore%%
IF ABoard$(S0%%, R0%% - C%%) = "" THEN MoreBefore%% = False
C%% = C%% + 1
WEND
C%% = C%% - 2
MoreAfter%% = True
D%% = 0
WHILE MoreAfter%%
IF ABoard$(S0%%, R0%% - C%% + D%%) = "" THEN
MoreAfter%% = False
ELSE
T$ = ABoard$(S0%%, R0%% - C%% + D%%)
SideWord$ = SideWord$ + T$
IF D%% = C%% THEN
IF NOT IsItBlank%%((S0%%), (R0%% - C%% + D%%)) THEN
IF Multipliers%%(S0%%, R0%% - C%% + D%%) <= 3 THEN
EachExtra% = EachExtra% + TileVal%%(ASC(T$) - 64) * Multipliers%%(S0%%, R0%% - C%% + D%%)
ELSE
EachExtra% = EachExtra% + TileVal%%(ASC(T$) - 64)
WordMult%% = WordMult%% * Multipliers%%(S0%%, R0%% - C%% + D%%) / 2
END IF
END IF
ELSEIF Multipliers%%(S0%%, R0%% - C%% + D%%) > 0 THEN
EachExtra% = EachExtra% + TileVal%%(ASC(T$) - 64)
END IF
END IF
D%% = D%% + 1
WEND
IF NOT InCollins%%((SideWord$)) THEN FailTest%% = True
END IF
ELSE
'Same thing, other direction
IF ABoard$(S0%% + 1, R0%%) <> "" OR ABoard$(S0%% - 1, R0%%) <> "" THEN
MoreBefore%% = True
C%% = 1
WHILE MoreBefore%%
IF ABoard$(S0%% - C%%, R0%%) = "" THEN MoreBefore%% = False
C%% = C%% + 1
WEND
C%% = C%% - 2
MoreAfter%% = True
D%% = 0
WHILE MoreAfter%%
IF ABoard$(S0%% - C%% + D%%, R0%%) = "" THEN
MoreAfter%% = False
ELSE
T$ = ABoard$(S0%% - C%% + D%%, R0%%)
SideWord$ = SideWord$ + T$
IF D%% = C%% THEN
IF NOT IsItBlank%%((S0%%), (R0%%)) THEN
IF Multipliers%%(S0%%, R0%%) <= 3 THEN
EachExtra% = EachExtra% + TileVal%%(ASC(T$) - 64) * Multipliers%%(S0%%, R0%% - C%% + D%%)
ELSE
EachExtra% = EachExtra% + TileVal%%(ASC(T$) - 64)
WordMult%% = WordMult%% * Multipliers%%(S0%%, R0%%) / 2
END IF
END IF
ELSEIF Multipliers%%(S0%% - C%% + D%%, R0%%) > 0 THEN
EachExtra% = EachExtra% + TileVal%%(ASC(T$) - 64)
END IF
END IF
D%% = D%% + 1
WEND
IF NOT InCollins%%((SideWord$)) THEN FailTest%% = True
END IF
END IF
M%% = M%% + 1
TotExtra% = TotExtra% + EachExtra% * WordMult%%
WEND
IF NOT FailTest%% THEN
TilesPlaced%% = TilesPlaced%% + TempPlaced%%
TileRack%%(1, 0) = TileRack%%(1, 0) - TempPlaced%%
ComputerGo%% = True
PlayerGo%% = False
FirstGo%% = False
TotVal% = TotVal% + TotExtra%
IF TempPlaced%% = 7 THEN TotVal% = TotVal% + 50
PlayerScore% = PlayerScore% + TotVal%
MissGo%%(1) = 0
IF TotTiles%% - TilesUsed%% = 0 THEN PlayerGo%% = False
'Update for blank tiles
IF QtyBlanks%% > 0 THEN
FOR M%% = 1 TO QtyBlanks%%
Multipliers%%(BlankSq%%(0, QtyBlanks%%), BlankSq%%(1, QtyBlanks%%)) = 0
NEXT M%%
END IF
END IF
ELSE
FailTest%% = True
END IF
END IF
IF FailTest%% THEN
'Have to put tiles back
FOR M%% = TempPlaced%% TO 1 STEP -1
XPos%% = SpaceOcc%%(0, M%% + TilesPlaced%%)
YPos%% = SpaceOcc%%(1, M%% + TilesPlaced%%)
ABoard$(XPos%%, YPos%%) = ""
TileRack%%(1, TempPicked%%(0, M%%)) = TempPicked%%(1, M%%)
NEXT M%%
END IF
TempPlaced%% = 0
PickedUp%% = 0
QtyBlanks%% = 0
ELSEIF PickedUp%% > 0 THEN 'Piece is picked up
IF YMouse% >= 103 AND YMouse% <= 697 AND XMouse% >= 103 AND XMouse% < 697 THEN
'Place tile on board (temporarily)
XPos%% = 1 + (XMouse% - 100) \ 40
YPos%% = 1 + (YMouse% - 100) \ 40
IF ABoard$(XPos%%, YPos%%) = "" THEN
OrientOK%% = True
IF TempPlaced%% = 1 THEN
'Check on same row/col - Define word direction
IF XPos%% = PrevS%% THEN
Q%% = 0
ELSEIF YPos%% = PrevR%% THEN
Q%% = 1
ELSE
OrientOK%% = False
END IF
ELSEIF TempPlaced%% > 1 THEN
IF XPos%% <> PrevS%% AND Q%% = 0 THEN OrientOK%% = False
IF YPos%% <> PrevR%% AND Q%% = 1 THEN OrientOK%% = False
END IF
IF OrientOK%% THEN
TempPlaced%% = TempPlaced%% + 1
TempPicked%%(0, TempPlaced%%) = PickedUp%%
TempPicked%%(1, TempPlaced%%) = TileRack%%(1, PickedUp%%)
SpaceOcc%%(0, TilesPlaced%% + TempPlaced%%) = XPos%%
SpaceOcc%%(1, TilesPlaced%% + TempPlaced%%) = YPos%%
ABoard$(XPos%%, YPos%%) = TileSet$(TileRack%%(1, PickedUp%%))
IF TileSet$(TileRack%%(1, PickedUp%%)) = "[" THEN ChooseBlank%% = True
TileRack%%(1, PickedUp%%) = 0
PrevS%% = XPos%%
PrevR%% = YPos%%
END IF
END IF
END IF
PickedUp%% = 0
ELSEIF PickedUp%% = 0 THEN 'Piece is not picked up
'Last piece replace not implemented
'Pick up piece from rack
N%% = 1
WHILE N%% <= 7 AND PickedUp%% = 0
IF YMouse% >= 731 AND YMouse% <= 765 AND XMouse% >= 223 + (40 * N%%) AND XMouse% < 257 + (40 * N%%) THEN
IF TileRack%%(1, N%%) <> 0 THEN PickedUp%% = N%%
END IF
N%% = N%% + 1
WEND
SetOptions%% = False
END IF
END IF
ELSEIF XMouse% > 724 AND XMouse% < 794 AND YMouse% > 204 AND YMouse% < 617 THEN
'Choose Blank Letter
AlphaXPos%% = (XMouse% - 723) \ 36
AlphaYPos%% = (YMouse% - 203) \ 32
ChosenAlpha$ = ""
IF _MOUSEBUTTON(MouseButton%%) AND CanClick%% THEN
CanClick%% = False
ClickStart! = TIMER
ChosenAlpha$ = CHR$((13 * AlphaXPos%%) + AlphaYPos%% + 65)
ABoard$(XPos%%, YPos%%) = ChosenAlpha$
ChooseBlank%% = False
QtyBlanks%% = QtyBlanks%% + 1
BlankSq%%(0, QtyBlanks%%) = XPos%%
BlankSq%%(1, QtyBlanks%%) = YPos%%
END IF
END IF
WEND
'Modificaton to avoid false mouse clicks
IF NOT CanClick%% THEN
IF TIMER < ClickStart! THEN ClickStart! = ClickStart! - 86400 'Goes through midnight
IF TIMER > ClickStart! + 0.32 THEN CanClick%% = True
END IF
_DISPLAY
WEND
'Swap Player Tiles
IF Swop%% THEN
Swop%% = False
FOR N%% = 1 TO 7
Tiles$(TileRack%%(1, N%%)) = TileSet$(TileRack%%(1, N%%))
TileRack%%(1, N%%) = 0
TileRack%%(1, 0) = TileRack%%(1, 0) - 1
TilesUsed%% = TilesUsed%% - 1
NEXT N%%
END IF
'Load player tiles
IF TileRack%%(1, 0) < 7 AND TilesUsed%% < TotTiles%% AND ScoobyDoo%% THEN
REDIM TileLoaded%%(1, 7)
FOR N%% = 1 TO 7
'Check if already loaded
IF TileRack%%(1, N%%) = 0 AND TilesUsed%% < TotTiles%% THEN
'To Be Loaded
TileLoaded%%(0, 0) = TileLoaded%%(0, 0) + 1
TileLoaded%%(0, TileLoaded%%(0, 0)) = N%%
Avail%% = False
WHILE NOT Avail%%
Posn%% = 1 + INT(RND * TotTiles%%)
IF Tiles$(Posn%%) <> "*" THEN Avail%% = True
WEND
TileRack%%(1, N%%) = Posn%%
Tiles$(Posn%%) = "*"
TilesUsed%% = TilesUsed%% + 1
TileRack%%(1, 0) = TileRack%%(1, 0) + 1
ELSEIF TileRack%%(1, N%%) <> 0 THEN
'Already Loaded
TileLoaded%%(1, 0) = TileLoaded%%(1, 0) + 1
TileLoaded%%(1, TileLoaded%%(1, 0)) = N%%
END IF
NEXT N%%
'Reveal tiles to be placed
PlaceTiles%% = False
AlphaCount%% = 0
Reveal%% = 1
WHILE NOT PlaceTiles%%
_LIMIT 36
AlphaCount%% = AlphaCount%% + 2
'Display Background
_PUTIMAGE (0, 0), Background&
'Display Scores
CALL Scores
'Display Tiles Already Placed on Board
IF TilesPlaced%% > 0 THEN
FOR M%% = 1 TO TilesPlaced%%
_PUTIMAGE (102 + ((SpaceOcc%%(0, M%%) - 1) * 40), 102 + ((SpaceOcc%%(1, M%%) - 1) * 40)), Piece&(ASC(ABoard$(SpaceOcc%%(0, M%%), SpaceOcc%%(1, M%%))) - 64)
IF Multipliers%%(SpaceOcc%%(0, M%%), SpaceOcc%%(1, M%%)) = 0 THEN _PUTIMAGE (102 + ((SpaceOcc%%(0, M%%) - 1) * 40), 102 + ((SpaceOcc%%(1, M%%) - 1) * 40)), BlankIdent&
NEXT M%%
END IF
'Display Computer Tiles (not revealed)
IF TileRack%%(0, 0) > 0 THEN
FOR N%% = 1 TO 7
IF TileRack%%(0, N%%) <> 0 THEN _PUTIMAGE (222 + (40 * N%%), 35), Alpha&(9)
NEXT N%%
END IF
'Display Player Tiles Already Loaded
IF TileLoaded%%(1, 0) > 0 THEN
FOR M%% = 1 TO TileLoaded%%(1, 0)
_PUTIMAGE (222 + (40 * TileLoaded%%(1, M%%)), 730), Piece&(ASC(TileSet$(TileRack%%(1, TileLoaded%%(1, M%%)))) - 64)
NEXT M%%
END IF
'Display Player Tiles To Be Loaded
IF TileLoaded%%(0, 0) > 0 THEN
FOR M%% = 1 TO TileLoaded%%(0, 0)
IF M%% = Reveal%% THEN
'Loading
_PUTIMAGE (222 + (40 * TileLoaded%%(0, M%%)), 730 + 36 - AlphaCount%%)-(222 + (40 * TileLoaded%%(0, M%%)) + 36, 730 + 36), Piece&(ASC(TileSet$(TileRack%%(1, TileLoaded%%(0, M%%)))) - 64), , (0, 0)-(36, 0 + AlphaCount%%)
ELSEIF M%% < Reveal%% THEN
'Loaded
_PUTIMAGE (222 + (40 * TileLoaded%%(0, M%%)), 730), Piece&(ASC(TileSet$(TileRack%%(1, TileLoaded%%(0, M%%)))) - 64)
END IF
NEXT M%%
END IF
IF AlphaCount%% > 36 THEN
AlphaCount%% = 0
Reveal%% = Reveal%% + 1
IF Reveal%% > TileLoaded%%(0, 0) THEN PlaceTiles%% = True
END IF
_DISPLAY
WEND
'Display for 1s
IF NOT FirstGo%% THEN
'Display Background
_PUTIMAGE (0, 0), Background&
'Display Scores
CALL Scores
'Display Tiles Already Placed on Board
IF TilesPlaced%% > 0 THEN
FOR M%% = 1 TO TilesPlaced%%
_PUTIMAGE (102 + ((SpaceOcc%%(0, M%%) - 1) * 40), 102 + ((SpaceOcc%%(1, M%%) - 1) * 40)), Piece&(ASC(ABoard$(SpaceOcc%%(0, M%%), SpaceOcc%%(1, M%%))) - 64)
IF Multipliers%%(SpaceOcc%%(0, M%%), SpaceOcc%%(1, M%%)) = 0 THEN _PUTIMAGE (102 + ((SpaceOcc%%(0, M%%) - 1) * 40), 102 + ((SpaceOcc%%(1, M%%) - 1) * 40)), BlankIdent&
NEXT M%%
END IF
'Display Computer Tiles (not revealed)
IF TileRack%%(0, 0) > 0 THEN
FOR N%% = 1 TO 7
IF TileRack%%(0, N%%) <> 0 THEN _PUTIMAGE (222 + (40 * N%%), 35), Alpha&(9)
NEXT N%%
END IF
'Display Player Tiles
FOR N%% = 1 TO 7
IF TileRack%%(1, N%%) <> 0 THEN _PUTIMAGE (222 + (40 * N%%), 730), Piece&(ASC(TileSet$(TileRack%%(1, N%%))) - 64)
NEXT N%%
_DISPLAY
_DELAY 1
END IF
END IF
'Computer's Go
RANDOMIZE (TIMER)
WHILE _MOUSEINPUT
IF _MOUSEBUTTON(MouseButton%%) THEN
END IF
WEND
MaxVal% = 0
BestWord$ = ""
Start! = TIMER
DispCount% = 0
DoMiss%% = False
DoSwop%% = False
BlankLetter$ = TileSet$(1 + INT(RND * (TotTiles%% - TileQty%%(27))))
IF TileRack%%(1, 0) = 0 THEN ComputerGo%% = False 'Player out of tiles - 1st player to use tiles finishes game
WHILE ComputerGo%%
_LIMIT Options%(Hawking%%, 0)
DispCount% = DispCount% + 1
IF DispCount% / 100 = INT(DispCount% / 100) THEN BlankLetter$ = TileSet$(1 + INT(RND * (TotTiles%% - TileQty%%(27))))
IF TilesPlaced%% > 0 THEN
'First find a vacant square next to an occupied square
GotSquare%% = False
WHILE NOT GotSquare%%
TileSel%% = 1 + INT(RND * TilesPlaced%%) 'Select one from the tiles already placed
Arrow%% = INT(RND * 4)
S0%% = SpaceOcc%%(0, TileSel%%) + Orient%%(0, Arrow%%)
R0%% = SpaceOcc%%(1, TileSel%%) + Orient%%(1, Arrow%%)
IF S0%% > 0 AND S0%% < 16 AND R0%% > 0 AND R0%% < 16 THEN
IF ABoard$(S0%%, R0%%) = "" THEN GotSquare%% = True
END IF
WEND
ELSE
'Start on centre square if Computer has 1st Go
S0%% = 8
R0%% = 8
END IF
'Determine spaces before/after & above/below
SpacesAbove%% = 0: SpacesBelow%% = 0: SpacesBefore%% = 0: SpacesAfter%% = 0
FOR S%% = 1 TO S0%%
IF ABoard$(S%%, R0%%) = "" THEN SpacesBefore%% = SpacesBefore%% + 1
NEXT S%%
FOR S%% = S0%% TO 15
IF ABoard$(S%%, R0%%) = "" THEN SpacesAfter%% = SpacesAfter%% + 1
NEXT S%%
FOR R%% = 1 TO R0%%
IF ABoard$(S0%%, R%%) = "" THEN SpacesAbove%% = SpacesAbove%% + 1
NEXT R%%
FOR R%% = R0%% TO 15
IF ABoard$(S0%%, R%%) = "" THEN SpacesBelow%% = SpacesBelow%% + 1
NEXT R%%
SpacesAbove%% = SpacesAbove%% - 1: SpacesBelow%% = SpacesBelow%% - 1
SpacesBefore%% = SpacesBefore%% - 1: SpacesAfter%% = SpacesAfter%% - 1
'Select letters from rack & place on board - do both vertically & horizontally
FOR Q%% = 0 TO 1
'Vertical (first) & Horizontal
IF Q%% = 0 THEN
SpacesLow%% = SpacesAbove%%
SpacesHigh%% = SpacesBelow%%
QDash%% = 1
ELSE
SpacesLow%% = SpacesBefore%%
SpacesHigh%% = SpacesAfter%%
QDash%% = 0
END IF
'Select how many tiles to be used in forming a word with the selected tile
IF SpacesLow%% + SpacesHigh%% + 1 >= TileRack%%(0, 0) THEN 'Add 1 to include the new space itself
NoLetters%% = 1 + INT(RND * TileRack%%(0, 0)) 'Defined by the number of tiles on the rack
ELSE
NoLetters%% = 1 + INT(RND * (SpacesLow%% + SpacesHigh%% + 1)) 'Defined by spaces available
END IF
IF NoLetters%% > Options%(Hawking%%, 2) THEN NoLetters%% = Options%(Hawking%%, 2)
'Reset selection on rack tiles
REDIM TilesChosen%%(7)
REDIM Selected%%(7)
REDIM TempHolder%%(15)
'Choose which letters to use from rack
FOR RCount%% = 1 TO NoLetters%%
NewLetter%% = True
WHILE NewLetter%%
Choose%% = 1 + INT(RND * 7)
IF TileRack%%(0, Choose%%) <> 0 AND NOT Selected%%(Choose%%) THEN
Selected%%(Choose%%) = True
NewLetter%% = False
END IF
WEND
TilesChosen%%(RCount%%) = Choose%%
NEXT RCount%%
Qwerkey$ = ""
TotVal% = 0
WordMult%% = 1
R%% = 0
S%% = 0
'Generate position of selected square in formed word
IF NoLetters%% = 1 THEN
SquarePosn%% = 1 'Actually, the general expression works
ELSE
CantPosn%% = True
WHILE CantPosn%%
CantPosn%% = False
SquarePosn%% = 1 + INT(RND * NoLetters%%)
IF SquarePosn%% > SpacesLow%% + 1 THEN CantPosn%% = True
IF NoLetters%% - SquarePosn%% > SpacesHigh%% THEN CantPosn%% = True
WEND
END IF
'Set the position of the first square
IF SquarePosn%% > 1 THEN
'First, find the place to start
LCount%% = 0
MoreBefore%% = False
WHILE NOT MoreBefore%%
IF Q%% = 0 THEN
R%% = R%% - 1
ELSE
S%% = S%% - 1
END IF
IF ABoard$(S0%% + S%%, R0%% + R%%) = "" THEN LCount%% = LCount%% + 1
IF LCount%% = SquarePosn%% - 1 THEN MoreBefore%% = True
WEND
END IF
'Look for filled spaces before R0/S0
MoreBefore%% = True
WHILE MoreBefore%%
IF Q%% = 0 THEN
IF ABoard$(S0%% + S%%, R0%% + R%% - 1) = "" THEN
MoreBefore%% = False
ELSE
R%% = R%% - 1
END IF
ELSE
IF ABoard$(S0%% + S%% - 1, R0%% + R%%) = "" THEN
MoreBefore%% = False
ELSE
S%% = S%% - 1
END IF
END IF
WEND
SStart%% = S0%% + S%%
RStart%% = R0%% + R%%
'Temporarily Write letters to board
S%% = 0
R%% = 0
WordCompleted%% = False
RCount%% = 0
WHILE NOT WordCompleted%%
IF ABoard$(SStart%% + S%%, RStart%% + R%%) = "" THEN
'Select an available tile & temporarily place it
RCount%% = RCount%% + 1
T$ = TileSet$(TileRack%%(0, TilesChosen%%(RCount%%)))
IF T$ <> "[" THEN
Qwerkey$ = Qwerkey$ + T$
ELSE
Qwerkey$ = Qwerkey$ + BlankLetter$
END IF
IF Multipliers%%(SStart%% + S%%, RStart%% + R%%) <= 3 THEN
TotVal% = TotVal% + TileVal%%(ASC(T$) - 64) * Multipliers%%(SStart%% + S%%, RStart%% + R%%)
ELSE
TotVal% = TotVal% + TileVal%%(ASC(T$) - 64)
WordMult%% = WordMult%% * Multipliers%%(SStart%% + S%%, RStart%% + R%%) / 2
END IF
IF Q%% = 0 THEN
TempHolder%%(R%%) = TilesChosen%%(RCount%%)
ELSE
TempHolder%%(S%%) = TilesChosen%%(RCount%%)
END IF
IF RCount%% = NoLetters%% THEN WordCompleted%% = True
ELSE
'Use existing tile
T$ = ABoard$(SStart%% + S%%, RStart%% + R%%)
Qwerkey$ = Qwerkey$ + T$
IF Multipliers%%(SStart%% + S%%, RStart%% + R%%) > 0 THEN TotVal% = TotVal% + TileVal%%(ASC(T$) - 64)
END IF
'(Going forward from a negative position)
IF Q%% = 0 THEN
R%% = R%% + 1
ELSE
S%% = S%% + 1
END IF
WEND
'Now check if there are any filled spaces beyond
MoreAfter%% = True
WHILE MoreAfter%%
IF (SStart%% + S%%) > 16 OR (RStart%% + R%%) > 16 THEN 'Shouldn't need this
MoreAfter%% = False
ELSEIF ABoard$(SStart%% + S%%, RStart%% + R%%) = "" THEN
MoreAfter%% = False
ELSE
T$ = ABoard$(SStart%% + S%%, RStart%% + R%%)
Qwerkey$ = Qwerkey$ + T$
IF Multipliers%%(SStart%% + S%%, RStart%% + R%%) > 0 THEN TotVal% = TotVal% + TileVal%%(ASC(T$) - 64)
END IF
IF Q%% = 0 THEN
R%% = R%% + 1
ELSE
S%% = S%% + 1
END IF
WEND
TotVal% = TotVal% * WordMult%%
WordLen%% = LEN(Qwerkey$)
IF InCollins%%((Qwerkey$)) THEN
'The tile letters are not yet added to the board
S%% = 0
R%% = 0
T%% = 1
TotExtra% = 0
ExtraWords%% = True
WHILE ExtraWords%% AND T%% <= WordLen%%
EachExtra% = 0
WordMult%% = 1
SideWord$ = ""
IF Q%% = 0 AND ABoard$(SStart%%, RStart%% + R%%) <> "" THEN
'Do nothing (existing tile)
ELSEIF Q%% = 1 AND ABoard$(SStart%% + S%%, RStart%%) <> "" THEN
'Do nothing (existing tile)
'Maybe slightly faster with the following two elseifs
ELSEIF Q%% = 0 AND ABoard$(SStart%% - 1, RStart%% + R%%) = "" AND ABoard$(SStart%% + 1, RStart%% + R%%) = "" THEN
'Do nothing - no tile either side
ELSEIF Q%% = 1 AND ABoard$(SStart%% + S%%, RStart%% - 1) = "" AND ABoard$(SStart%% + S%%, RStart%% + 1) = "" THEN
'Do nothing - no tile either side
ELSE
'Don't look for words from tile already on board
'Look for filled spaces before
MoreBefore%% = False
WHILE NOT MoreBefore%%
IF Q%% = 0 THEN
IF ABoard$(SStart%% + S%% - 1, RStart%% + R%%) = "" THEN
MoreBefore%% = True
ELSE
S%% = S%% - 1
END IF
ELSE
IF ABoard$(SStart%% + S%%, RStart%% + R%% - 1) = "" THEN
MoreBefore%% = True
ELSE
R%% = R%% - 1
END IF
END IF
WEND
'Look for end of word
MoreAfter%% = False
WHILE NOT MoreAfter%%
IF Q%% = 0 THEN
IF S%% = 0 THEN 'It's a tile from the rack
T$ = TileSet$(TileRack%%(0, TempHolder%%(R%%)))
IF T$ <> "[" THEN
SideWord$ = SideWord$ + T$
ELSE
SideWord$ = SideWord$ + BlankLetter$
END IF
IF Multipliers%%(SStart%%, RStart%% + R%%) <= 3 THEN
EachExtra% = EachExtra% + TileVal%%(ASC(T$) - 64) * Multipliers%%(SStart%%, RStart%% + R%%)
ELSE
EachExtra% = EachExtra% + TileVal%%(ASC(T$) - 64)
WordMult%% = WordMult%% * Multipliers%%(SStart%%, RStart%% + R%%) / 2
END IF
IF ABoard$(SStart%% + 1, RStart%% + R%%) = "" THEN MoreAfter%% = True
ELSE
T$ = ABoard$(SStart%% + S%%, RStart%% + R%%)
SideWord$ = SideWord$ + T$
IF Multipliers%%(SStart%% + S%%, RStart%% + R%%) > 0 THEN EachExtra% = EachExtra% + TileVal%%(ASC(T$) - 64)
IF S%% = -1 THEN
'Do nothing (we're before the new letter)
ELSEIF ABoard$(SStart%% + S%% + 1, RStart%% + R%%) = "" THEN
MoreAfter%% = True
END IF
END IF
S%% = S%% + 1
ELSE
IF R%% = 0 THEN 'It's a tile from the rack
T$ = TileSet$(TileRack%%(0, TempHolder%%(S%%)))
IF T$ <> "[" THEN
SideWord$ = SideWord$ + T$
ELSE
SideWord$ = SideWord$ + BlankLetter$
END IF
IF Multipliers%%(SStart%% + S%%, RStart%%) <= 3 THEN
EachExtra% = EachExtra% + TileVal%%(ASC(T$) - 64) * Multipliers%%(SStart%% + S%%, RStart%%)
ELSE
EachExtra% = EachExtra% + TileVal%%(ASC(T$) - 64)
WordMult%% = WordMult%% * Multipliers%%(SStart%% + S%%, RStart%%) / 2
END IF
IF ABoard$(SStart%% + S%%, RStart%% + 1) = "" THEN MoreAfter%% = True
ELSE
T$ = ABoard$(SStart%% + S%%, RStart%% + R%%)
SideWord$ = SideWord$ + T$
IF Multipliers%%(SStart%% + S%%, RStart%% + R%%) > 0 THEN EachExtra% = EachExtra% + TileVal%%(ASC(T$) - 64)
IF R%% = -1 THEN
'Do nothing (we're before the new letter)
ELSEIF ABoard$(SStart%% + S%%, RStart%% + R%% + 1) = "" THEN
MoreAfter%% = True
END IF
END IF
R%% = R%% + 1
END IF
WEND
IF NOT InCollins%%((SideWord$)) THEN
ExtraWords%% = False
END IF
END IF
IF Q%% = 0 THEN
R%% = R%% + 1
S%% = 0
ELSEIF Q%% = 1 THEN
S%% = S%% + 1
R%% = 0
END IF
TotExtra% = TotExtra% + EachExtra% * WordMult%%
T%% = T%% + 1
WEND
IF ExtraWords%% THEN
TotVal% = TotVal% + TotExtra%
IF NoLetters%% = 7 THEN TotVal% = TotVal% + 50
IF TotVal% > MaxVal% THEN
MaxVal% = TotVal%
BestWord$ = Qwerkey$
BestBlank$ = BlankLetter$
'Define positions and letters
S%% = SStart%%
R%% = RStart%%
M%% = 1
REDIM TileIsPlaced%%(7)
WHILE M%% <= NoLetters%%
IF ABoard$(S%%, R%%) <> "" THEN
'Already Occupied
ELSE
TileIsPlaced%%(M%%) = TilesChosen%%(M%%)
SavePosn%%(0, M%%) = S%%
SavePosn%%(1, M%%) = R%%
M%% = M%% + 1
END IF
IF Q%% = 0 THEN
R%% = R%% + 1
ELSE
S%% = S%% + 1
END IF
WEND
NoLettersUsed%% = NoLetters%%
END IF
END IF
END IF
NEXT Q%%
IF DispCount% = (Options%(Hawking%%, 0) \ 10) THEN
DispCount% = 0
_PUTIMAGE (0, 0), Background&
'Countdown Display
SecsRem%% = 1 + INT(Options%(Hawking%%, 1) - (TIMER - Start!))
IF SecsRem%% < 1 THEN
SecsRem%% = 1
ELSEIF SecsRem%% > 20 THEN
SecsRem%% = 20
END IF
IF SecsRem%% >= 10 THEN
Tens%% = SecsRem%% \ 10
_PUTIMAGE (600, 20), Quartz&(Tens%%)
Units%% = SecsRem%% MOD 10
ELSE
Units%% = SecsRem%%
END IF
_PUTIMAGE (635, 20), Quartz&(Units%%)
'Display masked computer tiles
FOR N%% = 1 TO 7
IF TileRack%%(0, N%%) <> 0 THEN _PUTIMAGE (222 + (40 * N%%), 35), Alpha&(9)
NEXT N%%
'Display tiles placed on board
IF TilesPlaced%% > 0 THEN
FOR M%% = 1 TO TilesPlaced%%
_PUTIMAGE (102 + ((SpaceOcc%%(0, M%%) - 1) * 40), 102 + ((SpaceOcc%%(1, M%%) - 1) * 40)), Piece&(ASC(ABoard$(SpaceOcc%%(0, M%%), SpaceOcc%%(1, M%%))) - 64)
IF Multipliers%%(SpaceOcc%%(0, M%%), SpaceOcc%%(1, M%%)) = 0 THEN _PUTIMAGE (102 + ((SpaceOcc%%(0, M%%) - 1) * 40), 102 + ((SpaceOcc%%(1, M%%) - 1) * 40)), BlankIdent&
NEXT M%%
END IF
'Display player tiles
FOR N%% = 1 TO 7
IF TileRack%%(1, N%%) <> 0 THEN _PUTIMAGE (222 + (40 * N%%), 730), Piece&(ASC(TileSet$(TileRack%%(1, N%%))) - 64)
NEXT N%%
_DISPLAY
END IF
IF Start! > TIMER THEN Start! = Start! - 86400 'Goes through midnight
IF TIMER - Start! > Options%(Hawking%%, 1) THEN ComputerGo%% = False
WEND
'Place the highest-scoring word on the board
IF MaxVal% > 0 THEN
ComputerScore% = ComputerScore% + MaxVal%
MissGo%%(0) = 0
REDIM Bestest%%(7)
FOR M%% = 1 TO NoLettersUsed%%
Bestest%%(TileIsPlaced%%(M%%)) = True
NEXT M%%
'Reveal tiles to be placed
PlaceTiles%% = False
AlphaStep%% = 9
AlphaCount%% = 0
Reveal%% = 1
WHILE NOT PlaceTiles%%
_LIMIT 36
AlphaCount%% = AlphaCount%% + 1
'Display Background
_PUTIMAGE (0, 0), Background&
'Display Tiles Already Placed on Board
IF TilesPlaced%% > 0 THEN
FOR M%% = 1 TO TilesPlaced%%
_PUTIMAGE (102 + ((SpaceOcc%%(0, M%%) - 1) * 40), 102 + ((SpaceOcc%%(1, M%%) - 1) * 40)), Piece&(ASC(ABoard$(SpaceOcc%%(0, M%%), SpaceOcc%%(1, M%%))) - 64)
IF Multipliers%%(SpaceOcc%%(0, M%%), SpaceOcc%%(1, M%%)) = 0 THEN _PUTIMAGE (102 + ((SpaceOcc%%(0, M%%) - 1) * 40), 102 + ((SpaceOcc%%(1, M%%) - 1) * 40)), BlankIdent&
NEXT M%%
END IF
'Display Computer Tiles that have not been used in word formation (not revealed)
FOR M%% = 1 TO 7
IF TileRack%%(0, M%%) <> 0 AND NOT Bestest%%(M%%) THEN _PUTIMAGE (222 + (40 * M%%), 35), Alpha&(9)
NEXT M%%
'If tiles are to be placed, do reveal & then move to position
FOR M%% = 1 TO NoLettersUsed%%
IF M%% > Reveal%% THEN
'Not ready to reveal
_PUTIMAGE (222 + (40 * TileIsPlaced%%(M%%)), 35), Alpha&(9)
ELSEIF M%% = Reveal%% THEN
'Revealing
_PUTIMAGE (222 + (40 * TileIsPlaced%%(M%%)), 35), Piece&(ASC(TileSet$(TileRack%%(0, TileIsPlaced%%(M%%)))) - 64)
_PUTIMAGE (222 + (40 * TileIsPlaced%%(M%%)), 35), Alpha&(AlphaStep%%)
ELSE
'Revealed
_PUTIMAGE (222 + (40 * TileIsPlaced%%(M%%)), 35), Piece&(ASC(TileSet$(TileRack%%(0, TileIsPlaced%%(M%%)))) - 64)
END IF
NEXT M%%
IF AlphaCount%% / 2 = INT(AlphaCount%% / 2) THEN
AlphaStep%% = AlphaStep%% - 1
IF AlphaStep%% < 0 THEN
AlphaStep%% = 9
Reveal%% = Reveal%% + 1
IF Reveal%% > NoLettersUsed%% THEN PlaceTiles%% = True
END IF
END IF
IF AlphaCount%% = 18 THEN AlphaCount%% = 0
'Display player tiles
FOR N%% = 1 TO 7
IF TileRack%%(1, N%%) <> 0 THEN _PUTIMAGE (222 + (40 * N%%), 730), Piece&(ASC(TileSet$(TileRack%%(1, N%%))) - 64)
NEXT N%%
_DISPLAY
WEND
'Move tiles onto board
PlaceTiles%% = False
BetaCount% = 0
Reveal%% = 1
WHILE NOT PlaceTiles%%
_LIMIT 100
BetaCount% = BetaCount% + 1
'Display Background
_PUTIMAGE (0, 0), Background&
'Display Tiles Already Placed on Board
IF TilesPlaced%% > 0 THEN
FOR M%% = 1 TO TilesPlaced%%
_PUTIMAGE (102 + ((SpaceOcc%%(0, M%%) - 1) * 40), 102 + ((SpaceOcc%%(1, M%%) - 1) * 40)), Piece&(ASC(ABoard$(SpaceOcc%%(0, M%%), SpaceOcc%%(1, M%%))) - 64)
IF Multipliers%%(SpaceOcc%%(0, M%%), SpaceOcc%%(1, M%%)) = 0 THEN _PUTIMAGE (102 + ((SpaceOcc%%(0, M%%) - 1) * 40), 102 + ((SpaceOcc%%(1, M%%) - 1) * 40)), BlankIdent&
NEXT M%%
END IF
'Display Tiles that have not been used in word formation (not revealed)
FOR M%% = 1 TO 7
IF TileRack%%(0, M%%) <> 0 AND NOT Bestest%%(M%%) THEN _PUTIMAGE (222 + (40 * M%%), 35), Alpha&(9)
NEXT M%%
'If tiles are to be placed, move to position
FOR M%% = 1 TO NoLettersUsed%%
IF M%% > Reveal%% THEN
'Not ready to move
_PUTIMAGE (222 + (40 * TileIsPlaced%%(M%%)), 35), Piece&(ASC(TileSet$(TileRack%%(0, TileIsPlaced%%(M%%)))) - 64)
ELSEIF M%% = Reveal%% THEN
'Moving
SPosStart% = 222 + (40 * TileIsPlaced%%(M%%))
RPosStart% = 35
SPosFinal% = 102 + ((SavePosn%%(0, M%%) - 1) * 40)
RPosFinal% = 102 + ((SavePosn%%(1, M%%) - 1) * 40)
SPos% = CINT(BetaCount% * (SPosFinal% - SPosStart%) / 120) + SPosStart%
RPos% = CINT(BetaCount% * (RPosFinal% - RPosStart%) / 120) + RPosStart%
_PUTIMAGE (SPos%, RPos%), Piece&(ASC(TileSet$(TileRack%%(0, TileIsPlaced%%(M%%)))) - 64)
ELSE
'Moved
_PUTIMAGE (102 + ((SavePosn%%(0, M%%) - 1) * 40), 102 + ((SavePosn%%(1, M%%) - 1) * 40)), Piece&(ASC(TileSet$(TileRack%%(0, TileIsPlaced%%(M%%)))) - 64)
END IF
NEXT M%%
'Display player tiles
FOR N%% = 1 TO 7
IF TileRack%%(1, N%%) <> 0 THEN _PUTIMAGE (222 + (40 * N%%), 730), Piece&(ASC(TileSet$(TileRack%%(1, N%%))) - 64)
NEXT N%%
IF BetaCount% = 120 THEN
BetaCount% = 0
Reveal%% = Reveal%% + 1
IF Reveal%% > NoLettersUsed%% THEN PlaceTiles%% = True
END IF
_DISPLAY
WEND
'Wait for 1 sec
_DELAY 1
'Update board & tile rack
BlanksUsed%% = False
FOR M%% = 1 TO NoLettersUsed%%
TilesPlaced%% = TilesPlaced%% + 1
TileRack%%(0, 0) = TileRack%%(0, 0) - 1
S%% = SavePosn%%(0, M%%)
R%% = SavePosn%%(1, M%%)
IF TileSet$(TileRack%%(0, TileIsPlaced%%(M%%))) = "[" THEN
BlanksUsed%% = True
ABoard$(S%%, R%%) = BestBlank$
'Set multiplier value to zero
Multipliers%%(S%%, R%%) = 0
ELSE
ABoard$(S%%, R%%) = TileSet$(TileRack%%(0, TileIsPlaced%%(M%%)))
END IF
SpaceOcc%%(0, TilesPlaced%%) = S%%
SpaceOcc%%(1, TilesPlaced%%) = R%%
TileRack%%(0, TileIsPlaced%%(M%%)) = 0
NEXT M%%
'Update board display with blank's substitution
IF BlanksUsed%% THEN
'Display Background
_PUTIMAGE (0, 0), Background&
'Display masked computer tiles
FOR N%% = 1 TO 7
IF TileRack%%(0, N%%) <> 0 THEN _PUTIMAGE (222 + (40 * N%%), 35), Alpha&(9)
NEXT N%%
'Display tiles placed on board
IF TilesPlaced%% > 0 THEN
FOR M%% = 1 TO TilesPlaced%%
_PUTIMAGE (102 + ((SpaceOcc%%(0, M%%) - 1) * 40), 102 + ((SpaceOcc%%(1, M%%) - 1) * 40)), Piece&(ASC(ABoard$(SpaceOcc%%(0, M%%), SpaceOcc%%(1, M%%))) - 64)
IF Multipliers%%(SpaceOcc%%(0, M%%), SpaceOcc%%(1, M%%)) = 0 THEN _PUTIMAGE (102 + ((SpaceOcc%%(0, M%%) - 1) * 40), 102 + ((SpaceOcc%%(1, M%%) - 1) * 40)), BlankIdent&
NEXT M%%
END IF
'Display player tiles
FOR N%% = 1 TO 7
IF TileRack%%(1, N%%) <> 0 THEN _PUTIMAGE (222 + (40 * N%%), 723), Piece&(ASC(TileSet$(TileRack%%(1, N%%))) - 64)
NEXT N%%
_DISPLAY
_DELAY 1
END IF
ELSEIF NOT FirstGo%% AND TileRack%%(1, 0) > 0 AND ScoobyDoo%% THEN
'Computer can't go
IF TotTiles%% - TilesUsed%% > 0 THEN
NoVowels%% = 0
FOR N%% = 1 TO 7
IF INSTR("AEIOU", TileSet$(TileRack%%(0, N%%))) <> 0 THEN NoVowels%% = NoVowels%% + 1
NEXT N%%
IF NoVowels%% = 0 OR NoVowels%% = 7 THEN
'Computer swaps tiles
DoSwop%% = True
FOR N%% = 1 TO 7
Tiles$(TileRack%%(0, N%%)) = TileSet$(TileRack%%(0, N%%))
TileRack%%(0, N%%) = 0
TileRack%%(0, 0) = TileRack%%(0, 0) - 1
TilesUsed%% = TilesUsed%% - 1
NEXT N%%
ELSE
'Computer misses a go
DoMiss%% = True
END IF
ELSE
'Not enough tiles to swap
DoMiss%% = True
END IF
'Display Background
_PUTIMAGE (0, 0), Background&
'Display masked computer tiles
FOR N%% = 1 TO 7
IF TileRack%%(0, N%%) <> 0 THEN _PUTIMAGE (222 + (40 * N%%), 35), Alpha&(9)
NEXT N%%
'Display tiles placed on board
IF TilesPlaced%% > 0 THEN
FOR M%% = 1 TO TilesPlaced%%
_PUTIMAGE (102 + ((SpaceOcc%%(0, M%%) - 1) * 40), 102 + ((SpaceOcc%%(1, M%%) - 1) * 40)), Piece&(ASC(ABoard$(SpaceOcc%%(0, M%%), SpaceOcc%%(1, M%%))) - 64)
IF Multipliers%%(SpaceOcc%%(0, M%%), SpaceOcc%%(1, M%%)) = 0 THEN _PUTIMAGE (102 + ((SpaceOcc%%(0, M%%) - 1) * 40), 102 + ((SpaceOcc%%(1, M%%) - 1) * 40)), BlankIdent&
NEXT M%%
END IF
'Display player tiles
FOR N%% = 1 TO 7
IF TileRack%%(1, N%%) <> 0 THEN _PUTIMAGE (222 + (40 * N%%), 730), Piece&(ASC(TileSet$(TileRack%%(1, N%%))) - 64)
NEXT N%%
IF DoSwop%% THEN
_PUTIMAGE (722, 300), CompSwop& 'Swap regarded as miss-go
ELSE
_PUTIMAGE (722, 300), CompMissGo&
END IF
MissGo%%(0) = MissGo%%(0) + 1
_DISPLAY
_DELAY 2
END IF
'Update Computer tile rack
IF ScoobyDoo%% THEN
FOR N%% = 1 TO 7
IF TileRack%%(0, N%%) = 0 AND TilesUsed%% < TotTiles%% THEN
Posn%% = 1 + INT(RND * (TotTiles%% - TilesUsed%%))
TileRack%%(0, N%%) = Posn%%
Avail%% = False
WHILE NOT Avail%%
Posn%% = 1 + INT(RND * TotTiles%%)
IF Tiles$(Posn%%) <> "*" THEN Avail%% = True
WEND
TileRack%%(0, N%%) = Posn%%
Tiles$(Posn%%) = "*"
TilesUsed%% = TilesUsed%% + 1
TileRack%%(0, 0) = TileRack%%(0, 0) + 1
END IF
NEXT N%%
PlayerGo%% = True
FOR N%% = 0 TO 1
IF MissGo%%(N%%) > 2 THEN MissGo%%(N%%) = 3
NEXT N%%
END IF
'Game End
IF TileRack%%(0, 0) = 0 OR TileRack%%(1, 0) = 0 OR (MissGo%%(0) >= 2 AND MissGo%%(1) >= 2) AND ScoobyDoo%% THEN
FOR N%% = 1 TO 7
'Subtract tile rack values
IF TileRack%%(0, N%%) <> 0 THEN
ComputerScore% = ComputerScore% - TileVal%%(ASC(TileSet$(TileRack%%(0, N%%))) - 64)
IF ComputerScore% < 0 THEN ComputerScore% = 0
END IF
IF TileRack%%(1, N%%) <> 0 THEN
PlayerScore% = PlayerScore% - TileVal%%(ASC(TileSet$(TileRack%%(1, N%%))) - 64)
IF PlayerScore% < 0 THEN PlayerScore% = 0
END IF
NEXT N%%
ReadyToGo%% = True
WHILE ReadyToGo%%
_LIMIT 10
'Display background
_PUTIMAGE (0, 0), Background&
_PUTIMAGE (794, 712), Quit& 'Quit
IF XMouse% > 798 AND XMouse% < 866 AND YMouse% > 716 AND YMouse% < 784 THEN
' Do nothing
ELSE
_PUTIMAGE (796, 714), ChoiceAlpha&
END IF
'Display Scores
CALL Scores
'Display computer tiles
FOR N%% = 1 TO 7
IF TileRack%%(0, N%%) <> 0 THEN _PUTIMAGE (222 + (40 * N%%), 35), Piece&(ASC(TileSet$(TileRack%%(0, N%%))) - 64)
NEXT N%%
'Display tiles on board
IF TilesPlaced%% + TempPlaced%% > 0 THEN
FOR M%% = 1 TO TilesPlaced%% + TempPlaced%%
_PUTIMAGE (102 + ((SpaceOcc%%(0, M%%) - 1) * 40), 102 + ((SpaceOcc%%(1, M%%) - 1) * 40)), Piece&(ASC(ABoard$(SpaceOcc%%(0, M%%), SpaceOcc%%(1, M%%))) - 64)
IF Multipliers%%(SpaceOcc%%(0, M%%), SpaceOcc%%(1, M%%)) = 0 THEN _PUTIMAGE (102 + ((SpaceOcc%%(0, M%%) - 1) * 40), 102 + ((SpaceOcc%%(1, M%%) - 1) * 40)), BlankIdent&
NEXT M%%
END IF
'Display Player Tiles
FOR N%% = 1 TO 7
IF TileRack%%(1, N%%) <> 0 THEN _PUTIMAGE (222 + (40 * N%%), 730), Piece&(ASC(TileSet$(TileRack%%(1, N%%))) - 64)
NEXT N%%
IF ComputerScore% > PlayerScore% THEN
_PUTIMAGE (720, 290), CompleteComputer&
ELSEIF ComputerScore% < PlayerScore% THEN
_PUTIMAGE (720, 290), CompletePlayer&
ELSE
_PUTIMAGE (720, 300), CompleteDraw&
END IF
WHILE _MOUSEINPUT
XMouse% = _MOUSEX: YMouse% = _MOUSEY
IF _MOUSEBUTTON(MouseButton%%) THEN
IF XMouse% > 790 AND XMouse% < 866 AND YMouse% > 716 AND YMouse% < 784 THEN
'Quit
ReadyToGo%% = False
PlayerGo%% = False
ComputerGo%% = False
ScoobyDoo%% = False
END IF
END IF
WEND
_DISPLAY
WEND
END IF
WEND
SYSTEM
'DATA
OrientationDat:
DATA 1,0,0,1,-1,0,0,-1
Qtys:
DATA 1,3,3,2,1,4,2,4,1,8,5,1,3,1,1,3,10,1,1,1,1,4,4,8,4,10,0
DATA 9,2,2,4,12,2,3,2,9,1,1,4,2,6,8,2,1,6,6,6,4,2,2,1,2,1,2
Multipliers:
DATA 6,1,1,2,1,1,1,6,1,1,1,2,1,1,6
DATA 1,4,1,1,1,3,1,1,1,3,1,1,1,4,1
DATA 1,1,4,1,1,1,2,1,2,1,1,1,4,1,1
DATA 2,1,1,4,1,1,1,2,1,1,1,4,1,1,2
DATA 1,1,1,1,4,1,1,1,1,1,4,1,1,1,1
DATA 1,3,1,1,1,3,1,1,1,3,1,1,1,3,1
DATA 1,1,2,1,1,1,2,1,2,1,1,1,2,1,1
DATA 6,1,1,2,1,1,1,4,1,1,1,2,1,1,6
DATA 1,1,2,1,1,1,2,1,2,1,1,1,2,1,1
DATA 1,3,1,1,1,3,1,1,1,3,1,1,1,3,1
DATA 1,1,1,1,4,1,1,1,1,1,4,1,1,1,1
DATA 2,1,1,4,1,1,1,2,1,1,1,4,1,1,2
DATA 1,1,4,1,1,1,2,1,2,1,1,1,4,1,1
DATA 1,4,1,1,1,3,1,1,1,3,1,1,1,4,1
DATA 6,1,1,2,1,1,1,6,1,1,1,2,1,1,6
Nickname:
DATA 13,1,7,4,8,1
Segments:
DATA 0,0,0,-1,0,0,0
DATA 0,0,-1,-1,-1,0,0
DATA 0,-1,-1,-1,-1,-1,0
DATA -1,-1,-1,0,-1,-1,-1
DATA 0,0,-1,0,0,-1,0
DATA -1,0,-1,-1,-1,0,-1
DATA -1,0,-1,-1,0,-1,-1
DATA 0,-1,-1,-1,0,-1,0
DATA -1,-1,0,-1,0,-1,-1
DATA -1,-1,0,-1,-1,-1,-1
DATA -1,0,-1,0,0,-1,0
DATA -1,-1,-1,-1,-1,-1,-1
DATA -1,-1,-1,-1,0,-1,0
YourOptions:
DATA 15000,20,7
DATA 5000,10,6
DATA 2000,5,5
FUNCTION InCollins%% (SeekWord$)
Begin& = 1: Ending& = NoElements&
InCollins1%% = False
WHILE Begin& <= Ending& AND NOT InCollins1%%
Middle& = (Begin& + Ending&) \ 2
DictWord$ = Collins$(Middle&)
IF SeekWord$ = DictWord$ THEN
InCollins1%% = True
ELSEIF SeekWord$ > DictWord$ THEN
Begin& = Middle& + 1
ELSE
Ending& = Middle& - 1
END IF
WEND
InCollins%% = InCollins1%%
END FUNCTION
FUNCTION HardwareImage& (ImageName&)
HardwareImage& = _COPYIMAGE(ImageName&, 33)
_FREEIMAGE ImageName&
END FUNCTION
FUNCTION IsItBlank%% (S2%%, R2%%)
IsItBlank%% = False
IF QtyBlanks%% > 0 THEN
Z%% = 1
WHILE NOT SquareIsBlank%% AND Z%% <= QtyBlanks%%
IF S2%% = BlankSq%%(0, QtyBlanks%%) AND R2%% = BlankSq%%(1, QtyBlanks%%) THEN IsItBlank%% = True
Z%% = Z%% + 1
WEND
END IF
END FUNCTION
SUB Scores
'Computer
Thousands% = 0
Hundreds% = 0
Tens%% = 0
CScore% = ComputerScore%
IF CScore% >= 1000 THEN
Thousands% = CScore% \ 1000
_PUTIMAGE (95, 20), Quartz&(Thousands%)
CScore% = CScore% - (Thousands% * 1000)
END IF
IF CScore% >= 100 THEN
Hundreds% = CScore% \ 100
CScore% = CScore% - (Hundreds% * 100)
END IF
IF Thousands% > 0 OR Hundreds% > 0 THEN _PUTIMAGE (130, 20), Quartz&(Hundreds%)
IF CScore% >= 10 THEN
Tens%% = CScore% \ 10
Units%% = CScore% MOD 10
ELSE
Units%% = CScore%
END IF
IF Thousands% > 0 OR Hundreds% > 0 OR Tens%% > 0 THEN _PUTIMAGE (165, 20), Quartz&(Tens%%)
_PUTIMAGE (200, 20), Quartz&(Units%%)
'Player
Thousands% = 0
Hundreds% = 0
Tens%% = 0
CScore% = PlayerScore%
IF CScore% >= 1000 THEN
Thousands% = CScore% \ 1000
_PUTIMAGE (95, 722), Quartz&(Thousands%)
CScore% = CScore% - (Thousands% * 1000)
END IF
IF CScore% >= 100 THEN
Hundreds% = CScore% \ 100
CScore% = CScore% - (Hundreds% * 100)
END IF
IF Thousands% > 0 OR Hundreds% > 0 THEN _PUTIMAGE (130, 722), Quartz&(Hundreds%)
IF CScore% >= 10 THEN
Tens%% = CScore% \ 10
Units%% = CScore% MOD 10
ELSE
Units%% = CScore%
END IF
IF Thousands% > 0 OR Hundreds% > 0 OR Tens%% > 0 THEN _PUTIMAGE (165, 722), Quartz&(Tens%%)
_PUTIMAGE (200, 722), Quartz&(Units%%)
END SUB

