Exemple #1
0
class GameController():
    def __init__(self):
        self.mode = {'2': self.humanVsBot, '1': self.botVsbot}
        print(
            "\033[94m===================================================================\033[0m\033[22m"
        )
        self.control = input(
            "Please select mode: \n\t1, Bot Vs Bot\n\t2, Human vs Bot\n")
        self.mode[self.control]()

    def humanVsBot(self):
        while True:
            print(
                "\033[94m===================================================================\033[0m\033[22m"
            )
            control = input("Do you want to play first: (y/n)? ")
            if control == "y":
                self.redSide = HumanPlayer("Tuan", redSide=True)
                self.notRedSide = AIPlayer("AI", redSide=False)
            else:
                self.redSide = AIPlayer("AI", redSide=True)
                self.notRedSide = HumanPlayer("Tuan", redSide=False)
            self.game = Game(self.redSide, self.notRedSide)
            self.game.printBoard()
            print(
                "\nWelcome! To play, enter a command, e.g. '\033[95mh3\033[0m'. 'h' for horizontal and 'v' for vertical."
            )
            while not self.game.isEnd():
                self.redSideMove()
                if not self.game.isEnd():
                    self.notRedSideMove()
                    if self.game.isEnd():
                        self.printResult()
                    continue
                else:
                    self.printResult()

    def botVsbot(self):
        self.redSide = LimitAIPlayer("BOT limit", redSide=True)
        self.notRedSide = AIPlayer("BOT mini", redSide=False)
        self.game = Game(self.redSide, self.notRedSide)
        self.game.printBoard()
        while not self.game.isEnd():
            self.redSideMove()
            if not self.game.isEnd():
                self.notRedSideMove()
                if self.game.isEnd():
                    self.printResult()
                continue
            else:
                self.printResult()

    def redSideMove(self):
        if self.redSide.isHumanPlayer():
            user_move = input("\n Make a move: \033[31m")
            print("\033[0m")
            while user_move not in self.game.getMoves():
                user_move = input("Please enter a valid move: ")
            self.game.applyMove(user_move, self.redSide)
            self.game.printBoard()
        else:
            computer_move = self.redSide.makeMove(self.game.getBoard(), True)
            # print(f"Thoi gian: {time.time() - start}")
            self.game.applyMove(computer_move, self.redSide)
            print(
                f"{self.redSide.name} choose \033[31m{str(computer_move)}\033[0m"
            )
            self.game.printBoard()

    def notRedSideMove(self):
        if self.notRedSide.isHumanPlayer():
            user_move = input("\n Make a move: \033[34m")
            print("\033[0m")
            while user_move not in self.game.getMoves():
                user_move = input("Please enter a valid move: ")
            self.game.applyMove(user_move, self.notRedSide)
            self.game.printBoard()
        else:
            computer_move = self.notRedSide.makeMove(self.game.getBoard(),
                                                     False)
            # print(f"Thoi gian: {time.time() - start}")
            self.game.applyMove(computer_move, self.notRedSide)
            print(
                f"{self.notRedSide.name} choose \033[34m{str(computer_move)}\033[0m"
            )
            self.game.printBoard()

    def printResult(self):
        print("Result: " + self.game.getStatus())
        control = input("Do you want to continue? (y/n) ")
        if control == "y":
            self.mode[self.control]()
        else:
            exit()
class TestGame(unittest.TestCase):
    def setUp(self):
        self.testGame = game.Game()
        # self.playerAI = AIPlayer("X")
        # board setup

    def test_playerMove1(self):
        self.playerAI = AIPlayer("X")
        self.testGame.makeMove((6, 6), "X")
        self.testGame.makeMove((7, 6), "X")
        self.testGame.makeMove((7, 7), "X")
        self.testGame.makeMove((8, 6), "X")
        self.testGame.makeMove((6, 8), "O")
        self.testGame.makeMove((7, 8), "O")
        self.testGame.makeMove((8, 7), "O")
        self.testGame.makeMove((9, 6), "O")
        # print(self.testGame.getPlayerScore("X"), self.testGame.getPlayerScore("O"))
        coord = self.playerAI.makeMove(self.testGame)
        possiblePlay1 = (6, 9)
        possiblePlay2 = (10, 5)
        # print(coord)
        self.assertTrue(coord == possiblePlay1 or coord == possiblePlay2)

    def test_playerMove2(self):
        self.playerAI = AIPlayer("X")
        self.testGame.makeMove((6, 10), "X")
        self.testGame.makeMove((7, 9), "X")
        self.testGame.makeMove((8, 8), "X")
        self.testGame.makeMove((9, 7), "X")
        self.testGame.makeMove((1, 1), "O")
        self.testGame.makeMove((8, 9), "O")
        self.testGame.makeMove((8, 10), "O")
        self.testGame.makeMove((9, 5), "O")
        print(self.testGame.getPlayerScore("X"),
              self.testGame.getPlayerScore("O"))
        coord = self.playerAI.makeMove(self.testGame)
        possiblePlay1 = (5, 11)
        possiblePlay2 = (10, 6)
        print(coord)
        self.assertTrue(coord == possiblePlay1 or coord == possiblePlay2)

    # test doesn't work as expected... plays on (14, 10)
    def test_playerMove3(self):
        self.playerAI = AIPlayer("O")
        self.testGame.makeMove((5, 9), "X")
        self.testGame.makeMove((6, 7), "X")
        self.testGame.makeMove((6, 11), "X")
        self.testGame.makeMove((7, 8), "X")
        self.testGame.makeMove((7, 9), "X")
        self.testGame.makeMove((8, 6), "X")
        self.testGame.makeMove((8, 8), "X")
        self.testGame.makeMove((8, 10), "X")
        self.testGame.makeMove((9, 6), "X")
        self.testGame.makeMove((9, 7), "X")
        self.testGame.makeMove((9, 8), "X")
        self.testGame.makeMove((9, 10), "X")
        self.testGame.makeMove((12, 6), "X")

        self.testGame.makeMove((6, 8), "O")
        self.testGame.makeMove((6, 9), "O")
        self.testGame.makeMove((6, 10), "O")
        self.testGame.makeMove((7, 7), "O")
        self.testGame.makeMove((7, 10), "O")
        self.testGame.makeMove((8, 9), "O")
        self.testGame.makeMove((9, 5), "O")
        self.testGame.makeMove((9, 7), "O")
        self.testGame.makeMove((10, 6), "O")
        self.testGame.makeMove((10, 8), "O")
        self.testGame.makeMove((11, 7), "O")
        self.testGame.makeMove((12, 8), "O")
        print(self.testGame.getPlayerScore("X"),
              self.testGame.getPlayerScore("O"))
        coord = self.playerAI.makeMove(self.testGame)
        possiblePlay1 = (8, 4)
        possiblePlay2 = (13, 9)
        print(coord)
        self.assertTrue(coord == possiblePlay1 or coord == possiblePlay2)