예제 #1
2
파일: menu.py 프로젝트: afibanez/hexland
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')
예제 #2
0
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')
예제 #3
0
파일: store.py 프로젝트: Astyan-42/owndice
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)
예제 #4
0
파일: store.py 프로젝트: Astyan-42/owndice
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")
예제 #5
0
    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
예제 #6
0
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']
예제 #7
0
파일: Engine.py 프로젝트: cristivlas/fisher
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)
예제 #8
0
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])
예제 #9
0
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)
예제 #10
0
파일: hexgrid.py 프로젝트: afibanez/hexland
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()
예제 #11
0
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()
예제 #12
0
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)
예제 #13
0
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()
예제 #14
0
파일: store.py 프로젝트: Astyan-42/owndice
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")