class Menu(Widget): logo_img = ObjectProperty(None) def __init__(self, **kwargs): self.uiatlas = Atlas('assets/uitiles.atlas') self.store = DictStore('hexland.dict') super(Menu, self).__init__(**kwargs) self.logo_img.size_hint = 0.1,0.1 Animation(size_hint=(0.8,0.3),t='out_bounce').start(self.logo_img) def new(self): self.parent.setup() def load(self): state = self.store.get('save')['state'] size = len(state['grid']) vs = state['gametype'] self.parent.start(size,vs,state) def help(self): self.parent.help() def credits(self): self.parent.credits() def continueDisabled(self): return not self.store.exists('save')
class Menu(Widget): logo_img = ObjectProperty(None) def __init__(self, **kwargs): self.uiatlas = Atlas('assets/uitiles.atlas') self.store = DictStore('hexland.dict') super(Menu, self).__init__(**kwargs) self.logo_img.size_hint = 0.1, 0.1 Animation(size_hint=(0.8, 0.3), t='out_bounce').start(self.logo_img) def new(self): self.parent.setup() def load(self): state = self.store.get('save')['state'] size = len(state['grid']) vs = state['gametype'] self.parent.start(size, vs, state) def help(self): self.parent.help() def credits(self): self.parent.credits() def continueDisabled(self): return not self.store.exists('save')
def del_data(store, name): store = DictStore(store) if not store.exists(name): raise StoreException("The dice don't exist") elif name == "default": raise StoreException("Default can't be delete") else: store.delete(name)
def edit_data(store, name, data): store = DictStore(store) if store.exists(name): store.put(name, data=data) elif name == "default": raise StoreException("Default can't be edit") else: raise StoreException("The dice don't exit")
def __init__(self, data_path, refresh_ui): self.refresh_ui = refresh_ui self.data_path = data_path fb_db = DictStore(join(data_path, 'fb.db')) if not fb_db.exists('data'): fb_db.put('data') self.db = fb_db if self.db['data'].get('token') and not platform in ('ios', 'android'): self.token = self.db['data']['token'] self.refresh_token() else: pass
class MySettings(object): def __init__(self, *args): self.store = DictStore('user.dat') self.clientCoutnry = 'notSpecified' self.previousRound = '' self.intRound = 0 self.dictRounds = { '0': 'zero', '1': 'one', '2': 'two', '3': 'three', '4': 'four', '5': 'five' } self.round = 'zero' self.IP_Adress = 'http://localhost:8080' self.question = '' self.questionAddition = '' self.numberOfQuestion = '' self.votingResult = { 'zero_yes': 0, 'zero_no': 0, 'one_yes': 0, 'one_no': 0, 'two_yes': 0, 'two_no': 0, 'three_yes': 0, 'three_no': 0, 'four_yes': 0, 'four_no': 0, 'five_yes': 0, 'five_no': 0, 'final_yes': 0, 'final_no': 0 } if self.store.exists('IP'): self.IP_Adress = self.store.get('IP')['data']
class Engine: def __init__(self, dispatch, resume=True): self.__dispatch = dispatch self.__worker = WorkerThread() self.hist = [Position(initial, 0, (True, True), (True, True), 0, 0)] self.board = chess.Board() self.redo = [] self.searcher = Searcher() self.store = DictStore('fisher.dat') if resume: self.load_game() @mainthread def dispatch(self, event, *args): self.__dispatch(event, *args) @property def is_game_over(self): return self.board.is_game_over() @property def moves(self): return self.board.move_stack # convert sunfish position into a list of pieces with their file and rank def position(self, pos=None): pos = pos or self.hist[-1] pieces = [] for rank, row in enumerate(pos.board.split()): for file, p in enumerate(row): if p == '.': continue pieces.append('{}{}{}'.format(p, 'abcdefgh'[file], 8 - rank)) return pieces def validate(self, _move): try: move = chess.Move.from_uci(_move) except: return None while True: if move in self.board.legal_moves: return move if self.humans_turn: break # Sunfish move deemed illegal by python-chess? likely a promotion assert not move.promotion if not self.humans_turn: move.promotion = chess.QUEEN def apply_move(self, _move): move = self.validate(self.decode(_move)) if move: self.board.push(move) self.hist.append(self.hist[-1].move(_move)) # after the machine's move, check if redo list still valid if self.humans_turn: self.check_redo() self.dispatch('on_update', *self.status(), move.uci()) if not self.is_game_over: return move def input_move(self, move): move = self.parse_and_validate(move) if move and self.apply_move(move): self.search_move() def parse_and_validate(self, move): if not self.is_game_over: match = re.match('([a-h][1-8])' * 2, move) if match: return parse(match.group(1)), parse(match.group(2)) def decode(self, move): if not self.humans_turn: move = [119 - m for m in move] return '{}{}'.format(*(render(m) for m in move)) # Fire up the engine to look for a move -- in the background thread def search_move(self): def search(): start = time.time() for _depth, move, _score in self.searcher.search( self.hist[-1], self.hist): if time.time() - start > 1: break self.apply_move(move) self.save_game() self.__worker.send_message(search) def status_message(self): if self.board.is_stalemate(): return 'Stalemate' if self.board.is_checkmate(): return 'Checkmate!' if self.board.is_check(): return 'Check!' return 'Your turn' if self.humans_turn else 'Thinking...' @property def humans_turn(self): return self.board.turn == chess.WHITE def status(self): pos = self.hist[-1] if self.hist else None if pos and not self.humans_turn: pos = pos.rotate() return self.position(pos), self.status_message() def __can_use(self, moves_list): return len(moves_list) > 0 and (self.humans_turn or self.is_game_over) def can_undo(self): return self.__can_use(self.moves) def can_redo(self): return self.__can_use(self.redo) def check_redo(self): if self.redo and self.last_move != self.redo[-1]: # history took a different turn; redo list is invalid self.redo.clear() def undo_move(self): assert self.can_undo() assert len(self.hist) >= 2 # Assuming human plays white -- careful if/when implementing a "switch" feature # Moves count should be even, unless we lost. # Length of position history is odd because of initial empty position. assert len(self.hist) % 2 or self.is_game_over n = 1 if len(self.moves) % 2 else 2 self.hist = self.hist[:-n] self.redo.append(self.moves[-n].uci()) while n > 0: self.board.pop() n -= 1 self.redo.append(self.last_move) self.dispatch('on_update', *self.status(), self.last_move) def redo_move(self): assert self.redo assert len(self.redo) % 2 == 0 move = self.redo.pop() assert move == self.last_move move = self.redo.pop() self.input_move(move) def start(self): if not self.humans_turn: self.search_move() @property def last_move(self): return self.moves[-1].uci() if self.moves else None def load_game(self): Logger.debug('{}: load'.format(__name__)) if self.store.exists('game'): data = self.store.get('game') self.hist = data.get('hist', []) for move in data.get('moves', []): self.board.push(move) def save_game(self): Logger.debug('{}: save'.format(__name__)) self.store.put('game', hist=self.hist, moves=self.moves)
from ImageDownload import downloadimages class Program: def __init__(self, isim, time, kanal): self.isim = isim self.time = time self.kanal = kanal store = DictStore('data.py') Programlar = [] Kanallar_settings = [False] * 47 if (store.exists('1')): print('loading data') for i in range(0, len(Kanallar_settings)): Kanallar_settings[i] = store.get(str(i))['state'] class WindowManager(ScreenManager): pass class ChooseWindow(Screen): renklist = ListProperty(None) def storedata(self): for i in range(0, len(Kanallar_settings)): store.put(str(i), state=Kanallar_settings[i])
class Analytics(EventDispatcher): gameEnemies = NumericProperty() gameDamage = NumericProperty() towersBought = NumericProperty() towersSold = NumericProperty() towerUpgrades = NumericProperty() maxTowerLevel = NumericProperty() finalWave = NumericProperty() gameTimeEnd = NumericProperty() moneyEarned = NumericProperty() moneySpent = NumericProperty() def on_gameEnemies(self, instance, value): self.numEnemies = value def on_gameDamage(self, instance, value): self.gameDamage = value def on_towersBought(self, instance, value): self.towersBought = value def on_towersSold(self, instance, value): self.towersSold = value def on_towerUpgrades(self, instance, value): self.towerUpgrades = value def on_maxTowerLevel(self, instance, value): self.maxTowerLevel = value def on_finalWave(self, instance, value): self.finalWave = value def on_gameTimeEnd(self, instance, value): self.gameLength = self.gameTimeEnd - self.gameTimeStart if self.gameLength >= 60: self.gameLength = (self.gameLength / 60, self.gameLength % 60) else: self.gameLength = (0, self.gameLength) def on_moneyEarned(self, instance, value): self.moneyEarned = value def on_moneySpent(self, instance, value): self.moneySpent = value def __init__(self): super(Analytics, self).__init__() self.gameTimeStart = 0 self.gameTimeEnd = 0 self.playerData = DictStore('player_data.txt') if self.playerData.exists('lastgame'): self.numEnemies = self.playerData.get('lastgame')['numEnemies'] self.gameDamage = self.playerData.get('lastgame')['gameDamage'] self.towersBought = self.playerData.get('lastgame')['towersBought'] self.towersSold = self.playerData.get('lastgame')['towersSold'] self.towerUpgrades = self.playerData.get( 'lastgame')['towerUpgrades'] self.maxTowerLevel = self.playerData.get( 'lastgame')['maxTowerLevel'] self.finalWave = self.playerData.get('lastgame')['finalWave'] self.moneyEarned = self.playerData.get('lastgame')['moneyEarned'] self.moneySpent = self.playerData.get('lastgame')['moneySpent'] self.gameLength = self.playerData.get('lastgame')['gameLength'] self.score = self.playerData.get('lastgame')['score'] else: self.numEnemies = 0 self.gameDamage = 0 self.towersBought = 0 self.towersSold = 0 self.towerUpgrades = 0 self.maxTowerLevel = 1 self.finalWave = 1 self.moneyEarned = 0 self.moneySpent = 0 self.gameLength = (0, 0) self.score = 0 if self.playerData.exists('totals'): self.totalGames = self.playerData.get('totals')['totalGames'] self.totalEnemies = self.playerData.get('totals')['totalEnemies'] self.totalDamage = self.playerData.get('totals')['totalDamage'] self.totalBought = self.playerData.get('totals')['totalBought'] self.totalSold = self.playerData.get('totals')['totalSold'] self.totalUpgraded = self.playerData.get('totals')['totalUpgraded'] self.highestTowerLevel = self.playerData.get( 'totals')['highestTowerLevel'] self.latestWave = self.playerData.get('totals')['latestWave'] self.totalEarned = self.playerData.get('totals')['totalEarned'] self.totalSpent = self.playerData.get('totals')['totalSpent'] self.timePlayed = self.playerData.get('totals')['timePlayed'] else: self.totalGames = 0 self.totalEnemies = 0 self.totalDamage = 0 self.totalBought = 0 self.totalSold = 0 self.totalUpgraded = 0 self.highestTowerLevel = 1 self.latestWave = 1 self.totalEarned = 0 self.totalSpent = 0 self.timePlayed = {'hours': 0, 'minutes': 0, 'seconds': 0} def _print(self): if self.gameEnemies != 0: print["Num Enemies: ", self.numEnemies, "Total Damage: ", int(self.gameDamage), "Towers Bought: ", self.towersBought, "Towers Sold: ", self.towersSold, "Tower Upgrades: ", self.towerUpgrades, "Max Tower Level: ", self.maxTowerLevel, "Final Wave: ", self.finalWave, "Game Length: ", str(int(self.gameLength[0])) + " minutes " + str(int(self.gameLength[1])) + " seconds", "Money Earned: ", self.moneyEarned, "Money Spent: ", self.moneySpent, "total Enemies: ", self.totalEnemies, "total Damage: ", self.totalDamage, "total Bought: ", self.totalBought, "total Sold: ", self.totalSold, "total Upgraded: ", self.totalUpgraded, "highest Level: ", self.highestTowerLevel, "latest Wave: ", self.latestWave, "total Earned: ", self.totalEarned, "total Spent: ", self.totalSpent, "total time played: ", self.timePlayed, "total games: ", self.totalGames] def updateData(self): self.totalGames += 1 self.totalEnemies += self.numEnemies self.totalDamage += int(self.gameDamage) self.totalBought += self.towersBought self.totalSold += self.towersSold self.totalUpgraded += self.towerUpgrades if self.highestTowerLevel < self.maxTowerLevel: self.highestTowerLevel = self.maxTowerLevel if self.latestWave < self.finalWave: self.latestWave = self.finalWave self.totalEarned += self.moneyEarned self.totalSpent += self.moneySpent self.timePlayed['minutes'] += int(self.gameLength[0]) self.timePlayed['seconds'] += int(self.gameLength[1]) if self.timePlayed['seconds'] > 60: self.timePlayed['seconds'] = int(self.timePlayed['seconds'] % 60) self.timePlayed['minutes'] += 1 if self.timePlayed['minutes'] > 60: self.timePlayed['minutes'] = int(self.timePlayed['minutes'] % 60) self.timePlayed['hours'] += 1 def store_data(self): self.playerData.put('lastgame', numEnemies=self.numEnemies, gameDamage=self.gameDamage, towersBought=self.towersBought, towersSold=self.towersSold, towerUpgrades=self.towerUpgrades, maxTowerLevel=self.maxTowerLevel, finalWave=self.finalWave, gameLength=self.gameLength, moneyEarned=self.moneyEarned, moneySpent=self.moneySpent, score=self.score) self.playerData.put('totals', totalGames=self.totalGames, totalEnemies=self.totalEnemies, totalDamage=self.totalDamage, totalBought=self.totalBought, totalSold=self.totalSold, totalUpgraded=self.totalUpgraded, highestTowerLevel=self.highestTowerLevel, latestWave=self.latestWave, timePlayed=self.timePlayed, totalEarned=self.totalEarned, totalSpent=self.totalSpent)
class HexGrid(ScatterLayout): gridsize = NumericProperty() gametype = NumericProperty() grid = ListProperty() deadGroups = ListProperty() baseimg = ObjectProperty() player = NumericProperty() lastPass = BooleanProperty(False) # la ultima jugada ha sigut passar? def __init__(self,**kwargs): super(HexGrid, self).__init__(do_rotation=False,scale_min=.5, scale_max=3.,auto_bring_to_front=False) self.gridsize = kwargs['gridsize'] self.gametype = kwargs['gametype'] self.gui = kwargs['gui'] # Preparem atlas d'imatges pels tiles self.baseatlas = Atlas('assets/basetiles.atlas') self.playeratlas = Atlas('assets/playertiles.atlas') self.uiatlas = Atlas('assets/uitiles.atlas') # Nomes gridsize inparell assert(self.gridsize%2 != 0) # Preparem store self.store = DictStore('hexland.dict') self.grid = [] self.deads = {1:0,2:0} self.resetScore() self.setup() # Si ens construeixen amb estat, el carreguem if kwargs['state']: self.loadState(kwargs['state'],True) self.reloadGridGraphics() # Si estem vs cpu, creem el jugador CPU if not self.gametype == GAMETYPE["PVP"]: self.cpu = CpuPlayer(self.gametype) def setup(self): # Torn del jugador per defecte self.player = 1 # Posicio i mida segons mida GRID self.drawgridsize = self.gridsize*65,89+(int(self.gridsize/2)*(35+65)) self.size[0] = 1000 self.size[1] = 1000 self.pos = Window.size[0]/2-self.size[0]/2,Window.size[1]/2-self.size[1]/2 # Com es la illa? Aleatori possibleBases = ['tileAutumn','tileGrass','tileSnow','tileMagic','tileLava','tileStone','tileRock'] self.baseimg = self.baseatlas[random.choice(possibleBases)] self.setupGrid() def getState(self): state = {} state["player"] = self.player state["gametype"] = int(self.gametype) state["deads"] = self.deads state["tileScore"] = self.tileScore state["terrScore"] = self.terrScore grid = [] sz = self.gridsize for y in range(0,sz): row = [] for x in range(0,sz): t = self.grid[y][x] if t: row.append(t.content) else: row.append(None) grid.append(row) state["grid"] = grid return state def loadState(self,state,fromContinue=False): grid = state["grid"] sz = len(grid) # No pot passar que aixo sigui diferent assert(sz == self.gridsize) for y in range(0,sz): for x in range(0,sz): t = grid[y][x] if t is not None: self.grid[y][x].content = t if fromContinue and not state["player"] == self.player: # Nomes 2 jugadors self.nextPlayer() self.gametype = state["gametype"] self.deads = state["deads"] self.tileScore = state["tileScore"] self.terrScore = state["terrScore"] def setupGrid(self): # Crea i configura el grid sz = self.gridsize mid = int(sz/2) for y in range(0,sz): line = [] dif = abs(mid-y) for x in range(0,sz): # Comprova si hi ha casella. Les caselles superiors esquerres i inferiors # dretes queden buides. if y==mid or (y < mid and x >= dif) or (y>mid and x<sz-dif): # Graphics t = Tile(grid_x = x, grid_y = y, caller = self, content = 0) self.add_widget(t) line.append(t) else: line.append(None) self.grid.append(line) self.reloadGridGraphics() def getTile(self,x,y): # No es poden demanar index negatius if x < 0 or y < 0: return None if x >= self.gridsize or y >= self.gridsize: # Ens demanen un tile inexistent return None return self.grid[y][x] # Reseteja les puntuacions actuals def resetScore(self): self.tileScore = {1:0,2:0} self.terrScore = {1:0,2:0} # Reseteja els grups dels tiles def resetTileGroups(self): sz = self.gridsize for y in range(0,sz): for x in range(0,sz): t = self.grid[y][x] if t: t.group = 0 # No te grup # Reseteja la marca de si el tile ha estat fet servir per puntuar terreny def resetTileUsed(self): sz = self.gridsize for y in range(0,sz): for x in range(0,sz): t = self.grid[y][x] if t: t.usedByTerrain = False # Assigna tot el grup. També comprova si es un grup mort def recursiveSetGroup(self,t,grpnum,dead=True): t.group = grpnum for nt in t.getNeighbors(): if nt.content == 0: dead = False # el grup té com a minim una llibertat, elif not nt.group and nt.content == t.content: # No te grup i mateix jugador dead = self.recursiveSetGroup(nt,grpnum,dead) return dead # Assigna tot el grup de terreny buit. Torna també informacio per puntuacio de terrany def recursiveSetTerrainGroup(self,t,grpnum,terrInfo): t.group = grpnum terrInfo['count']+=1 for nt in t.getNeighbors(): if nt.content and not nt.usedByTerrain: # es un jugador, el sumem i marquem com a fet servit (per a aquest grup) nt.usedByTerrain = True terrInfo[nt.content]+=1 elif not nt.group and nt.content == 0: # No te grup i mateix jugador terrInfo = self.recursiveSetTerrainGroup(nt,grpnum,terrInfo) return terrInfo # Agrupa els tiles connectats, aprofita el bucle per comprovar grups morts i calcular puntuacio def setTileGroups(self): self.resetTileGroups() self.resetScore() self.deadGroups = [] lastGroup = 0 sz = self.gridsize for y in range(0,sz): for x in range(0,sz): t = self.grid[y][x] if t: # Si no es buida, la sumem com a puntuacio de caselles del jugador (tile) if t.content: self.tileScore[t.content]+=1 if t.group == 0: # Assignem nou grup lastGroup += 1 if t.content: dead = self.recursiveSetGroup(t,lastGroup) if dead: self.deadGroups.append(lastGroup) else: self.resetTileUsed() terrInfo = {'count':0,1:0,2:0} terrInfo = self.recursiveSetTerrainGroup(t,lastGroup,terrInfo) # Puntuacio de terreny if terrInfo[1]>terrInfo[2]: self.terrScore[1]+=terrInfo['count'] elif terrInfo[1]<terrInfo[2]: self.terrScore[2]+=terrInfo['count'] def deleteGroups(self): if self.deadGroups: sz = self.gridsize for y in range(0,sz): for x in range(0,sz): t = self.grid[y][x] if t and t.group in self.deadGroups: # Contem la mort pl = t.content if pl in self.deads: self.deads[pl]+=1 else: self.deads[pl]=1 t.content = 0 # buidem casella # Pinta de costat caselles (jugadors) i grups def debugGrid(self): txt = "" sz = self.gridsize for y in range(0,sz): for x in range(0,sz): t = self.grid[y][x] if t: txt += str(t.content) else: txt += " " txt += " " # deixem un espai entre mig for x in range(0,sz): t = self.grid[y][x] if t: txt += str(t.group) if t.content else str(0) # per no liar, no imprimim els grups de caselles buides else: txt += " " txt += "\n" print txt print self.score() def reloadGridGraphics(self): # Actualitza els grafics de cada tile sz = self.gridsize for y in range(0,sz): for x in range(0,sz): t = self.grid[x][y] if t: if t.content == 0: # No pertany a cap jugador t.upperimg = self.baseatlas['tileNone'] elif t.upperimg == self.baseatlas['tileNone']: # Si encara no te imatge... if t.content == 1: # Jugador 1 posibles = [i for i in self.playeratlas.textures.keys() if i.startswith("wood")] else: # Jugador 2 posibles = [i for i in self.playeratlas.textures.keys() if i.startswith("sand")] t.upperimg = self.playeratlas[random.choice(posibles)] # Realitza un moviment. Torna fals si no es possible (suicidi), o true en cas contrari def doMovement(self,t,player=None): if t.content == 0: # si ja està ocupada res # Per poder provar jugades desde l'ordinador if player: t.content = player else: t.content = self.player self.setTileGroups() # Validem que no hi hagi suicidi dead = False if t.group in self.deadGroups: # Pot ser que sigui un suicidi d'atac: Estas matant un altre grup i per tant no mors # Per compvoar això, si hi ha més d'un grup mort, treiem el nostre grup dels grups # morts, matem els grups, refem els grups, i si estem vius es jugada valida dead = True if len(self.deadGroups) > 1: state = self.getState() self.deadGroups.remove(t.group) otherDeads = self.deadGroups self.deleteGroups() self.setTileGroups() if not t.group in self.deadGroups: dead = False self.deadGroups = otherDeads self.loadState(state) return not dead # if dead: # return False # else: # # Correcte, seguim jugada # return True else: return False @mainthread def manageTurn(self,t,playerMove=True): # Si el jugador intenta jugar mentre es el torn de la IA, no fem res if playerMove and not self.gametype == GAMETYPE["PVP"] and self.player == 2: return False # En cap cas es pot jugar sobre una casella ocupada if not t.content == 0: return False state = self.getState() if self.doMovement(t): # Correcte, seguim jugada self.deleteGroups() self.reloadGridGraphics() self.lastPass = False self.debugGrid() # Guardem estat a cada moviment self.nextPlayer() self.store.put('save',state=self.getState()) else: self.loadState(state) launchSimpleModal("INVALID MOVE\nYou can't suicide.") playClickSound() @mainthread def doPass(self,playerMove=True): if playerMove and not self.gametype == GAMETYPE["PVP"] and self.player == 2: return False if not self.gametype == GAMETYPE["PVP"] and self.player == 2: launchSimpleModal("CPU passed.") if self.lastPass: # Final del joc self.gameOver() else: self.lastPass = True self.nextPlayer() def getNextPlayerNum(self,player): if player == 1: player = 2 elif player == 2: player = 1 return player def nextPlayer(self): # Gestiona el canvi de jugador self.player = self.getNextPlayerNum(self.player) self.gui.setPlayerText(self.player) if not self.gametype == GAMETYPE["PVP"] and self.player == 2: self.startCpu() def startCpu(self): threading.Thread(target=self.cpu.move, args=(self,)).start() # Retorna la puntuació en un moment concret, desglosada def score(self): score = {1:0,2:0} deadScore = {1:0,2:0} # Sumem mortes deadScore[1] += self.deads[2] if 2 in self.deads else 0 deadScore[2] += self.deads[1] if 1 in self.deads else 0 for k in score.keys(): score[k]+=deadScore[k]+self.tileScore[k]+self.terrScore[k] score['tileScore'] = self.tileScore score['terrScore'] = self.terrScore score['deadScore'] = deadScore return score @mainthread def gameOver(self): score = self.score() # Qui ha guanyat? whowin = "TIE!" if score[1]>score[2]: whowin = "Player 1 WINS!" elif score[1]<score[2]: whowin = "Player 2 WINS!" # Esborrem partida, mostrem guanyador, tornem al menu if self.store.exists('save'): self.store.delete('save') launchSimpleModal("Game Finished\nP1: "+str(score[1])+" | P2: "+str(score[2])+"\n"+whowin) self.parent.parent.gameOver()
class irc1App(App): def build(self): if platform == 'android': from android import AndroidService service = AndroidService('irc1\'s service', 'running') service.start('service started') self.service = service osc.init() oscid = osc.listen(ipAddr='127.0.0.1', port=activityport) osc.bind(oscid, self.main_api_callback, '/api/main') Clock.schedule_interval(lambda *x: osc.readQueue(oscid), 0.1) self.icon = 'data/icon.png' self.servers = DictStore('servers.db') self.msg_animation = Animation(opacity=1, transition='out_cubic') self.screenmain = ScreenMain() self.running = {} self.boxes = {} for name in sorted(dict(self.servers.find()).keys()): data = self.servers.get(name) box = ServerBox(name=name) self.boxes[name] = box self.screenmain.ids.servers.add_widget(box) manager = ScreenManager(transition=SlideTransition(duration=0.2)) manager.add_widget(self.screenmain) return manager def go_back(self): name = self.root.current if name == 'ScreenMain': pause_app() else: self.root.transition.direction = 'right' self.root.current = 'ScreenMain' def init_connection(self, name): if name not in self.servers: return if name not in self.running: Animation(background_color=(0.1, 1, 0.1, 1)).start( self.boxes[name].ids.servername) screen = ScreenConversation(name=name) data = self.servers.get(name) self.running[name] = screen self.root.add_widget(screen) screen.ids.nick.text = data['nick'] osc.sendMsg( '/api/main', [ 'connect', name, data['host'], data['port'], data['nick'], data['password'], data['auth_nickserv'], data['scripts'] ] + data['autojoin'], port=serviceport) self.root.transition.direction = 'left' self.root.current = name def close_connection(self, name): osc.sendMsg('/api/main', ['disconnect', name], port=serviceport) if name not in self.running: return Animation(background_color=(1, 1, 1, 1)).start(self.boxes[name].ids.servername) self.root.transition.direction = 'right' self.root.current = 'ScreenMain' self.root.remove_widget(self.running[name]) del self.running[name] def disconnect_all(self): for name, data in self.servers.find(): self.close_connection(name) def update_or_add_server(self, popup, name=''): host = str(popup.ids.host.text).strip() port = int(str(popup.ids.port.text).strip()) nick = str(popup.ids.nick.text).strip() password = str(popup.ids.password.text) auth_nickserv = popup.ids.auth_nickserv.active scripts = str(popup.ids.scripts.text).strip() autojoin = str(popup.ids.autojoin.text).strip() autojoin = autojoin.replace(',', ' ').split() data = { 'host': host, 'port': port, 'nick': nick, 'password': password, 'auth_nickserv': auth_nickserv, 'scripts': scripts, 'autojoin': autojoin } if name: self.servers.put(name, **data) return name = '%s:%d' % (host, port) if self.servers.exists(name): return if not host or not port > 0 or not nick: return self.servers.put(name, **data) box = ServerBox(name=name) self.boxes[name] = box self.screenmain.ids.servers.add_widget(box) self.screenmain.ids.serverscroll.scroll_to(box) def del_server(self, serverbox): name = serverbox.name if self.servers.exists(name): self.servers.delete(name) del_animation = Animation(opacity=0, duration=0.2) del_animation.bind( on_complete=lambda *x: serverbox.parent.remove_widget(serverbox)) del_animation.start(serverbox) del self.boxes[name] def log_msg(self, name, message): label = ChatLabel(text=message) self.running[name].ids.chatlog.add_widget(label) self.running[name].ids.chatscroll.scroll_to(label) if self.root.current == name: self.msg_animation.start(label) else: label.opacity = 1 def input_focus(self, name, dt): self.running[name].ids.message.focus = True def send_msg(self, name, message): Clock.schedule_once(partial(self.input_focus, name), 0) osc.sendMsg('/api/main', ['send', name, message], port=serviceport) def change_channel(self, name, channel): osc.sendMsg('/api/main', ['channel', name, channel], port=serviceport) def main_api_callback(self, message, *args): # print message[2:] if len(message) > 3: name = message[3] if name not in self.running: return if message[2] == 'nick': nick = message[4] self.running[name].ids.nick.text = nick elif message[2] == 'channel': channel, channels = message[4], message[5:] self.running[name].ids.channel.text = channel or 'No channel' self.running[name].ids.channel.values = [ x or 'No channel' for x in channels ] elif message[2] == 'check': osc.sendMsg('/api/main', ['unread', name], port=serviceport) elif message[2] == 'unread': self.log_msg(name, message[4]) def on_start(self): Window.softinput_mode = 'below_target' hook_keyboard() def on_pause(self): return True def on_resume(self): pass def on_stop(self): if platform == 'android': self.service.stop()
class Player(): def __init__(self): self.health = playerhealth self.money = 0 self.gems = 0 self.upgPathSelectLvl = 5 self.abilities = list() self.wavenum = 0 self.gameover = False self.towerSelected = None self.tbbox = None self.layout = None self.wavestart = 999 self.next_wave = False self.pausetime = 0 self.state = "Start" self.restart = False self.score = 0 self.newMoveList = False self.wavetime = None self.wavetimeInt = None self.myDispatcher = EventDispatcher.EventDisp() self.analytics = Analytics.Analytics() self.store = DictStore('settings.txt') if self.store.exists('audio'): self.soundOn = self.store.get('audio')['soundOn'] self.musicOn = self.store.get('audio')['musicOn'] else: self.soundOn = True self.musicOn = True def setResources(self): if Map.mapvar.difficulty == 'easy': self.money = 2000 self.gems = 5 self.myDispatcher.Money = str(self.money) self.myDispatcher.Gems = str(self.gems) elif Map.mapvar.difficulty == 'medium': self.money = 1000 self.gems = 4 self.myDispatcher.Money = str(self.money) self.myDispatcher.Gems = str(self.gems) else: self.money = 300 self.gems = 3 self.myDispatcher.Money = str(self.money) self.myDispatcher.Gems = str(self.gems) self.myDispatcher.Score = str(self.score) self.myDispatcher.Timer = str(self.wavetimeInt) self.myDispatcher.Health = str(self.health) def setupCoinAnim(self): self.coinAnimating = False self.coinanim = Animation(pos=(__main__.ids.coinimage.x, __main__.ids.coinimage.y+20), duration=.1) + \ Animation(pos=(__main__.ids.coinimage.x, __main__.ids.coinimage.y), duration=.1) self.coinanim.on_complete(self.toggleCoinAnim) def toggleCoinAnim(self): self.coinAnimating = False def die(self): '''Set gameover to True to reset the game''' self.gameover = True def genWaveList(self): self.waveList, self.waveTypeList = Wavegen.wavegen() # [{'wavenum': 1, 'setnum': 1, 'enemytype': 'b', 'enemymods': []}, dict repeats] self.wavetime = Map.mapvar.waveseconds self.wavetimeInt = int(Map.mapvar.waveseconds) def storeSettings(self): self.store.put('audio', soundOn=self.soundOn,musicOn=self.musicOn) self.store.put('gameplay', difficulty = Map.mapvar.difficulty, numpaths = Map.mapvar.numpaths, waveorder = Map.mapvar.waveOrder)
class HexGrid(ScatterLayout): gridsize = NumericProperty() gametype = NumericProperty() grid = ListProperty() deadGroups = ListProperty() baseimg = ObjectProperty() player = NumericProperty() lastPass = BooleanProperty(False) # la ultima jugada ha sigut passar? def __init__(self, **kwargs): super(HexGrid, self).__init__(do_rotation=False, scale_min=.5, scale_max=3., auto_bring_to_front=False) self.gridsize = kwargs['gridsize'] self.gametype = kwargs['gametype'] self.gui = kwargs['gui'] # Preparem atlas d'imatges pels tiles self.baseatlas = Atlas('assets/basetiles.atlas') self.playeratlas = Atlas('assets/playertiles.atlas') self.uiatlas = Atlas('assets/uitiles.atlas') # Nomes gridsize inparell assert (self.gridsize % 2 != 0) # Preparem store self.store = DictStore('hexland.dict') self.grid = [] self.deads = {1: 0, 2: 0} self.resetScore() self.setup() # Si ens construeixen amb estat, el carreguem if kwargs['state']: self.loadState(kwargs['state'], True) self.reloadGridGraphics() # Si estem vs cpu, creem el jugador CPU if not self.gametype == GAMETYPE["PVP"]: self.cpu = CpuPlayer(self.gametype) def setup(self): # Torn del jugador per defecte self.player = 1 # Posicio i mida segons mida GRID self.drawgridsize = self.gridsize * 65, 89 + (int(self.gridsize / 2) * (35 + 65)) self.size[0] = 1000 self.size[1] = 1000 self.pos = Window.size[0] / 2 - self.size[0] / 2, Window.size[ 1] / 2 - self.size[1] / 2 # Com es la illa? Aleatori possibleBases = [ 'tileAutumn', 'tileGrass', 'tileSnow', 'tileMagic', 'tileLava', 'tileStone', 'tileRock' ] self.baseimg = self.baseatlas[random.choice(possibleBases)] self.setupGrid() def getState(self): state = {} state["player"] = self.player state["gametype"] = int(self.gametype) state["deads"] = self.deads state["tileScore"] = self.tileScore state["terrScore"] = self.terrScore grid = [] sz = self.gridsize for y in range(0, sz): row = [] for x in range(0, sz): t = self.grid[y][x] if t: row.append(t.content) else: row.append(None) grid.append(row) state["grid"] = grid return state def loadState(self, state, fromContinue=False): grid = state["grid"] sz = len(grid) # No pot passar que aixo sigui diferent assert (sz == self.gridsize) for y in range(0, sz): for x in range(0, sz): t = grid[y][x] if t is not None: self.grid[y][x].content = t if fromContinue and not state[ "player"] == self.player: # Nomes 2 jugadors self.nextPlayer() self.gametype = state["gametype"] self.deads = state["deads"] self.tileScore = state["tileScore"] self.terrScore = state["terrScore"] def setupGrid(self): # Crea i configura el grid sz = self.gridsize mid = int(sz / 2) for y in range(0, sz): line = [] dif = abs(mid - y) for x in range(0, sz): # Comprova si hi ha casella. Les caselles superiors esquerres i inferiors # dretes queden buides. if y == mid or (y < mid and x >= dif) or (y > mid and x < sz - dif): # Graphics t = Tile(grid_x=x, grid_y=y, caller=self, content=0) self.add_widget(t) line.append(t) else: line.append(None) self.grid.append(line) self.reloadGridGraphics() def getTile(self, x, y): # No es poden demanar index negatius if x < 0 or y < 0: return None if x >= self.gridsize or y >= self.gridsize: # Ens demanen un tile inexistent return None return self.grid[y][x] # Reseteja les puntuacions actuals def resetScore(self): self.tileScore = {1: 0, 2: 0} self.terrScore = {1: 0, 2: 0} # Reseteja els grups dels tiles def resetTileGroups(self): sz = self.gridsize for y in range(0, sz): for x in range(0, sz): t = self.grid[y][x] if t: t.group = 0 # No te grup # Reseteja la marca de si el tile ha estat fet servir per puntuar terreny def resetTileUsed(self): sz = self.gridsize for y in range(0, sz): for x in range(0, sz): t = self.grid[y][x] if t: t.usedByTerrain = False # Assigna tot el grup. També comprova si es un grup mort def recursiveSetGroup(self, t, grpnum, dead=True): t.group = grpnum for nt in t.getNeighbors(): if nt.content == 0: dead = False # el grup té com a minim una llibertat, elif not nt.group and nt.content == t.content: # No te grup i mateix jugador dead = self.recursiveSetGroup(nt, grpnum, dead) return dead # Assigna tot el grup de terreny buit. Torna també informacio per puntuacio de terrany def recursiveSetTerrainGroup(self, t, grpnum, terrInfo): t.group = grpnum terrInfo['count'] += 1 for nt in t.getNeighbors(): if nt.content and not nt.usedByTerrain: # es un jugador, el sumem i marquem com a fet servit (per a aquest grup) nt.usedByTerrain = True terrInfo[nt.content] += 1 elif not nt.group and nt.content == 0: # No te grup i mateix jugador terrInfo = self.recursiveSetTerrainGroup(nt, grpnum, terrInfo) return terrInfo # Agrupa els tiles connectats, aprofita el bucle per comprovar grups morts i calcular puntuacio def setTileGroups(self): self.resetTileGroups() self.resetScore() self.deadGroups = [] lastGroup = 0 sz = self.gridsize for y in range(0, sz): for x in range(0, sz): t = self.grid[y][x] if t: # Si no es buida, la sumem com a puntuacio de caselles del jugador (tile) if t.content: self.tileScore[t.content] += 1 if t.group == 0: # Assignem nou grup lastGroup += 1 if t.content: dead = self.recursiveSetGroup(t, lastGroup) if dead: self.deadGroups.append(lastGroup) else: self.resetTileUsed() terrInfo = {'count': 0, 1: 0, 2: 0} terrInfo = self.recursiveSetTerrainGroup( t, lastGroup, terrInfo) # Puntuacio de terreny if terrInfo[1] > terrInfo[2]: self.terrScore[1] += terrInfo['count'] elif terrInfo[1] < terrInfo[2]: self.terrScore[2] += terrInfo['count'] def deleteGroups(self): if self.deadGroups: sz = self.gridsize for y in range(0, sz): for x in range(0, sz): t = self.grid[y][x] if t and t.group in self.deadGroups: # Contem la mort pl = t.content if pl in self.deads: self.deads[pl] += 1 else: self.deads[pl] = 1 t.content = 0 # buidem casella # Pinta de costat caselles (jugadors) i grups def debugGrid(self): txt = "" sz = self.gridsize for y in range(0, sz): for x in range(0, sz): t = self.grid[y][x] if t: txt += str(t.content) else: txt += " " txt += " " # deixem un espai entre mig for x in range(0, sz): t = self.grid[y][x] if t: txt += str(t.group) if t.content else str( 0 ) # per no liar, no imprimim els grups de caselles buides else: txt += " " txt += "\n" print txt print self.score() def reloadGridGraphics(self): # Actualitza els grafics de cada tile sz = self.gridsize for y in range(0, sz): for x in range(0, sz): t = self.grid[x][y] if t: if t.content == 0: # No pertany a cap jugador t.upperimg = self.baseatlas['tileNone'] elif t.upperimg == self.baseatlas[ 'tileNone']: # Si encara no te imatge... if t.content == 1: # Jugador 1 posibles = [ i for i in self.playeratlas.textures.keys() if i.startswith("wood") ] else: # Jugador 2 posibles = [ i for i in self.playeratlas.textures.keys() if i.startswith("sand") ] t.upperimg = self.playeratlas[random.choice(posibles)] # Realitza un moviment. Torna fals si no es possible (suicidi), o true en cas contrari def doMovement(self, t, player=None): if t.content == 0: # si ja està ocupada res # Per poder provar jugades desde l'ordinador if player: t.content = player else: t.content = self.player self.setTileGroups() # Validem que no hi hagi suicidi dead = False if t.group in self.deadGroups: # Pot ser que sigui un suicidi d'atac: Estas matant un altre grup i per tant no mors # Per compvoar això, si hi ha més d'un grup mort, treiem el nostre grup dels grups # morts, matem els grups, refem els grups, i si estem vius es jugada valida dead = True if len(self.deadGroups) > 1: state = self.getState() self.deadGroups.remove(t.group) otherDeads = self.deadGroups self.deleteGroups() self.setTileGroups() if not t.group in self.deadGroups: dead = False self.deadGroups = otherDeads self.loadState(state) return not dead # if dead: # return False # else: # # Correcte, seguim jugada # return True else: return False @mainthread def manageTurn(self, t, playerMove=True): # Si el jugador intenta jugar mentre es el torn de la IA, no fem res if playerMove and not self.gametype == GAMETYPE[ "PVP"] and self.player == 2: return False # En cap cas es pot jugar sobre una casella ocupada if not t.content == 0: return False state = self.getState() if self.doMovement(t): # Correcte, seguim jugada self.deleteGroups() self.reloadGridGraphics() self.lastPass = False self.debugGrid() # Guardem estat a cada moviment self.nextPlayer() self.store.put('save', state=self.getState()) else: self.loadState(state) launchSimpleModal("INVALID MOVE\nYou can't suicide.") playClickSound() @mainthread def doPass(self, playerMove=True): if playerMove and not self.gametype == GAMETYPE[ "PVP"] and self.player == 2: return False if not self.gametype == GAMETYPE["PVP"] and self.player == 2: launchSimpleModal("CPU passed.") if self.lastPass: # Final del joc self.gameOver() else: self.lastPass = True self.nextPlayer() def getNextPlayerNum(self, player): if player == 1: player = 2 elif player == 2: player = 1 return player def nextPlayer(self): # Gestiona el canvi de jugador self.player = self.getNextPlayerNum(self.player) self.gui.setPlayerText(self.player) if not self.gametype == GAMETYPE["PVP"] and self.player == 2: self.startCpu() def startCpu(self): threading.Thread(target=self.cpu.move, args=(self, )).start() # Retorna la puntuació en un moment concret, desglosada def score(self): score = {1: 0, 2: 0} deadScore = {1: 0, 2: 0} # Sumem mortes deadScore[1] += self.deads[2] if 2 in self.deads else 0 deadScore[2] += self.deads[1] if 1 in self.deads else 0 for k in score.keys(): score[k] += deadScore[k] + self.tileScore[k] + self.terrScore[k] score['tileScore'] = self.tileScore score['terrScore'] = self.terrScore score['deadScore'] = deadScore return score @mainthread def gameOver(self): score = self.score() # Qui ha guanyat? whowin = "TIE!" if score[1] > score[2]: whowin = "Player 1 WINS!" elif score[1] < score[2]: whowin = "Player 2 WINS!" # Esborrem partida, mostrem guanyador, tornem al menu if self.store.exists('save'): self.store.delete('save') launchSimpleModal("Game Finished\nP1: " + str(score[1]) + " | P2: " + str(score[2]) + "\n" + whowin) self.parent.parent.gameOver()
def add_data(store, name, data): store = DictStore(store) if not store.exists(name) and name != "default": store.put(name, data=data) else: raise StoreException("The dice exist")