Exemple #1
0
    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()
Exemple #2
0
 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()
Exemple #3
0
 def __init__(self, win, size, player1, player2):
     self.running = True
     self.win = win
     self.size = size
     self.p1 = Player("red", 1)
     self.p1.setSide(1)
     self.p2 = Player("blue", 2)
     self.p2.setSide(-1)
     self.players = (self.p1, self.p2)
     self.currentPlayer = 1
     self.GUI = None
     self.turnText = None
     self.player1 = player1
     self.player2 = player2
     windowSize = 520
     self.GUI = HexGUI(self.win, self.size, 20, [80, 100])
     self.turnText = Text(Point(windowSize / 3, windowSize / 10),
                          "Player " + str(self.currentPlayer) + "'s Turn   (thinking)")
     self.turnText.setSize(20)
     self.turnText.draw(self.win)
     self.board = self.GUI.getBoard()
Exemple #4
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 #5
0
class HexGame(object):
    def __init__(self, win, size, player1, player2):
        self.running = True
        self.win = win
        self.size = size
        self.p1 = Player("red", 1)
        self.p1.setSide(1)
        self.p2 = Player("blue", 2)
        self.p2.setSide(-1)
        self.players = (self.p1, self.p2)
        self.currentPlayer = 1
        self.GUI = None
        self.turnText = None
        self.player1 = player1
        self.player2 = player2
        windowSize = 520
        self.GUI = HexGUI(self.win, self.size, 20, [80, 100])
        self.turnText = Text(Point(windowSize / 3, windowSize / 10),
                             "Player " + str(self.currentPlayer) + "'s Turn   (thinking)")
        self.turnText.setSize(20)
        self.turnText.draw(self.win)
        self.board = self.GUI.getBoard()

    def print_board(self):
        result = (" " + u"\u25a0") * self.GUI.size + u" \u25E9\n"
        for i in range(self.GUI.size):
            result += " " * i + u"\u25A1" + " "
            for j in range(self.GUI.size):
                result += print_block(self.GUI.board[i, j]) + " "
            result += u"\u25A1" + "\n"
        result += " " * (self.GUI.size) + u"\u25EA" + (" " + u"\u25a0") * self.GUI.size + "\n" + "\n"
        label = str(self.players[self.currentPlayer].getSide()) + "'s turn to place a " + print_block(
            self.players[self.currentPlayer].getSide()) + " piece"
        return result + label

    def switchPlayer(self):
        self.currentPlayer = (self.currentPlayer + 1) % 2
        self.turnText.setText("Player " + str(self.currentPlayer + 1) + "'s Turn   (thinking)")

    def isRunning(self):
        return self.running

    def forceQuit(self):
        self.running = False
        self.win.mouseX = self.win.mouseY = []  # get out of the getMouse() loop
        self.win.close()
        exit(0)

    def player1Go(self):
        playerSide = self.players[self.currentPlayer].getSide()
        if self.player1.__dict__ == humanPlayer().__dict__:
            co = self.player1.getMove(self.win, self.GUI)
        else:
            my_strategy = strategy(self.board, self.size, playerSide)
            #print "len", len(my_strategy.getPossiMoves())
            if my_strategy.alreadyPlacedBlockNum() <= 1:
                co = my_strategy.greatFirstMove()
            else:
                co = self.player1.getMove(self.board, playerSide)
        print "player1 move =", co
        # print "board", self.board
        if self.GUI.placePiece(co, self.players[self.currentPlayer]):
            # print 'playerside', playerSide
            my_strategy = strategy(self.board, self.size, playerSide)
            winner = my_strategy.winner()
            # print "winner =", winner
            if winner == None:
                self.switchPlayer()
            elif winner == self.currentPlayer + 1:
                self.turnText.setTextColor("magenta")
                self.turnText.setText("Player " + str(winner) + " wins.")
                return winner
        return None

    def player2Go(self):
        playerSide = self.players[self.currentPlayer].getSide()

        if self.player2.__dict__ == humanPlayer().__dict__:
            co = self.player2.getMove(self.win, self.GUI)
        else:
            # my_strategy = strategy(self.board, self.size, playerSide)
            # if self.size * self.size - len(my_strategy.getPossiMoves()) <= 1:
            # co = my_strategy.greatFirstMove()
            # else:
            co = self.player2.getMove(self.board, playerSide)
        print "player2 move =", co
        # print "board", self.board
        if self.GUI.placePiece(co, self.players[self.currentPlayer]):
            # print 'playerside', playerSide
            my_strategy = strategy(self.board, self.size, playerSide)
            winner = my_strategy.winner()
            if winner == None:
                self.switchPlayer()
            elif winner == self.currentPlayer + 1:
                self.turnText.setTextColor("magenta")
                self.turnText.setText("Player " + str(winner) + " wins.")
                return winner
        else:
            return False
        return None

    def play(self):
        self.currentPlayer = 0
        while self.running:

            self.turnText.setTextColor(self.players[self.currentPlayer].getColor())
            times = time.clock()
            winner = self.player1Go()
            timeSpan = time.clock() - times
            print "time used for this move:" + str(timeSpan) +"\n" + self.print_board()
            if winner == self.currentPlayer + 1:
                print str(self.players[self.currentPlayer].getSide()) + " wins"
                return winner

            self.turnText.setTextColor(self.players[self.currentPlayer].getColor())
            times = time.clock()
            winner = self.player2Go()
            timeSpan = time.clock() - times
            print "time used for this move:" + str(timeSpan) +"\n" + self.print_board()
            if winner == self.currentPlayer + 1:
                print str(self.players[self.currentPlayer].getSide()) + " wins"
                return winner

        return None
Exemple #6
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 #7
0
    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()
Exemple #8
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