# Definitive script for OXO

The variables and definitions that make up the OXO-model are as follows:

```
DISPLAY
o is -1	// values to indicate what token is on the square
u is 0	// u means that a square is unoccupied
x is 1
board is concatxo(allsquares)
// concatxo converts -1,0,1 into chars  'O','.','X' and concatenates
// with appropriately specified newlines to create a board display
// display models the visual image associated with a physical disposition of tokens

GEOMETRY
allsquares is [s1,s2,s3,s4,s5,s6,s7,s8,s9]	//  list of all squares on the board
nofsquares is allsquares#		// # denotes the length of a list
lin1 is [s1,s2,s3]			// explicit enumeration of triples
lin2 is [s4,s5,s6]			// that define the lines
.....
alllines is [lin1, lin2, lin3, lin4, lin5, lin6, lin7, lin8]
noflines is alllines#
linesthru1 is [lin1, lin4, lin7]		// explicit enumeration of lines through a square
linesthru2 is [lin1, lin5]
......
linesthru is [linesthru1, linesthru2, ..., linesthru9]
//geometry describes the relationships between squares that determine oxo lines

STATUS
nofx is nofpieces(allsquares, x)
nofo is nofpieces(allsquares, o)
full is (nofo + nofx == nofsquares)
xwon is checkxwon(alllines)
owon is checkowon(alllines)
draw is !xwon && !owon && full
status is (xwon ? "X wins " :  "") || (owon ? "O wins " : "") || (draw ? "Draw " : "") || ""

// status  explains how a particular position is interpreted by an oxo watcher

SQVALS
square is .... 	// possible values are s1 / s2 / s3 / s4 /s5 / s6 / s7 /s8 / s9
availsquare is allsquares[square]==u
cursqval is sqval(linesthru[square])
// sqval() associates a value with a particular square in a particular oxo position
// sqvals evaluates squares (without lookahead) from the perspective of an oxo player

PLAY
maxindex is findmaxindex(allsquares)
// findmaxindex determines the square with the highest evaluation in a given position
// play is derived from sqvals by "contemplating each square in turn"

GAMESTATE
startplayer is ....	// possible values are o / x
x_to_play is (!end_of_game) && (startplayer==x  && nofo==nofx) || nofo > nofx
o_to_play is (!end_of_game) && (startplayer==o  && nofo==nofx) || nofx > nofo
end_of_game is xwon || owon || draw
// gamestate determines who (if anyone) is to move in the current position

```