class Game: def __init__(self): self.map = Map() self.numUnits = 1 self.numPlayers = 1 self.playerIndex = -1 self.turn = 1 self.players = [] def __saveable__(self): """ Returns a saveable representation of the game. """ d = {} d['players'] = map(saveable, self.players) d['map'] = saveable(self.map) d['turn'] = self.turn d['playerIndex'] = self.playerIndex d['currentPlayer'] = saveable(self.currentPlayer) return d @classmethod def __load__(cls, d): g = cls() g.map = load(Map, d['map'], game=g) g.players = map(partial(load, Player, game=g), d['players']) g.turn = d['turn'] g.playerIndex = d['playerIndex'] g.currentPlayer = load(Player, d['currentPlayer'], game=g) g.numUnits = len(g.map.units) g.numPlayers = len(g.players) return g def save(self, filename): d = saveable(self) with open(filename, 'w') as f: json.dump(d, f) print 'Game saved.' @classmethod def load(cls, filename): Player.loadedPlayers = {} with open(filename) as f: d = json.load(f) print 'Game loaded.' return load(cls, d) def start(self): self.players.append(HumanPlayer(self)) for x in xrange(self.numPlayers - 1): self.players.append(AIPlayer(self)) self.map.createSquareMap(self.numUnits, self.players, 10, 10, 50) self.numUnits *= self.numPlayers def cyclePlayers(self): self.playerIndex += 1 if self.playerIndex == self.numPlayers: self.playerIndex = -1 self.currentPlayer = None # None indicates the turn is over else: self.currentPlayer = self.players[self.playerIndex] def nextPlayerAction(self): self.cyclePlayers() if self.currentPlayer: self.currentPlayer.doTurn() else: self.nextTurn() def nextTurn(self): self.save('savefile.save') self.resetPlayerCycle() self.nextPlayerAction() self.turn += 1 def resetPlayerCycle(self): self.playerIndex = -1 def moveAction(self, fun): if isinstance(self.currentPlayer, HumanPlayer): self.currentPlayer.currentUnit.tile.setChosenByReach(self.currentPlayer.currentUnit.moves) self.map.addAction(partial(self.currentPlayer.currentUnit.move, fun=fun)) return True return False def nextUnitAction(self): if isinstance(self.currentPlayer, HumanPlayer): self.currentPlayer.nextUnitAction() return True return False def nextTurnAction(self): if isinstance(self.currentPlayer, HumanPlayer): self.currentPlayer.endTurn() return True return False
class Game: def __init__(self): self.map = Map() self.numUnits = 1 self.numPlayers = 1 self.playerIndex = -1 self.turn = 1 self.players = [] self.mode = 'single' self.playerNames = [] self.singletonObject = None self.turnUnits = [] self.mapSize = 0 #small def __saveable__(self): """ Returns a saveable representation of the game. """ d = {} d['players'] = map(saveable, self.players) d['map'] = saveable(self.map) d['turn'] = self.turn d['playerIndex'] = self.playerIndex d['currentPlayer'] = saveable(self.currentPlayer) return d @classmethod def __load__(cls, d): g = cls() g.map = load(Map, d['map'], game=g) g.players = map(partial(load, Player, game=g), d['players']) g.turn = d['turn'] g.playerIndex = d['playerIndex'] g.currentPlayer = load(Player, d['currentPlayer'], game=g) g.numUnits = len(g.map.units) g.numPlayers = len(g.players) return g def save(self, filename): d = saveable(self) with open(filename, 'w') as f: json.dump(d, f) print 'Game saved.' @classmethod def load(cls, filename): Player.loadedPlayers = {} with open(filename) as f: d = json.load(f) print 'Game loaded.' return load(cls, d) def start(self): if game.mode == 'single': self.players.append(HumanPlayer(self)) for x in xrange(self.numPlayers - 1): self.players.append(AIPlayer(self)) else: for x in xrange(self.numPlayers): self.players.append(HumanPlayer(self)) if self.mapSize == 0: self.map.createSquareMap(self.numUnits, self.players, 50, 1) elif self.mapSize == 1: self.map.createSquareMap(self.numUnits, self.players, 35, 2) else: self.map.createSquareMap(self.numUnits, self.players, 20, 3) self.numUnits *= self.numPlayers def cyclePlayers(self): self.playerIndex += 1 if self.playerIndex == self.numPlayers: self.playerIndex = -1 self.currentPlayer = None # None indicates the turn is over else: self.currentPlayer = self.players[self.playerIndex] if isinstance(self.currentPlayer, HumanPlayer): self.turnUnits = filter(lambda x: x.owner == self.currentPlayer, self.map.units) def nextPlayerAction(self): self.cyclePlayers() if self.currentPlayer: self.currentPlayer.doTurn() else: self.nextTurn() def nextTurn(self): self.save('savefile.save') self.resetPlayerCycle() self.nextPlayerAction() self.turn += 1 def resetPlayerCycle(self): self.playerIndex = -1 def moveAction(self, fun): if isinstance(self.currentPlayer, HumanPlayer): if not self.currentPlayer.currentUnit.moves: print 'This unit cannot move!' return False self.currentPlayer.currentUnit.tile.setChosenByReach( self.currentPlayer.currentUnit.moves) self.map.addAction(partial( self.currentPlayer.currentUnit.move, fun=fun)) return True return False def attackAction(self, fun=None): if isinstance(self.currentPlayer, HumanPlayer): if not self.currentPlayer.currentUnit.range or \ self.currentPlayer.currentUnit.range in ((0,), [0]): print 'This unit cannot attack!' return False unit = self.currentPlayer.currentUnit unit.tile.setChosenByDist(unit.range) self.map.addAction(partial(unit.attackTile, fun=fun)) return True return False def buildAction(self, building): if isinstance(self.currentPlayer, HumanPlayer): return self.currentPlayer.currentUnit.build(building) return False def recruitAction(self, unit): if isinstance(self.currentPlayer, HumanPlayer): return self.currentPlayer.currentUnit.recruit(unit) return False def nextUnitAction(self): if isinstance(self.currentPlayer, HumanPlayer): self.currentPlayer.nextUnitAction() return True return False def nextTurnAction(self): if isinstance(self.currentPlayer, HumanPlayer): self.currentPlayer.endTurn() return True return False