Mercurial > libervia-backend
view frontends/quick_frontend/quick_card_game.py @ 148:1d74c59a36a9
Quick Frontend: quick card game: added convenience method getPlayerLocation & __fakePlay
getPlayerLocation give the place of the player (top, left, bottom or right)
__fakePlay try to play every card, usefull for autoplay when debugging
author | Goffi <goffi@goffi.org> |
---|---|
date | Wed, 28 Jul 2010 19:56:12 +0800 |
parents | 80661755ea8d |
children | 74aaf230a7c3 |
line wrap: on
line source
#!/usr/bin/python # -*- coding: utf-8 -*- """ helper class for making a SAT frontend Copyright (C) 2009, 2010 Jérôme Poisson (goffi@goffi.org) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. """ from logging import debug, info, error from tools.jid import JID class QuickCardGame(): def __init__(self, parent, referee, players, player_nick): self.__fake_idx = 0 #gof: self.parent = parent self.referee = referee self.players = players self.played = {} for player in players: self.played[player] = None self.player_nick = player_nick self.bottom_nick = unicode(self.player_nick) idx = self.players.index(self.player_nick) idx = (idx + 1) % len(self.players) self.right_nick = unicode(self.players[idx]) idx = (idx + 1) % len(self.players) self.top_nick = unicode(self.players[idx]) idx = (idx + 1) % len(self.players) self.left_nick = unicode(self.players[idx]) self.bottom_nick = unicode(player_nick) self.selected = [] #Card choosed by the player (e.g. during ecart) self.hand_size = 13 #number of cards in a hand self.hand = [] self.to_show = [] self.state = None def getPlayerLocation(self, nick): """return player location (top,bottom,left or right)""" for location in ['top','left','bottom','right']: if getattr(self,'%s_nick' % location) == nick: return location assert(False) def loadCards(self): """Load all the cards in memory @param dir: directory where the PNG files are""" self.cards={} self.deck=[] self.cards["atout"]={} #As Tarot is a french game, it's more handy & logical to keep french names self.cards["pique"]={} #spade self.cards["coeur"]={} #heart self.cards["carreau"]={} #diamond self.cards["trefle"]={} #club def newGame(self, hand): """Start a new game, with given hand""" assert (len(self.hand) == 0) for suit, value in hand: self.hand.append(self.cards[suit, value]) self.hand.sort() self.state = "init" def contratSelected(self, contrat): """Called when the contrat has been choosed @param data: form result""" self.parent.host.bridge.tarotGameContratChoosed(self.player_nick, self.referee, contrat or 'Passe', self.parent.host.profile) def chooseContrat(self, xml_data): """Called when the player as to select his contrat @param xml_data: SàT xml representation of the form""" raise NotImplementedError def showCards(self, game_stage, cards, data): """Display cards in the middle of the game (to show for e.g. chien ou poignée)""" self.to_show = [] for suit, value in cards: self.to_show.append(self.cards[suit, value]) if game_stage == "chien" and data['attaquant'] == self.player_nick: self.state = "wait_for_ecart" else: self.state = "chien" def myTurn(self): """Called when we have to play :)""" if self.state == "chien": self.to_show = [] self.state = "play" self.__fakePlay() #gof: def __fakePlay(self): """Convenience method for stupid autoplay /!\ don't forgot to comment any interactive dialog for invalid card""" #gof: if self.__fake_idx >= len(self.hand): self.__fake_idx = 0 card = self.hand[self.__fake_idx] self.parent.host.bridge.tarotGamePlayCards(self.player_nick, self.referee, [(card.suit, card.value)], profile_key = self.parent.host.profile) del self.hand[self.__fake_idx] self.state = "wait" self.__fake_idx+=1 def showScores(self, xml_data, winners, loosers): """Called when the player as to select hist contrat @param xml_data: SàT xml representation of the form""" raise NotImplementedError def cardsPlayed(self, player, cards): """A card has been played by player""" if self.to_show: self.to_show = [] pl_cards = [] if self.played[player] != None: #gof: à supprimer for pl in self.played: self.played[pl] = None for suit, value in cards: pl_cards.append(self.cards[suit, value]) self.played[player] = pl_cards[0] def invalidCards(self, phase, played_cards, invalid_cards): """Invalid cards have been played @param phase: phase of the game @param played_cards: all the cards played @param invalid_cards: cards which are invalid""" if phase == "play": self.state = "play" elif phase == "ecart": self.state = "ecart" else: error ('INTERNAL ERROR: unmanaged game phase') for suit, value in played_cards: self.hand.append(self.cards[suit, value]) self.hand.sort() self.__fakePlay() #gof: