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)