Advertisement
SigmaBoy456

Lua MiniMax AI tictactoe(Easy Mode AI)

Feb 21st, 2025
137
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 5.61 KB | None | 0 0
  1. _G.m = math
  2. local AI = nil
  3. local Player = nil
  4. local Board = {
  5.     {1, 2, 3},
  6.     {4, 5, 6},
  7.     {7, 8, 9}
  8. }
  9. local PrevPlayed = nil
  10. local Turn = nil
  11.  
  12. -- Basic Function TicTacToe
  13. function DrawBoard()
  14.     print(string.rep("-", 13))
  15.     for i = 1, 3 do
  16.         print("| "..tostring(Board[i][1]).." | "..tostring(Board[i][2]).." | "..tostring(Board[i][3]).." |")
  17.     end
  18.     print(string.rep("-", 13))
  19. end
  20.  
  21. function ChooseTeam()
  22.     ::again::
  23.     io.write("Choose You Team (O or X) : ")
  24.     local PlayerInput = string.upper(io.read())
  25.     if PlayerInput == "O" then
  26.         Player = PlayerInput
  27.         AI = "X"
  28.     elseif PlayerInput == "X" then
  29.         Player = PlayerInput
  30.         AI = "O"
  31.     else
  32.         print("Invaild Team, Choose Again")
  33.         goto again
  34.     end
  35. end
  36.  
  37. function StartTurn()
  38.     local n = m.random(1, 2)
  39.     if n == 1 then Turn = Player else Turn = AI end
  40. end
  41.  
  42. function IsAbleToFill(row, col)
  43.     return type(Board[row][col])=="number"
  44. end
  45.  
  46. function IsTie()
  47.     for i = 1,3 do
  48.         for j= 1, 3 do
  49.             if IsAbleToFill(i, j) then
  50.                 return false
  51.             end
  52.         end
  53.     end
  54.     return true
  55. end
  56.  
  57. function IsGameOver()
  58.     for i = 1, 3 do
  59.         -- Check Left or Right
  60.         if Board[i][1] == Board[i][2] and Board[i][2] == Board[i][3] then
  61.             return true
  62.         -- Check Up and Down
  63.         elseif Board[1][i] == Board[2][i] and Board[2][i] == Board[3][i] then
  64.             return true
  65.         end
  66.     end
  67.     -- More
  68.     if Board[1][1] == Board[2][2] and Board[2][2] == Board[3][3] then
  69.         return true
  70.     elseif Board[1][3] == Board[2][2] and Board[2][2] == Board[3][1] then
  71.         return true
  72.     end
  73.     return false
  74. end
  75.  
  76. function PlayerFillBoard(row, col)
  77.     if IsAbleToFill(row, col) then
  78.         Board[row][col] = Player
  79.     else
  80.         return
  81.     end
  82. end
  83.  
  84. function AutoPlayRound()
  85.     -- Function
  86.     local function PlayerPlay()
  87.         print("Player Turn!:")
  88.         ::again::
  89.         io.write("Choose to Fill Board from 1-9: ")
  90.         local row, col
  91.         local PlayerInput = tonumber(io.read())
  92.         if PlayerInput > 9 then print("Invaild Team Try Again") goto again end
  93.         -- Player Handle Choosing
  94.         if PlayerInput <= 3 then
  95.             row, col = 1, PlayerInput
  96.             if not IsAbleToFill(row, col) then print("Board Already Filled Choose Another") goto again end
  97.             PlayerFillBoard(row, col)
  98.         elseif PlayerInput <= 6 then
  99.             row, col = 2, PlayerInput-3
  100.             if not IsAbleToFill(row, col) then print("Board Already Filled Choose Another") goto again end
  101.             PlayerFillBoard(row, col)
  102.         elseif PlayerInput <= 9 then
  103.             print("AI Turn!:")
  104.             row, col = 3, PlayerInput-6
  105.             if not IsAbleToFill(row, col) then print("Board Already Filled Choose Another") goto again end
  106.             PlayerFillBoard(row, col)
  107.         end
  108.         -- Change Turn
  109.         PrevPlayed = Player
  110.         Turn = AI
  111.     end
  112.  
  113.     local function AIPlay()
  114.         print("AI is Thinking and Choosing...")
  115.         AIFill()
  116.         PrevPlayed = AI
  117.         Turn = Player
  118.     end
  119.     -- Turn AutoPlay
  120.     if Turn == Player then PlayerPlay() else AIPlay() end
  121. end
  122. -- Minimax AI code
  123.  
  124. function MiniMaxCheckGameOver()
  125.     for i = 1, 3 do
  126.         -- Check Left or Right
  127.         if Board[i][1] == Board[i][2] and Board[i][2] == Board[i][3] then
  128.             return Board[i][1]
  129.         -- Check Up and Down
  130.         elseif Board[1][i] == Board[2][i] and Board[2][i] == Board[3][i] then
  131.             return Board[1][i]
  132.         end
  133.     end
  134.     -- More
  135.     if Board[1][1] == Board[2][2] and Board[2][2] == Board[3][3] then
  136.         return Board[1][1]
  137.     elseif Board[1][3] == Board[2][2] and Board[2][2] == Board[3][1] then
  138.         return Board[1][3]
  139.     end
  140.     return nil
  141. end
  142.  
  143. function MiniMax(ismaxing)
  144.     if MiniMaxCheckGameOver() == AI then return 1 end
  145.     if MiniMaxCheckGameOver() == Player then return -1 end
  146.     if IsTie() then return 0 end
  147.     if ismaxing then
  148.         -- MaxScore
  149.         local maxscore = -m.huge
  150.         for i = 1,3 do
  151.             for j = 1, 3 do
  152.                 if IsAbleToFill(i, j) then
  153.                     local temp = Board[i][j]
  154.                     Board[i][j] = AI
  155.                     local score = MiniMax(false)
  156.                     maxscore = m.max(score, maxscore)
  157.                     Board[i][j] = temp
  158.                 end
  159.             end
  160.         end
  161.         return maxscore
  162.     else
  163.         -- MinScore
  164.         local minscore = m.huge
  165.         for i = 1,3 do
  166.             for j = 1, 3 do
  167.                 if IsAbleToFill(i, j) then
  168.                     local temp = Board[i][j]
  169.                     Board[i][j] = AI
  170.                     local score = MiniMax(true)
  171.                     minscore = m.max(score, minscore)
  172.                     Board[i][j] = temp
  173.                 end
  174.             end
  175.         end
  176.         return minscore
  177.     end
  178. end
  179.  
  180. function AIFill()
  181.     local bestscore = -m.huge
  182.     local bestfill = nil
  183.     for i = 1, 3 do
  184.         for j = 1,3 do
  185.             if IsAbleToFill(i, j) then
  186.                 local score = MiniMax(false)
  187.                 if score > bestscore then
  188.                     bestscore = score
  189.                     bestfill = {i, j}
  190.                 end
  191.             end
  192.         end
  193.     end
  194.     Board[bestfill[1]][bestfill[2]] = AI
  195. end
  196. -- Main Game Code
  197. ChooseTeam()
  198. StartTurn()
  199. while true do
  200.     DrawBoard()
  201.     if IsGameOver() then print("Game Over Winner : "..PrevPlayed) break end
  202.     if IsTie() then print("Game Tie!") break end
  203.     AutoPlayRound()
  204. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement