Esempio n. 1
0
class Gomoku:
    def __init__(self):
        self.player1 = Policy("X")
        self.AI_Sec = AI("O")
        self.board = Board()
        self.computer = Policy(self.AI_Sec.shape)


# self is object itself (in this case gomoku)
# capitalize objects and classes

    def play(self):
        while True:
            turn_x = input("Player 1 turn x: ")
            turn_y = input("Player 1 turn y: ")

            while not (self.player1.CheckLegal(self.board, int(turn_x),
                                               int(turn_y))):
                print("Please type again")
                turn_x = input("Player 1 turn x: ")
                turn_y = input("Player 1 turn y: ")
            self.player1.MakeMove(self.board, int(turn_x), int(turn_y))

            if self.player1.checkWin(self.board, int(turn_x), int(turn_y)):
                print("Player 1 wins")
                return

        #turn_x = input("Player 2 turn x: ")
        #turn_y = input("Player 2 turn y: ")

        # while not (self.player2.CheckLegal(self.board, int(turn_x), int(turn_y))):
        #turn_x = input("Player 2 turn x: ")
        #turn_y = input("Player 2 turn y: ")
            computerMove = self.AI_Sec.findBestMove(self.board)
            x, y = computerMove[0], computerMove[1]
            print(x)
            print(y)
            self.computer.MakeMove(self.board, x, y)
            if self.computer.checkWin(self.board, x, y):
                print("Computer wins")
                return
Esempio n. 2
0
class TicTacToe:
    def __init__(self):
        self.player1 = Policy("X")
        self.AI_Sec = AI("O")
        self.board = Board()
        self.computer = Policy(self.AI_Sec.computerShape)

    def play(self):
        while True:
            boardStatus = self.board.DrawBoard()
            print(boardStatus)
            turn_x = input("Player 1 turn x: ")
            turn_y = input("Player 1 turn y: ")

            while not (self.player1.CheckLegal(self.board, int(turn_x),
                                               int(turn_y))):
                print("Please type again")
                turn_x = input("Player 1 turn x: ")
                turn_y = input("Player 1 turn y: ")
            self.player1.MakeMove(self.board, int(turn_x), int(turn_y))

            if self.player1.checkWin(self.board, int(turn_x), int(turn_y)):
                print("Player 1 wins")
                return

            computerMove = self.AI_Sec.findBestMove(self.board)
            x, y = computerMove[0], computerMove[1]
            print("The x-cord: " + str(x))
            print("The y-cord: " + str(y))
            self.computer.MakeMove(self.board, x, y)
            if self.computer.checkWin(self.board, x, y):
                print("Computer wins")
                return

            if self.board.isFull():
                print("Tie!")
                return
Esempio n. 3
0
class AI:
    def __init__(self, Computer):
        self.shape = Computer
        self.computer = Policy(self.shape)
        self.player = Policy("X")

    def Opponent(self):
        if self.shape == "X":
            return "O"
        return "X"

    # Check if there is any spaces left on board
    def moveLeft(self, board):
        for i in range(9):
            for j in range(9):
                if board.config[i][j] == 0:
                    return True

        return False

    # Check if the maxPlayer or minPlayer win or not
    def Evaluate(self, board, maxPlayer, x, y):
        if maxPlayer:
            if self.computer.checkWin(board, x, y):
                return 10
        else:
            if self.player.checkWin(board, x, y):
                return -10

        return 0

    #
    def MiniMax(self, board, depth, maxPlayer, alpha, beta, x, y, Score):
        score = self.Evaluate(board, not (maxPlayer), x, y)
        # print("board")
        # print(board.config)
        # print(depth)
        if depth == 4:
            return Score

        if score == 10:
            #print("The maxPlayer has won")
            #print(score - depth)
            return score - depth
        elif score == -10:
            #print("The minPlayer has won")
            # print(score)
            #print(score + depth)
            return score + depth

        if self.moveLeft(board) == False:
            #print("The board is full")
            return 0

        if maxPlayer:
            best = -10000000
            for i in range(9):
                for j in range(9):
                    if board.config[i][j] == 0:
                        board.config[i][j] = self.shape
                        score = self.MiniMax(board,
                                             depth + 1,
                                             not (maxPlayer),
                                             alpha,
                                             beta,
                                             i,
                                             j,
                                             Score=score)
                        best = max(best, score)
                        alpha = max(alpha, best)
                        board.config[i][j] = 0
                        if beta <= alpha:
                            break
            return best

        else:
            best = 10000000
            for i in range(9):
                for j in range(9):
                    if board.config[i][j] == 0:
                        board.config[i][j] = "X"
                        score = self.MiniMax(board,
                                             depth + 1,
                                             not (maxPlayer),
                                             alpha,
                                             beta,
                                             i,
                                             j,
                                             Score=score)
                        best = min(best, score)
                        beta = min(beta, best)
                        board.config[i][j] = 0
                        if beta <= alpha:
                            break
            return best

    def findBestMove(self, board):
        bestVal = -1000
        bestCol = -1
        bestRow = -1
        Score = int()
        # print("board")
        # print(board.config)
        # print(self.Opponent())
        for x in range(9):
            for y in range(9):
                if board.config[x][y] == 0:
                    board.config[x][y] = self.shape
                    # print("before")
                    # print(board.config)
                    # print(x)
                    # print(y)
                    currentVal = self.MiniMax(board, 0, False, -math.inf,
                                              math.inf, x, y, Score)
                    board.config[x][y] = 0
                    # print("after")
                    # print(board.config)
                    # print(x)
                    # print(y)
                    # print("Current Val")
                    # print(currentVal)
                    print(currentVal)
                    if currentVal > bestVal:
                        bestVal = currentVal
                        bestRow = x
                        bestCol = y
                # print("Final")
                # print(board.config)
                # print(x)
                # print(y)
        print("the best value: " + str(bestVal))
        print("computer choose the row: " + str(bestRow))
        print("computer choose the column: " + str(bestCol))
        # print(board.config)

        return [bestRow, bestCol]

    def computerMove(self, board, x, y):
        # move = self.findBestMove(board)
        # x, y = move[0], move[1]
        # print("x,y")
        # print(x)
        # print(y)
        # print(board.config)
        self.computer.MakeMove(board, x, y)

    # Check if the computer win
    def isWin(self, board, x, y):
        return self.computer.checkWin(board, x, y)
Esempio n. 4
0
class AI:
    def __init__(self, Computer):
        self.shape = Computer
        self.computer = Policy(self.shape)

    def Opponent(self):
        if self.shape == "X":
            return "O"
        return "X"

    # Check if there is any spaces left on board
    def moveLeft(self, board):
        for i in range(15):
            for j in range(15):
                if board.config[i][j] == 0:
                    return True

        return False

    # Check if the maxPlayer or minPlayer win or not
    def Evaluate(self, board, maxPlayer, x, y):
        if maxPlayer:
            if self.computer.checkWin(board, x, y):
                return 10
        else:
            if self.computer.checkWin(board, x, y):
                return -10

        return 0

    def MiniMax(self, board, depth, maxPlayer, x, y):
        score = self.Evaluate(board, maxPlayer, x, y)
        # print(score)

        if score == 10:
            # print("The maxPlayer has won")  # checking cast if the computer won
            return score - depth
        elif score == -10:
            # checking the cast if the player won
            #print("The minPlayer has won")
            return score + depth

        if self.moveLeft(board):  #
            #print("The board is full")
            return 0

        if maxPlayer:
            best = -1000000
            for x in range(15):
                for y in range(15):
                    # if board.config[x][y] == 0:
                    if self.computer.CheckLegal(board, x, y):
                        board.config[x][y] = self.shape
                        score = self.MiniMax(
                            board, depth + 1, not(maxPlayer), x, y)
                        if score > best:
                            best = score
                    board.config[x][y] = 0
            return best

        else:
            best = 10000000
            for i in range(15):
                for j in range(15):
                    # if board.config[i][j] == 0:
                    if self.computer.CheckLegal(board, x, y):
                        board.config[i][j] = self.Opponent()
                        score = self.MiniMax(
                            board, depth + 1, not(maxPlayer), i, j)
                        if score < best:
                            best = score
                    board.config[i][j] = 0
            return best

    # Finding the best move
    def findBestMove(self, board):
        bestVal = -10000
        bestCol = -1
        bestRow = -1

        for x in range(15):
            for y in range(15):
                currentVal = self.MiniMax(board, 0, True, x, y)
                if currentVal > bestVal:
                    bestVal = currentVal
                    bestRow = x
                    bestCol = y
        #print("the best value: " + str(bestVal))
        #print("computer choose the row: " + str(bestRow))
        #print("computer choose the column: " + str(bestCol))

        return [bestRow, bestCol]
    # Computer makes a move

    def computerMove(self, board):
        move = self.findBestMove(board)
        x, y = move[0], move[1]

    # Check if the computer win
    def isWin(self, board, x, y):
        return self.computer.checkWin(board, x, y)
