コード例 #1
0
class Board(AnimateBoard):
    def __init__(self, columns=COLUMNS, rows=ROWS, demo=False,
                 fadeColor=(100, 100, 100)):
        self.tileBatch = pyglet.graphics.Batch()
        self.tokenBatch = pyglet.graphics.Batch()

        self.tiles = []
        self.tokens = []
        self.people = []

        self.playerBoxes = []

        self.dragTile = False

        self.moving = False
        self.movingTiles = []

        self.columns = columns
        self.rows = rows

        self.ourTurn = False

        # make the colour dimmer if we're not running in a real game
        self.started = False
        self.demo = demo
        self.color = (255, 255, 255)
        self.fadeColor = fadeColor

        self.settings = settings.GameSettings()

        # XXX - fix me with something dynamic

        offset_x = OFFSET_X
        if columns == 7:
            offset_x = BOARD_OFFSET_X

        offset_y = OFFSET_Y
        if rows == 7:
            offset_y = BOARD_OFFSET_Y

        for y in range(rows):
            for x in range(columns):
                self.tiles.append(Tile(x * 81 + offset_x,
                                         768 - (y * 81) - offset_y,
                                         x, y,
                                         color=self.color,
                                         tileType=random.randint(1, 3),
                                         tileRotation=random.randint(0, 3),
                                         batch=self.tileBatch))


        self.floatingTile = Tile(-100, -100, -1, -1,
                                 color=self.color,
                                 tileType=random.randint(1, 3),
                                 tileRotation=random.randint(0, 3),
                                 batch=self.tileBatch)

        events.addListener(self)

        pyglet.clock.schedule(self.update)

    def getTile(self, column, row):
        for tile in self.tiles:
            if tile.column == column and tile.row == row:
                return tile

    def boardToSprites(self):
        gameBoard = self.settings.board

        self.rows = gameBoard.rows
        self.columns = gameBoard.columns

        # is this going to gc correctly?
        self.tiles = []
        self.tokens = []

        for y in range(gameBoard.rows):
            for x in range(gameBoard.columns):
                tile = gameBoard.board[y][x]
                self.tiles.append(
                    Tile(x * 81 + BOARD_OFFSET_X,
                         768 - (y * 81) - BOARD_OFFSET_Y,
                         x, y,
                         color=(255, 255, 255),
                         tileType=tile.tileType,
                         tileRotation=tile.tileRotation,
                         batch=self.tileBatch))

                if tile.boardItem and not tile.boardItem.found:
                    self.tokens.append(
                        Token(int(tile.boardItem.itemNumber),
                              self.tiles[-1].x,
                              self.tiles[-1].y,
                              x, y,
                              batch=self.tokenBatch))

        self.floatingTile = \
            Tile(FLOATINGTILE_LOCATION_X,
                 FLOATINGTILE_LOCATION_Y,
                 -1, -1,
                 color=(255, 255, 255),
                 tileType=gameBoard.floatingTile.tileType,
                 tileRotation=gameBoard.floatingTile.tileRotation,
                 batch=self.tileBatch)

        for player in self.settings.board.players:
            column, row = player.getLocation()
            playerSprite = character.Character(column, row)
            tile = self.getTile(column, row)

            playerSprite.x, playerSprite.y = tile.xy
 
            self.people.append(playerSprite)

            self.playerBoxes.append(PlayerBox(player.playerNumber))

            for item in player.boardItems:
                self.playerBoxes[-1].addToken(item.itemNumber)
                pass


    # XXX - remove this later
    def placePeople(self):
        positions = [(0, 0), (self.columns-1, self.rows-1),
                     (0, self.rows-1), (self.columns-1, 0)]

        for count, person in enumerate(self.people):
            pos = positions[count]
            for tile in self.tiles:
                if tile.row == pos[1] and tile.column == pos[0]:
                    person.x = tile.x
                    person.y = tile.y

    def on_mousePress(self, args):
        print "!!! button pressed"
        x, y, button, modifiers = args
        #self.checkTileClicked(x, y)
        if self.ourTurn:
            self.pickupFloatingTile(x, y)

    def on_mouseRelease(self, args):
        print "!!! button released"
        x, y, button, modifiers = args
        if self.ourTurn:
            self.checkTileClicked(x, y)
            if self.dragTile:
                self.dropFloatingTile(x, y)

    def on_mouseDrag(self, args):
        x, y, dx, dy, buttons, modifiers = args
        if self.dragTile:
            self.dragFloatingTile(x, y)

    def on_keyPress(self, args):
        print "!!! key pressed"
        symbol, modifiers = args
        if symbol == key.RIGHT:
            self.settings.client.send('/rotate clockwise')
        elif symbol == key.LEFT:
            self.settings.client.send('/rotate counterclockwise')
        elif symbol == key.SPACE:
            if self.ourTurn:
                self.ourTurn = False
                self.settings.client.send('/end')

    def on_tileRotated(self, args):
        print "!!! tile rotated"
        print args

        self.floatingTile.rotate(int(args[0]))

    def on_playerSetup(self, args):
        print "!!! player setup"
        print args

    def on_turnChanged(self, args):
        print "!!! player turn changed"
        print args

        self.settings.board.playerTurn = int(args[1])

        print "player turn = %d" % self.settings.board.playerTurn


    def on_playerTookObject(self, args):
        print "!!! player took object"
        print args
        playerNum = self.settings.board.playerTurn - 1

        player = self.people[playerNum]

        for token in self.tokens:
            if token.column == player.column and \
               token.row == player.row:
                tokenId = token.tokenId
                for player in self.playerBoxes:
                    for playerToken in player.tokens:
                        if playerToken.tokenId == tokenId:
                            playerToken.setHighlight(True)
                self.tokens.remove(token)
                break

    def on_boardData(self, args):
        boardData = args[0]
        print "!!! board data = %s" % args[0]

        self.settings.board.deserialize(boardData)
        if not self.started:
            self.boardToSprites()
            self.started = True

        print "player turn = %d" % self.settings.board.playerTurn

    def on_startGame(self, args):
        print "!!! start game"
        self.demo = False
        #self.fallOut()

        #self.settings.fallingTiles = True

    def on_tilePushed(self, args):
        nick, pos, direction = args
        self.moveTiles(int(pos), int(direction))
        self.settings.client.send('/data')

    def on_playerTurn(self, args):
        print "!!! your turn"
        self.ourTurn = True
        self.tilePushed = False

    def on_playerMoved(self, args):
        nick, column, row = args
        print "!!! player moved"
        print args
        column = int(column)
        row = int(row)

        traverseGraph = traverse.TraversalGraph(self.settings.board)

        playerNum = self.settings.board.playerTurn - 1
        startLocation = self.settings.board.players[playerNum].location

        print [x.location for x in self.settings.board.players]