Stringifying the Board

We can assign each board cell a number in a manner like this:

We don’t have objects in Ampscript, so we can use the following notation to represent the board as a single string:

set @fields = "123456789"

Then if any of the fields changes to X or O, we just replace the corresponding number with that character:

This example would be represented in this format as:

set @fields = "12X4O6789"

Win Condition

As we all know, this game must end when one player has managed to form a straight line in one of the:

  • 3 rows (r1, r2, r3)
  • 3 columns (c1, c2, c3)
  • 2 diagonals (d1, d2)

To represent each of those lines, we need to break the @fields string into pieces to build the rows, columns and diagonals:

/* Get current field values */

set @f1 = Substring(@fields, 1, 1) /* πŸ“ Top Left Corner        */
set @f2 = Substring(@fields, 2, 1) /* πŸ“ Top Middle Edge        */
set @f3 = Substring(@fields, 3, 1) /* πŸ“ Top Right Corner       */
set @f4 = Substring(@fields, 4, 1) /* πŸ“ Middle Left Edge       */
set @f5 = Substring(@fields, 5, 1) /* 🟨 Middle Middle Middle   */
set @f6 = Substring(@fields, 6, 1) /* πŸ“ Middle Right Edge      */
set @f7 = Substring(@fields, 7, 1) /* πŸ“ Bottom Left Corner     */
set @f8 = Substring(@fields, 8, 1) /* πŸ“ Bottom Middle Edge     */
set @f9 = Substring(@fields, 9, 1) /* πŸ“ Bottom Right Corner    */


/* Build rows, columns and diagonals */

set @r1 = Concat(@f1, @f2, @f3, '^')
set @r2 = Concat(@f4, @f5, @f6, '^')
set @r3 = Concat(@f7, @f8, @f9, '^')
set @c1 = Concat(@f1, @f4, @f7, '^')
set @c2 = Concat(@f2, @f5, @f8, '^')
set @c3 = Concat(@f3, @f6, @f9, '^')
set @d1 = Concat(@f1, @f5, @f9, '^')
set @d2 = Concat(@f7, @f5, @f3, '^')

The ^ character is used just as separator before we build our final @verification string that will be used to determine if anyone has won the game:

set @verification = Concat(@r1, @r2, @r3, @c1, @c2, @c3, @d1, @d2)

We can now simply use the IndexOf function to discover if any of the lines added together in the @verification string contains a sequence of three X‘s or O‘s that’s not interrupted by our ^ separator.

Board Examples
Example 1

After 4 moves:

For this board our variables would get the following values:

set @fields = "X23OO6X89"

/* Rows */
set @r1 = 'X23^'
set @r2 = 'OO6^'
set @r3 = 'X89^'

/* Columns */   
set @c1 = 'XOX^'
set @c2 = '2O8^'
set @c3 = '369^'

/* Diagonals */
set @d1 = 'XO9^'
set @d2 = 'XO3^'

set @verification = 'X23^OO6^X89^XOX^2O8^369^XO9^XO3^'
Example 2

After 6 moves:

For this board our variables would get the following values:

set @fields = 'XXO4O67OX'

/* Rows */
set @r1 = 'XXO^'
set @r2 = '4O6^'
set @r3 = '7OX^'

/* Columns */       
set @c1 = 'X47^'
set @c2 = 'XOO^'
set @c3 = 'O6X^'

/* Diagonals */ 
set @d1 = 'XOX^'
set @d2 = '7OO^'
    
set @verification = 'XXO^4O6^7OX^X47^XOO^O6X^XOX^7OO^'
Example 3

A draw after 9 moves:

For this board our variables would get the following values:

set @fields = 'XOOOXXXOX'
    
/* Rows */
set @r1 = 'XOO^'
set @r2 = 'OXX^'
set @r3 = 'XOX^'

/* Columns */   
set @c1 = 'XOX^'
set @c2 = 'OXO^'
set @c3 = 'OXX^'
    
/* Diagonals */ 
set @d1 = 'XXX^'
set @d2 = 'XXO^'

set @verification = 'XOO^OXX^XOX^XOX^OXO^OXX^XXX^XXO^'