Esempio n. 5
0
class AI:
    def __init__(self, computerShape):
        self.computerShape = computerShape
        self.computer = Policy(self.computerShape)
        self.humanShape = "X"
        self.human = Policy(self.humanShape)
        self.point = {"Computer": 10, "Human": -10, "Tie": 0}

    def moveLeft(self, board):
        return not (board.isFull())

    def validMoves(self, board):
        moves = []
        for i in range(board.row):
            for j in range(board.column):
                if board.config[i][j] == 0:
                    pass
        pass

    def Win(self, shape):
        winner = Policy(shape)
        return winner.checkWin(board, x, y)

    def Evaluate(self, board, isMaximizing, x, y):
        if isMaximizing:
            if self.computer.checkWin(board, x, y):
                return "Computer"
        else:
            if self.human.checkWin(board, x, y):
                return "Human"
        return "Tie"

    def miniMax(self, board, depth, isMaximizing, x, y):
        score = self.point[self.Evaluate(board, not (isMaximizing), x, y)]

        if score == 10:
            return score - depth

        elif score == -10:
            return score + depth

        if self.moveLeft(board) == False:
            return 0

        if isMaximizing:
            bestScore = -math.inf
            for x in range(board.row):
                for y in range(board.column):
                    if board.config[x][y] == 0:
                        board.config[x][y] = self.computerShape
                        score = self.miniMax(board, depth + 1,
                                             not (isMaximizing), x, y)
                        bestScore = max(score, bestScore)
                        board.config[x][y] = 0

            return bestScore
        else:
            bestScore = math.inf
            for i in range(board.row):
                for j in range(board.column):
                    if board.config[i][j] == 0:
                        board.config[i][j] = self.humanShape
                        score = self.miniMax(board, depth + 1,
                                             not (isMaximizing), i, j)
                        bestScore = min(score, bestScore)
                        board.config[i][j] = 0

            return bestScore

    def findBestMove(self, board):
        bestScore = -math.inf
        row = int()
        column = int()

        for i in range(board.row):
            for j in range(board.column):
                pos = board.config[i][j]
                if pos == 0:
                    board.config[i][j] = self.computerShape
                    currentScore = self.miniMax(board, 0, False, i, j)
                    #print("Computer evals this move: " + str(currentScore))
                    board.config[i][j] = 0
                    if currentScore > bestScore:
                        row = i
                        column = j
                        bestScore = currentScore

        return [row, column]
Esempio n. 6
0
 def Win(self, shape):
     winner = Policy(shape)
     return winner.checkWin(board, x, y)