Exemple #1
0
 def newTilePositions(self):
     """returns list(TileAttr) for all tiles except bonus tiles.
     The tiles are not associated to any board."""
     result = list()
     isScoringGame = self.player.game.isScoringGame()
     newUpperMelds = list(self.player.exposedMelds)
     if isScoringGame:
         newLowerMelds = list(self.player.concealedMelds)
     else:
         if self.player.concealedMelds:
             newLowerMelds = sorted(self.player.concealedMelds, key=meldKey)
         else:
             tileStr = 'R' + ''.join(self.player.concealedTileNames)
             handStr = ' '.join([tileStr, self.player.mjString()])
             content = Hand.cached(self.player, handStr)
             newLowerMelds = list(Meld(x) for x in content.sortedMeldsContent.split())
             if newLowerMelds:
                 if self.rearrangeMelds:
                     if newLowerMelds[0].pairs[0] == 'Xy':
                         newLowerMelds = sorted(newLowerMelds, key=len, reverse=True)
                 else:
                     # generate one meld with all sorted tiles
                     newLowerMelds = [Meld(sorted(sum((x.pairs for x in newLowerMelds), []), key=elementKey))]
     for yPos, melds in ((0, newUpperMelds), (self.lowerY, newLowerMelds)):
         meldDistance = self.concealedMeldDistance if yPos else self.exposedMeldDistance
         meldX = 0
         for meld in melds:
             for idx in range(len(meld)):
                 result.append(TileAttr(self, meld, idx, meldX, yPos))
                 meldX += 1
             meldX += meldDistance
     return sorted(result, key=lambda x: x.yoffset * 100 + x.xoffset)
Exemple #2
0
 def computeHand(self, withTile=None, robbedTile=None, singleRule=None, asWinner=False):
     """returns a Hand object, using a cache"""
     game = self.game
     if not game.isScoringGame():
         # maybe we need a more extended class hierarchy for Player, VisiblePlayer, ScoringPlayer,
         # PlayingPlayer but not now. Just make sure that ExplainView can always call the
         # same computeHand regardless of the game type
         return Player.computeHand(self, withTile=withTile, robbedTile=robbedTile, asWinner=asWinner)
     if not self.handBoard:
         return None
     string = ' '.join([self.scoringString(), self.__mjstring(singleRule, asWinner), self.__lastString(asWinner)])
     return Hand.cached(self, string, computedRules=singleRule)
Exemple #3
0
 def computeHand(self, withTile=None, robbedTile=None, dummy=None, asWinner=False):
     """returns Hand for this player"""
     assert not (self._concealedMelds and self.__concealedTileNames)
     assert not isinstance(self.lastTile, Tile)
     assert not isinstance(withTile, Tile)
     melds = ['R' + ''.join(self.__concealedTileNames)]
     if withTile:
         melds[0] += withTile
     melds.extend(x.joined for x in self._exposedMelds)
     melds.extend(x.joined for x in self._concealedMelds)
     melds.extend(''.join(x.element) for x in self.__bonusTiles)
     mjString = self.mjString(asWinner)
     melds.append(mjString)
     if mjString.startswith('M') and (withTile or self.lastTile):
         melds.append('L%s%s' % (withTile or self.lastTile, self.lastMeld.joined))
     return Hand.cached(self, ' '.join(melds), robbedTile=robbedTile)
Exemple #4
0
 def computeHand(self,
                 withTile=None,
                 robbedTile=None,
                 singleRule=None,
                 asWinner=False):
     """returns a Hand object, using a cache"""
     game = self.game
     if not game.isScoringGame():
         # maybe we need a more extended class hierarchy for Player, VisiblePlayer, ScoringPlayer,
         # PlayingPlayer but not now. Just make sure that ExplainView can always call the
         # same computeHand regardless of the game type
         return Player.computeHand(self,
                                   withTile=withTile,
                                   robbedTile=robbedTile,
                                   asWinner=asWinner)
     if not self.handBoard:
         return None
     string = ' '.join([
         self.scoringString(),
         self.__mjstring(singleRule, asWinner),
         self.__lastString(asWinner)
     ])
     return Hand.cached(self, string, computedRules=singleRule)