Exemple #1
0
class Game:
    def __init__(self, m, n, mode):

        # init all events
        EventManager.initEvents()

        EventManager.subscribe("GameFinished", self.onGameFinished)
        EventManager.subscribe("GameStarted", self.onGameStarted)

        # save size and mode
        self.size = [m, n]
        self.mode = mode

        # just to init the value
        self._currentPlayer = 1

        # instantiate model and view
        self.HexBoard = HexBoard(self.size[0], self.size[1])
        self.HexBoard.setReferenceToGame(self)

        if self.UIRequired():
            self.HexGUI = HexGUI(self.size[0], self.size[1], self)
        else:
            self.MachineGUI = MachineGUI(self.size[0], self.size[1], self)

        # set the game to entry point
        self.start(self._currentPlayer)

        if self.UIRequired():
            # main loop starts for event receiving
            self.HexGUI.mainloop()

        if self.UIRequired() == False:
            self.MachineGUI.gameLoop()

    def UIRequired(self):
        if self.mode == "human" or self.mode == "ki" or self.mode == "inter":
            return True
        else:
            return False

    def start(self, firstPlayer):

        EventManager.notify("GameStarting")

        # move counter init
        self.moveCounter = 0

        # generate fresh state
        self.HexBoard = HexBoard(self.size[0], self.size[1])
        self.HexBoard.setReferenceToGame(self)

        # current player depending on decision
        self._currentPlayer = firstPlayer

        # if random number wanted, generate one
        if firstPlayer == 0:
            self.chooseFirst()

        EventManager.notify("GameStarted")

    def onGameStarted(self):

        if self.UIRequired():
            # draw the gui
            self.HexGUI.draw()

    # Game finished event
    def onGameFinished(self):

        if self.UIRequired():
            # move over to main menu and present the winner
            self.HexGUI.openPage("menu")
            self.HexGUI.won(self.HexBoard.winner())

    # generate random player number
    def chooseFirst(self):
        self._currentPlayer = round(random.random()) + 1

    # is the getter for the private variable
    def currentPlayer(self):
        return self._currentPlayer

    # alter the players
    def changePlayer(self):
        if self._currentPlayer == 1:
            self._currentPlayer = 2
        else:
            self._currentPlayer = 1

    # control flow for click event
    def makeMove(self, move):

        # Notify
        EventManager.notify("MoveBegan")

        # if already marked dont do anything
        if self.HexBoard.isMarked(move[1], move[0]):
            EventManager.notify("MoveDenied")

        else:

            # otherwise count the click
            self.moveCounter = self.moveCounter + 1

            # notify Model
            self.HexBoard.receiveMove(move)

            # notify View
            self.changePlayer()
            EventManager.notify("PlayerChanged")

        EventManager.notify("MoveFinished")
Exemple #2
0
class Game:
    def __init__(self, m, n, mode):

        # init all events
        EventManager.initEvents()

        EventManager.subscribe("GameFinished", self.onGameFinished)
        EventManager.subscribe("GameStarted", self.onGameStarted)

        # save size and mode
        self.size = [m, n]
        self.mode = mode

        # just to init the value
        self._currentPlayer = 1
        self._currentPlayerType = "human"

        # instantiate model and view
        self.HexBoard = HexBoard(self.size[0], self.size[1])
        self.HexBoard.setReferenceToGame(self)

        if self.UIRequired():
            self.HexGUI = HexGUI(self.size[0], self.size[1], self)
        else:
            self.MachineGUI = MachineGUI(self.size[0], self.size[1], self)

        if self.mode == "ki" or self.mode == "machine":
            self.KI = PatternKI(self)

        # set the game to entry point
        self.start(self._currentPlayer)

        if self.UIRequired():
            # main loop starts for event receiving
            self.HexGUI.mainloop()

        if self.UIRequired() == False:
            self.MachineGUI.gameLoop()

    def UIRequired(self):
        if self.mode == "human" or self.mode == "ki" or self.mode == "inter":
            return True
        else:
            return False

    def start(self, firstPlayer):

        EventManager.notify("GameStarting")

        # move counter init
        self.moveCounter = 0

        # generate fresh state
        self.HexBoard = HexBoard(self.size[0], self.size[1])
        self.HexBoard.setReferenceToGame(self)

        # current player depending on decision
        self._currentPlayer = firstPlayer

        if self.mode == "ki" or self.mode == "machine":
            self.KI = PatternKI(self)

        # if random number wanted, generate one
        if firstPlayer == 0:
            self.chooseFirst()

        EventManager.notify("GameStarted")

    def onGameStarted(self):

        if self.UIRequired():
            # draw the gui
            self.HexGUI.draw()

    # Game finished event
    def onGameFinished(self):

        if self.UIRequired():
            # move over to main menu and present the winner
            self.HexGUI.openPage("menu")
            self.HexGUI.won(self.HexBoard.winner())

    # generate random player number
    def chooseFirst(self):
        self._currentPlayer = round(random.random()) + 1

    # is the getter for the private variable
    def currentPlayer(self):
        return self._currentPlayer

    # is the current Player human?
    def isPlayerHuman(self):
        return self._currentPlayerType == "human"

    # alter the players
    def changePlayer(self):

        if self._currentPlayer == 1:
            self._currentPlayer = 2

        else:
            self._currentPlayer = 1

        if self.mode == "ki":

            if self._currentPlayerType == "human":
                self._currentPlayerType = "ki"
            else:
                self._currentPlayerType = "human"

    # control flow for click event
    def makeMove(self, move):

        # Notify
        EventManager.notify("MoveBegan")

        # if already marked dont do anything
        if self.HexBoard.isMarked(move[1], move[0]):
            EventManager.notify("MoveDenied")

        else:

            # otherwise count the click
            self.moveCounter = self.moveCounter + 1

            # notify Model
            self.HexBoard.receiveMove(move)

            # notify View
            self.changePlayer()
            EventManager.notify("PlayerChanged")

            if not self.isPlayerHuman():
                move = self.KI.getMove()
                self.makeMove(move)

        EventManager.notify("MoveFinished")
