Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- _G.m = math
- local AI = nil
- local Player = nil
- local Board = {
- {1, 2, 3},
- {4, 5, 6},
- {7, 8, 9}
- }
- local PrevPlayed = nil
- local Turn = nil
- -- Basic Function TicTacToe
- function DrawBoard()
- print(string.rep("-", 13))
- for i = 1, 3 do
- print("| "..tostring(Board[i][1]).." | "..tostring(Board[i][2]).." | "..tostring(Board[i][3]).." |")
- end
- print(string.rep("-", 13))
- end
- function ChooseTeam()
- ::again::
- io.write("Choose You Team (O or X) : ")
- local PlayerInput = string.upper(io.read())
- if PlayerInput == "O" then
- Player = PlayerInput
- AI = "X"
- elseif PlayerInput == "X" then
- Player = PlayerInput
- AI = "O"
- else
- print("Invaild Team, Choose Again")
- goto again
- end
- end
- function StartTurn()
- local n = m.random(1, 2)
- if n == 1 then Turn = Player else Turn = AI end
- end
- function IsAbleToFill(row, col)
- return type(Board[row][col])=="number"
- end
- function IsTie()
- for i = 1,3 do
- for j= 1, 3 do
- if IsAbleToFill(i, j) then
- return false
- end
- end
- end
- return true
- end
- function IsGameOver()
- for i = 1, 3 do
- -- Check Left or Right
- if Board[i][1] == Board[i][2] and Board[i][2] == Board[i][3] then
- return true
- -- Check Up and Down
- elseif Board[1][i] == Board[2][i] and Board[2][i] == Board[3][i] then
- return true
- end
- end
- -- More
- if Board[1][1] == Board[2][2] and Board[2][2] == Board[3][3] then
- return true
- elseif Board[1][3] == Board[2][2] and Board[2][2] == Board[3][1] then
- return true
- end
- return false
- end
- function PlayerFillBoard(row, col)
- if IsAbleToFill(row, col) then
- Board[row][col] = Player
- else
- return
- end
- end
- function AutoPlayRound()
- -- Function
- local function PlayerPlay()
- print("Player Turn!:")
- ::again::
- io.write("Choose to Fill Board from 1-9: ")
- local row, col
- local PlayerInput = tonumber(io.read())
- if PlayerInput > 9 then print("Invaild Team Try Again") goto again end
- -- Player Handle Choosing
- if PlayerInput <= 3 then
- row, col = 1, PlayerInput
- if not IsAbleToFill(row, col) then print("Board Already Filled Choose Another") goto again end
- PlayerFillBoard(row, col)
- elseif PlayerInput <= 6 then
- row, col = 2, PlayerInput-3
- if not IsAbleToFill(row, col) then print("Board Already Filled Choose Another") goto again end
- PlayerFillBoard(row, col)
- elseif PlayerInput <= 9 then
- print("AI Turn!:")
- row, col = 3, PlayerInput-6
- if not IsAbleToFill(row, col) then print("Board Already Filled Choose Another") goto again end
- PlayerFillBoard(row, col)
- end
- -- Change Turn
- PrevPlayed = Player
- Turn = AI
- end
- local function AIPlay()
- print("AI is Thinking and Choosing...")
- AIFill()
- PrevPlayed = AI
- Turn = Player
- end
- -- Turn AutoPlay
- if Turn == Player then PlayerPlay() else AIPlay() end
- end
- -- Minimax AI code
- function MiniMaxCheckGameOver()
- for i = 1, 3 do
- -- Check Left or Right
- if Board[i][1] == Board[i][2] and Board[i][2] == Board[i][3] then
- return Board[i][1]
- -- Check Up and Down
- elseif Board[1][i] == Board[2][i] and Board[2][i] == Board[3][i] then
- return Board[1][i]
- end
- end
- -- More
- if Board[1][1] == Board[2][2] and Board[2][2] == Board[3][3] then
- return Board[1][1]
- elseif Board[1][3] == Board[2][2] and Board[2][2] == Board[3][1] then
- return Board[1][3]
- end
- return nil
- end
- function MiniMax(ismaxing)
- if MiniMaxCheckGameOver() == AI then return 1 end
- if MiniMaxCheckGameOver() == Player then return -1 end
- if IsTie() then return 0 end
- if ismaxing then
- -- MaxScore
- local maxscore = -m.huge
- for i = 1,3 do
- for j = 1, 3 do
- if IsAbleToFill(i, j) then
- local temp = Board[i][j]
- Board[i][j] = AI
- local score = MiniMax(false)
- maxscore = m.max(score, maxscore)
- Board[i][j] = temp
- end
- end
- end
- return maxscore
- else
- -- MinScore
- local minscore = m.huge
- for i = 1,3 do
- for j = 1, 3 do
- if IsAbleToFill(i, j) then
- local temp = Board[i][j]
- Board[i][j] = AI
- local score = MiniMax(true)
- minscore = m.max(score, minscore)
- Board[i][j] = temp
- end
- end
- end
- return minscore
- end
- end
- function AIFill()
- local bestscore = -m.huge
- local bestfill = nil
- for i = 1, 3 do
- for j = 1,3 do
- if IsAbleToFill(i, j) then
- local score = MiniMax(false)
- if score > bestscore then
- bestscore = score
- bestfill = {i, j}
- end
- end
- end
- end
- Board[bestfill[1]][bestfill[2]] = AI
- end
- -- Main Game Code
- ChooseTeam()
- StartTurn()
- while true do
- DrawBoard()
- if IsGameOver() then print("Game Over Winner : "..PrevPlayed) break end
- if IsTie() then print("Game Tie!") break end
- AutoPlayRound()
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement