Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
QB64 Scra88le Board Game
#1
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.

.zip   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.

.pdf   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
Reply
#2
+1 @Magdha you've been posting some very impressive things lately and this one especially!

Quote: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!!

You might be overestimating my abilities I don't claim to be amazing or awesome and frankly I've been distracted by other life and health issues lately. But thanks for the compliment! Smile 

No this is beautiful board and playing against computer does make for interesting challenge for AI, which can be so good it discourages a player so have to be careful there IMHO.
  724  855  599  923  575  468  400  206  147  564  878  823  652  556 bxor cross forever
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)