Exemple #3
0
class Game:
    def __init__(self, m, n, mode):

        self._pause = False

        # save size and mode
        self.size = [m, n]
        self.mode = mode

        # just to init the value
        self._currentPlayer = 1
        self._currentPlayerType = "human"

        if mode == "copy":
            return

        # init all events
        EventManager.initEvents()

        EventManager.subscribe("GameFinished", self.onGameFinished)
        EventManager.subscribe("GameStarted", self.onGameStarted)
        EventManager.subscribe("MoveFinished", self.onMoveFinished)
        EventManager.subscribe("GameUILoaded", self.onGameUILoaded)
        EventManager.subscribe("ToggleVictoryPath", self.onToggleVictoryPath)

        # instantiate model and view
        self.HexBoard = HexBoard(self.size[0], self.size[1])
        self.HexBoard.setReferenceToGame(self)

        self.GameState = 0

        self.moveCounter = 0

        if self.UIRequired():
            self.HexGUI = HexGUI(self.size[0], self.size[1], self)
        else:
            self.MachineGUI = MachineGUI(self.size[0], self.size[1], self)

        if self.mode == "ki":
            self.KI = HexKI(self.size[0], self.size[1])

        if self.mode == "inter" or self.mode == "machine":

            self.KI = []
            self.KI.append(HexKI(self.size[0], self.size[1]))
            self.KI.append(HexKI(self.size[0], self.size[1]))

            self._currentPlayerType = "ki"

        # set the game to entry point
        #self.start(self._currentPlayer)

        if self.UIRequired():

            EventManager.subscribe("UITick", self.onUITick)

            # main loop starts for event receiving
            self.HexGUI.mainloop()

        if self.UIRequired() == False:
            self.GameState = 1
            self.MachineGUI.gameLoop()

    def onUITick(self):
        self.doKIMove()

    def onToggleVictoryPath(self):

        if self.UIRequired():
            vertices = self.HexBoard.getVictoryPath()
            self.HexGUI._GUIGameBoard.Pattern.toggleVictoryPath(vertices)

    def pause(self):
        self._pause = not self._pause

    def UIRequired(self):
        if self.mode == "human" or self.mode == "ki" or self.mode == "inter":
            return True
        else:
            return False

    def start(self, firstPlayer):

        self.GameState = 0

        EventManager.notify("GameStarting")

        # move counter init
        self.moveCounter = 0

        # generate fresh state
        self.HexBoard = HexBoard(self.size[0], self.size[1])
        self.HexBoard.setReferenceToGame(self)

        # current player depending on decision
        self._currentPlayer = firstPlayer

        if self.mode == "ki":
            self.KI = MonteCarloTreeSearch(self, 2)  # TODO: ki_player_id == 2?
            # self.KI = HexKI(self.size[0], self.size[1])

        if self.mode == "inter" or self.mode == "machine":

            self.KI = []
            self.KI.append(HexKI(self.size[0], self.size[1]))
            self.KI.append(HexKI(self.size[0], self.size[1]))

            self._currentPlayerType = "ki"

        # if random number wanted, generate one
        if firstPlayer == 0:
            self.chooseFirst()

        EventManager.notify("GameStarted")

    def onGameStarted(self):

        self.GameState = 1

        if self.UIRequired():
            # draw the gui
            self.HexGUI.draw()

    # Game finished event
    def onGameFinished(self):

        self.GameState = 0

        if self.UIRequired():
            # move over to main menu and present the winner
            self.HexGUI.openPage("menu")
            self.HexGUI.won(self.HexBoard.winner())

    def onGameUILoaded(self):
        pass
        #if self.mode == "inter" or (self.mode == "ki" and self._currentPlayerType == "human"):
        #    print("IM KI")

    # generate random player number
    def chooseFirst(self):
        self._currentPlayer = round(random.random()) + 1

    # is the getter for the private variable
    def currentPlayer(self):
        return self._currentPlayer

    # is the current Player human?
    def isPlayerHuman(self):
        return self._currentPlayerType == "human"

    # alter the players
    def changePlayer(self):

        if self._currentPlayer == 1:
            self._currentPlayer = 2

        else:
            self._currentPlayer = 1

        if self.mode == "ki":

            if self._currentPlayerType == "human":
                self._currentPlayerType = "ki"
            else:
                self._currentPlayerType = "human"

        if self.mode in ["inter", "machine"]:

            self._currentPlayerType = "ki"

    # control flow for click event
    def makeMove(self, move):

        # Notify
        EventManager.notify("MoveBegan")

        # if already marked dont do anything
        if self.HexBoard.isMarked(move[0], move[1]):
            EventManager.notify("MoveDenied")
            assert False

        else:

            # otherwise count the click
            self.moveCounter = self.moveCounter + 1

            # notify Model
            self.HexBoard.receiveMove(move)

            if self.mode == "inter":
                self.KI[0].receiveMove(move)
                self.KI[1].receiveMove(move)
            elif self.mode == "ki":
                self.KI.receiveMove(move)

            # notify View
            self.changePlayer()
            EventManager.notify("PlayerChanged")

        EventManager.notify("MoveFinished")

    def doKIMove(self):

        if self.GameState == 1:

            if not self.isPlayerHuman() and self.mode == "ki":
                move = self.KI.nextMove()
                self.makeMove(move)

            elif self.mode == "inter" or self.mode == "machine":
                move = self.KI[self.currentPlayer() - 1].nextMove()
                #print(move, self.currentPlayer())
                #print("making", move)
                self.makeMove(move)

    def onMoveFinished(self):
        pass