Крестики и нолики.CT

Игра с рандомом. Есть счет.
Запускается через таблицу в аттаче.
Здесь мог быть AI на Lua, возвращающий номер клетки от 1 до 9.
function InputAI()
 -- рандом
 return math.random (1, 9)
end
player1Symbol = '1'
player2Symbol = '0'
whoStep = 0
player1Score = 0
player2Score = 0
function InputAI()
 -- рандом
 return math.random (1, 9)
end
\-- Проверка правил
function caheckRules(symbol)
  -- Комбинации выигрыша
  local tableRules =
  {
    {1,2,3}, {4,5,6}, {7,8,9},  -- горизонтальные клетки
    {1,4,7}, {2,5,8}, {3,6,9},  -- вертикальные клетки
    {1,5,9}, {3,5,7}            -- клетки по диагонали
  }
  -- Результат проверки клеток
  local mask = [[
    return UDF1.CEButton%s.Caption == 'symbol' and
           UDF1.CEButton%s.Caption == 'symbol' and
           UDF1.CEButton%s.Caption == 'symbol'
  ]]
  for i = 1, #tableRules do
    local luaStringCode = mask:format(tableRules[i][1],
      tableRules[i][2], tableRules[i][3]):gsub('symbol', symbol)
    if loadstring (luaStringCode)() then
      return true
    end
  end
  return false
end
function StartGame()
  whoStep = 0
  for i = 1, 9 do
    loadstring ('UDF1.CEButton'..i..'.Caption = ""')()
  end
end
\-- 1 - ход сделан, 0 - ход не удался
function Input(indexInput)
  if loadstring ('return UDF1.CEButton'..indexInput..'.Caption')() ~= '' then
    return 0
  end
  local writeSymbol = player1Symbol
  if whoStep == 0 then
    whoStep = 1
  else
    whoStep = 0
    writeSymbol = player2Symbol
  end
  local s = 'UDF1.CEButton'..indexInput..'.Caption = '..writeSymbol
  loadstring (s)()
  local somebodyWinner = false
  if caheckRules(player1Symbol) then
    player1Score = player1Score + 1
    UDF1.CELabelScore.Caption = player1Score..':'..player2Score
    ShowMessage('Player1 is winner!')
    somebodyWinner = true
  elseif caheckRules(player2Symbol) then
    player2Score = player2Score + 1
    UDF1.CELabelScore.Caption = player1Score..':'..player2Score
    ShowMessage('Player2 is winner!')
    somebodyWinner = true
  end
  -- Если кто-то выиграл, то очистить поле
  if somebodyWinner then
    StartGame()
    return 1
  end
  --  Проверка ничьи
  local countEmpty = 9
  for i = 1, 9 do
    if loadstring ('return UDF1.CEButton'..i..'.Caption ~= ""')() then
      countEmpty = countEmpty - 1
    end
  end
  if countEmpty <= 0 then
    UDF1.CELabelScore.Caption = player1Score..':'..player2Score
    ShowMessage('Friendship!')
    StartGame()
    return 1
  end
  -- Ходит IA
  if whoStep == 1 then
    ::repeat1::
    local index = InputAI()
    if Input(index) == 0 then
      goto repeat1
    end
  end
end
function CEButtonClick(sender)
  Input(tonumber(sender.name:match('%d')))
end
function MenuItem1Click(sender)
  player1Score = 0
  player2Score = 0
  UDF1.CELabelScore.Caption = player1Score..':'..player2Score
  StartGame()
  ShowMessage('Restart!')
end
UDF1.show()