diff --git a/pysollib/games/napoleon.py b/pysollib/games/napoleon.py index 047d902f..ffc4937b 100644 --- a/pysollib/games/napoleon.py +++ b/pysollib/games/napoleon.py @@ -1,6 +1,6 @@ #!/usr/bin/env python # -*- mode: python; coding: utf-8; -*- -# ---------------------------------------------------------------------------## +# --------------------------------------------------------------------------- # # Copyright (C) 1998-2003 Markus Franz Xaver Johannes Oberhumer # Copyright (C) 2003 Mt. Hood Playing Card Co. @@ -19,26 +19,33 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . # -# ---------------------------------------------------------------------------## +# --------------------------------------------------------------------------- __all__ = [] # imports -import sys # PySol imports -from pysollib.mygettext import _, n_ +from pysollib.mygettext import _ from pysollib.gamedb import registerGame, GameInfo, GI -from pysollib.util import * from pysollib.mfxutil import kwdefault -from pysollib.stack import * from pysollib.game import Game from pysollib.layout import Layout -from pysollib.hint import AbstractHint, DefaultHint, CautiousDefaultHint +from pysollib.hint import CautiousDefaultHint from pysollib.pysoltk import MfxCanvasText from braid import Braid_Foundation +from pysollib.util import ACE, KING, RANKS, UNLIMITED_CARDS + +from pysollib.stack import \ + BasicRowStack, \ + InitialDealTalonStack, \ + ReserveStack, \ + SS_FoundationStack, \ + Stack, \ + UD_SS_RowStack, \ + StackWrapper # ************************************************************************ # * stacks @@ -57,9 +64,9 @@ class Napoleon_ReserveStack(BasicRowStack): class Napoleon_SingleFreeCell(ReserveStack): def acceptsCards(self, from_stack, cards): -## if from_stack.id >= 8: -## # from_stack must be a Napoleon_RowStack -## return False + # if from_stack.id >= 8: + # # from_stack must be a Napoleon_RowStack + # return False return ReserveStack.acceptsCards(self, from_stack, cards) def canMoveCards(self, cards): @@ -122,7 +129,7 @@ class DerKleineNapoleon(Game): y = y + l.YS # talon if cells == 1: - ##x, y = l.XM, self.height - l.YS + # x, y = l.XM, self.height - l.YS y = self.height + l.YS else: y = self.height - l.YS @@ -144,9 +151,11 @@ class DerKleineNapoleon(Game): # def _shuffleHook(self, cards): - # move 4 cards of the same rank to bottom of the Talon (i.e. last cards to be dealt) + # move 4 cards of the same rank to bottom of the Talon (i.e. + # last cards to be dealt) rank = cards[-1].rank - return self._shuffleHookMoveToBottom(cards, lambda c, rank=rank: (c.rank == rank, c.suit)) + return self._shuffleHookMoveToBottom( + cards, lambda c, rank=rank: (c.rank == rank, c.suit)) def startGame(self): for i in range(4): @@ -249,6 +258,7 @@ class Napoleon(DerKleineNapoleon): class FreeNapoleon(DerFreieNapoleon): FreeCell_Class = Napoleon_FreeCell + def createGame(self): DerFreieNapoleon.createGame(self, cells=2) @@ -298,7 +308,8 @@ class TheLittleCorporal(DerFreieNapoleon): x += l.XS tx, ty, ta, tf = l.getTextAttr(s.foundations[-1], "se") font = self.app.getFont("canvas_default") - self.texts.info = MfxCanvasText(self.canvas, tx, ty, anchor=ta, font=font) + self.texts.info = MfxCanvasText( + self.canvas, tx, ty, anchor=ta, font=font) x += 2*l.XS stack = ReserveStack(x, y, self, max_cards=UNLIMITED_CARDS) s.reserves.append(stack) @@ -360,7 +371,7 @@ class BusyCards(Game): Hint_Class = CautiousDefaultHint def createGame(self): - rows=12 + rows = 12 l, s = Layout(self), self.s self.setSize(l.XM+rows*l.XS, l.YM + 3*l.YS+16*l.YOFFSET) @@ -390,8 +401,10 @@ class BusyCards(Game): l.defaultStackGroups() def _shuffleHook(self, cards): - return self._shuffleHookMoveToTop(cards, - lambda c: ((c.rank in (ACE,KING) and c.deck == 0), (c.rank, c.suit))) + return self._shuffleHookMoveToTop( + cards, + lambda c: ((c.rank in (ACE, KING) and c.deck == 0), + (c.rank, c.suit))) def startGame(self): self.s.talon.dealRow(rows=self.s.foundations, frames=0) @@ -403,7 +416,6 @@ class BusyCards(Game): shallHighlightMatch = Game._shallHighlightMatch_SS - # register the game registerGame(GameInfo(167, DerKleineNapoleon, "Der kleine Napoleon", GI.GT_NAPOLEON | GI.GT_OPEN, 1, 0, GI.SL_MOSTLY_SKILL)) @@ -418,7 +430,8 @@ registerGame(GameInfo(536, Master, "Master", registerGame(GameInfo(537, TheLittleCorporal, "The Little Corporal", GI.GT_NAPOLEON | GI.GT_OPEN, 1, 0, GI.SL_MOSTLY_SKILL)) registerGame(GameInfo(538, Bonaparte, "Bonaparte", - GI.GT_NAPOLEON | GI.GT_OPEN | GI.GT_ORIGINAL, 1, 0, GI.SL_MOSTLY_SKILL)) + GI.GT_NAPOLEON | GI.GT_OPEN | GI.GT_ORIGINAL, 1, 0, + GI.SL_MOSTLY_SKILL)) registerGame(GameInfo(705, BusyCards, "Busy Cards", - GI.GT_NAPOLEON | GI.GT_OPEN | GI.GT_ORIGINAL, 2, 0, GI.SL_MOSTLY_SKILL)) - + GI.GT_NAPOLEON | GI.GT_OPEN | GI.GT_ORIGINAL, 2, 0, + GI.SL_MOSTLY_SKILL)) diff --git a/pysollib/games/needle.py b/pysollib/games/needle.py index e284013a..2697cade 100644 --- a/pysollib/games/needle.py +++ b/pysollib/games/needle.py @@ -24,17 +24,22 @@ __all__ = [] # imports -import sys # PySol imports from pysollib.gamedb import registerGame, GameInfo, GI -from pysollib.util import * -from pysollib.mfxutil import kwdefault -from pysollib.stack import * from pysollib.game import Game from pysollib.layout import Layout -from pysollib.hint import AbstractHint, DefaultHint, CautiousDefaultHint +from pysollib.hint import CautiousDefaultHint +# from pysollib.util import ANY_SUIT, KING + +from pysollib.stack import \ + AC_RowStack, \ + InitialDealTalonStack, \ + OpenStack, \ + ReserveStack, \ + SS_FoundationStack, \ + StackWrapper # ************************************************************************ # * Needle @@ -42,6 +47,7 @@ from pysollib.hint import AbstractHint, DefaultHint, CautiousDefaultHint # * Pitchfork # ************************************************************************ + class Needle(Game): Hint_Class = CautiousDefaultHint @@ -64,7 +70,8 @@ class Needle(Game): stack = self.ReserveStack_Class(x, y, self) stack.CARD_XOFFSET, stack.CARD_YOFFSET = l.XOFFSET, 0 s.reserves.append(stack) - self.setRegion(s.reserves, (-999, -999, w-4*l.XS-l.CW/2, l.YM+l.YS-l.CH/2)) + self.setRegion( + s.reserves, (-999, -999, w-4*l.XS-l.CW/2, l.YM+l.YS-l.CH/2)) x = w-4*l.XS for i in range(4): @@ -119,4 +126,3 @@ registerGame(GameInfo(319, Haystack, "Haystack", GI.GT_FREECELL | GI.GT_OPEN, 1, 0, GI.SL_MOSTLY_SKILL)) registerGame(GameInfo(367, Pitchfork, "Pitchfork", GI.GT_FREECELL | GI.GT_OPEN, 1, 0, GI.SL_MOSTLY_SKILL)) - diff --git a/pysollib/games/numerica.py b/pysollib/games/numerica.py index 73ee0b31..7f60e4d7 100644 --- a/pysollib/games/numerica.py +++ b/pysollib/games/numerica.py @@ -1,6 +1,6 @@ #!/usr/bin/env python # -*- mode: python; coding: utf-8; -*- -# ---------------------------------------------------------------------------## +# --------------------------------------------------------------------------- # # Copyright (C) 1998-2003 Markus Franz Xaver Johannes Oberhumer # Copyright (C) 2003 Mt. Hood Playing Card Co. @@ -19,33 +19,52 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . # -# ---------------------------------------------------------------------------## +# --------------------------------------------------------------------------- __all__ = [] # imports -import sys, time +import time # PySol imports -from pysollib.mygettext import _, n_ +from pysollib.mygettext import _ from pysollib.gamedb import registerGame, GameInfo, GI -from pysollib.util import * -from pysollib.stack import * from pysollib.game import Game from pysollib.layout import Layout -from pysollib.hint import AbstractHint, DefaultHint, CautiousDefaultHint +from pysollib.hint import DefaultHint, CautiousDefaultHint from pysollib.mfxutil import kwdefault +from pysollib.util import ACE, ANY_RANK, ANY_SUIT, JACK, KING, NO_RANK, \ + UNLIMITED_ACCEPTS, \ + UNLIMITED_CARDS + +from pysollib.stack import \ + AC_RowStack, \ + BasicRowStack, \ + DealRowTalonStack, \ + InitialDealTalonStack, \ + OpenStack, \ + OpenTalonStack, \ + RK_FoundationStack, \ + RK_RowStack, \ + ReserveStack, \ + SS_FoundationStack, \ + Stack, \ + StackWrapper, \ + TalonStack, \ + WasteStack, \ + WasteTalonStack # ************************************************************************ # * # ************************************************************************ + class Numerica_Hint(DefaultHint): # FIXME: demo is clueless - #def _getDropCardScore(self, score, color, r, t, ncards): - #FIXME: implement this method + # def _getDropCardScore(self, score, color, r, t, ncards): + # FIXME: implement this method def _getMoveWasteScore(self, score, color, r, t, pile, rpile): assert r in (self.game.s.waste, self.game.s.talon) and len(pile) == 1 @@ -80,7 +99,7 @@ class Numerica_RowStack(BasicRowStack): getBottomImage = Stack._getReserveBottomImage def getHelp(self): - ##return _('Tableau. Accepts any one card from the Waste.') + # return _('Tableau. Accepts any one card from the Waste.') return _('Tableau. Build regardless of rank and suit.') @@ -97,7 +116,8 @@ class Numerica(Game): # game layout # - def createGame(self, rows=4, reserve=False, max_rounds=1, waste_max_cards=1): + def createGame(self, rows=4, reserve=False, max_rounds=1, + waste_max_cards=1): # create layout l, s = Layout(self), self.s decks = self.gameinfo.decks @@ -142,7 +162,6 @@ class Numerica(Game): return l - # # game overrides # @@ -169,6 +188,7 @@ class Numerica2Decks(Numerica): class LadyBetty(Numerica): Foundation_Class = SS_FoundationStack + def createGame(self): Numerica.createGame(self, rows=6) @@ -243,6 +263,7 @@ class PussInTheCorner_Foundation(SS_FoundationStack): def __init__(self, x, y, game, **cap): kwdefault(cap, base_suit=ANY_SUIT) SS_FoundationStack.__init__(self, x, y, game, ANY_SUIT, **cap) + def acceptsCards(self, from_stack, cards): if not SS_FoundationStack.acceptsCards(self, from_stack, cards): return False @@ -251,6 +272,7 @@ class PussInTheCorner_Foundation(SS_FoundationStack): if cards[0].color != self.cards[-1].color: return False return True + def getHelp(self): return _('Foundation. Build up by color.') @@ -266,7 +288,7 @@ class PussInTheCorner_RowStack(BasicRowStack): getBottomImage = Stack._getReserveBottomImage def getHelp(self): - ##return _('Tableau. Accepts any one card from the Waste.') + # return _('Tableau. Accepts any one card from the Waste.') return _('Tableau. Build regardless of rank and suit.') @@ -275,8 +297,8 @@ class PussInTheCorner(Numerica): def createGame(self, rows=4): l, s = Layout(self), self.s self.setSize(l.XM+5*l.XS, l.YM+4*l.YS) - for x, y in ((l.XM, l.YM ), - (l.XM+4*l.XS, l.YM ), + for x, y in ((l.XM, l.YM), + (l.XM+4*l.XS, l.YM), (l.XM, l.YM+3*l.YS), (l.XM+4*l.XS, l.YM+3*l.YS), ): @@ -284,10 +306,10 @@ class PussInTheCorner(Numerica): max_accept=1, max_move=1) stack.CARD_XOFFSET, stack.CARD_YOFFSET = 0, 0 s.rows.append(stack) - for x, y in ((l.XM+1.5*l.XS, l.YM+ l.YS), - (l.XM+1.5*l.XS, l.YM+2*l.YS), - (l.XM+2.5*l.XS, l.YM+ l.YS), - (l.XM+2.5*l.XS, l.YM+2*l.YS), + for x, y in ((l.XM+1.5*l.XS, l.YM + l.YS), + (l.XM+1.5*l.XS, l.YM + 2*l.YS), + (l.XM+2.5*l.XS, l.YM + l.YS), + (l.XM+2.5*l.XS, l.YM + 2*l.YS), ): s.foundations.append(PussInTheCorner_Foundation(x, y, self, max_move=0)) @@ -299,18 +321,15 @@ class PussInTheCorner(Numerica): # define stack-groups l.defaultStackGroups() - def _shuffleHook(self, cards): - return self._shuffleHookMoveToTop(cards, - lambda c: (c.rank == ACE, c.suit)) - + return self._shuffleHookMoveToTop( + cards, lambda c: (c.rank == ACE, c.suit)) def startGame(self): self.startDealSample() self.s.talon.dealRow(rows=self.s.foundations) self.s.talon.fillStack() - def _autoDeal(self, sound=True): return 0 @@ -324,7 +343,7 @@ class PussInTheCorner(Numerica): class Frog(Game): Hint_Class = Numerica_Hint - ##Foundation_Class = SS_FoundationStack + # Foundation_Class = SS_FoundationStack Foundation_Class = RK_FoundationStack def createGame(self): @@ -356,14 +375,13 @@ class Frog(Game): x += l.XS for i in range(5): stack = Numerica_RowStack(x, y, self, max_accept=UNLIMITED_ACCEPTS) - #stack.CARD_XOFFSET, stack.CARD_YOFFSET = 0, l.YOFFSET + # stack.CARD_XOFFSET, stack.CARD_YOFFSET = 0, l.YOFFSET s.rows.append(stack) x = x + l.XS # define stack-groups l.defaultStackGroups() - def startGame(self): self.startDealSample() n = 0 @@ -373,7 +391,7 @@ class Frog(Game): if c.rank == ACE: r = self.s.foundations[f] f += 1 - ##r = self.s.foundations[c.suit*2] + # r = self.s.foundations[c.suit*2] else: r = self.s.reserves[0] n += 1 @@ -388,8 +406,8 @@ class Fly(Frog): Foundation_Class = RK_FoundationStack def _shuffleHook(self, cards): - return self._shuffleHookMoveToTop(cards, - lambda c: (c.rank == ACE, c.suit)) + return self._shuffleHookMoveToTop( + cards, lambda c: (c.rank == ACE, c.suit)) def startGame(self): self.startDealSample() @@ -439,7 +457,8 @@ class Gnat(Game): x, y = l.XM+2*l.XS, l.YM+l.YS for i in range(4): - s.rows.append(Numerica_RowStack(x, y, self, max_accept=UNLIMITED_ACCEPTS)) + s.rows.append( + Numerica_RowStack(x, y, self, max_accept=UNLIMITED_ACCEPTS)) x += l.XS x = l.XM+6*l.XS for i in range(2): @@ -452,10 +471,9 @@ class Gnat(Game): # define stack-groups l.defaultStackGroups() - def _shuffleHook(self, cards): - return self._shuffleHookMoveToTop(cards, - lambda c: (c.rank == ACE, c.suit)) + return self._shuffleHookMoveToTop( + cards, lambda c: (c.rank == ACE, c.suit)) def startGame(self): self.startDealSample() @@ -529,7 +547,8 @@ class Gloaming(Game): x += l.XS for i in range(rows): - s.rows.append(Gloaming_RowStack(x, y, self, max_accept=UNLIMITED_ACCEPTS)) + s.rows.append( + Gloaming_RowStack(x, y, self, max_accept=UNLIMITED_ACCEPTS)) x += l.XS s.talon = InitialDealTalonStack(w-l.XS, h-l.YS, self) @@ -537,7 +556,6 @@ class Gloaming(Game): # default l.defaultAll() - def startGame(self): n = 52/len(self.s.reserves)+1 for i in range(n-3): @@ -550,6 +568,7 @@ class Gloaming(Game): class Chamberlain(Gloaming): Foundation_Class = RK_FoundationStack + def createGame(self, reserves=3, rows=5): Gloaming.createGame(self, reserves=4, rows=3) @@ -567,6 +586,7 @@ class Toad_TalonStack(DealRowTalonStack): if r.cards: return False return True + def dealCards(self, sound=False): self.dealRow(rows=self.game.s.reserves, sound=sound) @@ -592,7 +612,8 @@ class Toad(Game): x += l.XS x, y = l.XM+3*l.XS/2, l.YM+l.YS for i in range(5): - s.rows.append(Gloaming_RowStack(x, y, self, max_accept=UNLIMITED_ACCEPTS)) + s.rows.append( + Gloaming_RowStack(x, y, self, max_accept=UNLIMITED_ACCEPTS)) x += l.XS y = l.YM+l.YS/2 for i in (3, 3, 3, 3, 1): @@ -627,7 +648,7 @@ class Shifting_RowStack(Numerica_RowStack): if not self.cards: return cards[0].rank == KING if (from_stack in self.game.s.rows and - self.cards[-1].rank-cards[0].rank == 1): + self.cards[-1].rank-cards[0].rank == 1): return True return False @@ -651,7 +672,8 @@ class Strategerie_RowStack(BasicRowStack): def acceptsCards(self, from_stack, cards): if not BasicRowStack.acceptsCards(self, from_stack, cards): return False - if from_stack is self.game.s.talon or from_stack in self.game.s.reserves: + if from_stack is self.game.s.talon or \ + from_stack in self.game.s.reserves: return True return False @@ -739,7 +761,8 @@ class AnnoDomini(Numerica): RowStack_Class = StackWrapper(AC_RowStack, mod=13) def createGame(self): - l = Numerica.createGame(self, max_rounds=3, waste_max_cards=UNLIMITED_CARDS) + l = Numerica.createGame( + self, max_rounds=3, waste_max_cards=UNLIMITED_CARDS) year = str(time.localtime()[0]) i = 0 for s in self.s.foundations: @@ -784,15 +807,15 @@ class CircleNine(Game): l, s = Layout(self), self.s self.setSize(l.XM+7*l.XS, l.YM+3*l.YS) - for i, j in ((1,0), - (2,0), - (3,0), - (4,0), - (5,1), - (3.5,2), - (2.5,2), - (1.5,2), - (0,1), + for i, j in ((1, 0), + (2, 0), + (3, 0), + (4, 0), + (5, 1), + (3.5, 2), + (2.5, 2), + (1.5, 2), + (0, 1), ): x, y = l.XM+(1+i)*l.XS, l.YM+j*l.YS stack = CircleNine_RowStack(x, y, self, max_accept=1, @@ -812,14 +835,12 @@ class CircleNine(Game): l.defaultStackGroups() self.sg.dropstacks.append(s.talon) - def startGame(self): self.startDealSample() self.s.talon.dealRow(rows=self.s.foundations) self.s.talon.dealRow() self.s.talon.fillStack() - def fillStack(self, stack): if stack in self.s.rows and not stack.cards: if self.s.talon.cards: @@ -955,8 +976,8 @@ class Aglet(Game): def _shuffleHook(self, cards): # move Aces to top of the Talon (i.e. first cards to be dealt) - return self._shuffleHookMoveToTop(cards, - lambda c: (c.rank == ACE, c.suit)) + return self._shuffleHookMoveToTop( + cards, lambda c: (c.rank == ACE, c.suit)) def startGame(self): self.s.talon.dealRow(rows=self.s.foundations, frames=0) @@ -967,11 +988,10 @@ class Aglet(Game): self.s.talon.dealRowAvail() - # register the game registerGame(GameInfo(257, Numerica, "Numerica", GI.GT_NUMERICA | GI.GT_CONTRIB, 1, 0, GI.SL_BALANCED, - altnames=("Sir Tommy",) )) + altnames=("Sir Tommy",))) registerGame(GameInfo(171, LadyBetty, "Lady Betty", GI.GT_NUMERICA, 1, 0, GI.SL_BALANCED)) registerGame(GameInfo(355, Frog, "Frog", @@ -982,9 +1002,11 @@ registerGame(GameInfo(356, Fly, "Fly", registerGame(GameInfo(357, Gnat, "Gnat", GI.GT_NUMERICA, 1, 0, GI.SL_BALANCED)) registerGame(GameInfo(378, Gloaming, "Gloaming", - GI.GT_NUMERICA | GI.GT_OPEN | GI.GT_ORIGINAL, 1, 0, GI.SL_MOSTLY_SKILL)) + GI.GT_NUMERICA | GI.GT_OPEN | GI.GT_ORIGINAL, 1, 0, + GI.SL_MOSTLY_SKILL)) registerGame(GameInfo(379, Chamberlain, "Chamberlain", - GI.GT_NUMERICA | GI.GT_OPEN | GI.GT_ORIGINAL, 1, 0, GI.SL_MOSTLY_SKILL)) + GI.GT_NUMERICA | GI.GT_OPEN | GI.GT_ORIGINAL, 1, 0, + GI.SL_MOSTLY_SKILL)) registerGame(GameInfo(402, Toad, "Toad", GI.GT_NUMERICA, 2, 0, GI.SL_BALANCED)) registerGame(GameInfo(430, PussInTheCorner, "Puss in the Corner", @@ -1006,11 +1028,14 @@ registerGame(GameInfo(613, Fanny, "Fanny", registerGame(GameInfo(641, CircleNine, "Circle Nine", GI.GT_NUMERICA, 1, 0, GI.SL_BALANCED)) registerGame(GameInfo(643, Measure, "Measure", - GI.GT_NUMERICA | GI.GT_ORIGINAL, 1, 0, GI.SL_MOSTLY_SKILL)) + GI.GT_NUMERICA | GI.GT_ORIGINAL, 1, 0, + GI.SL_MOSTLY_SKILL)) registerGame(GameInfo(644, DoubleMeasure, "Double Measure", - GI.GT_NUMERICA | GI.GT_ORIGINAL, 2, 0, GI.SL_MOSTLY_SKILL)) + GI.GT_NUMERICA | GI.GT_ORIGINAL, 2, 0, + GI.SL_MOSTLY_SKILL)) registerGame(GameInfo(754, Amphibian, "Amphibian", - GI.GT_NUMERICA | GI.GT_ORIGINAL, 2, 0, GI.SL_MOSTLY_SKILL)) + GI.GT_NUMERICA | GI.GT_ORIGINAL, 2, 0, + GI.SL_MOSTLY_SKILL)) registerGame(GameInfo(760, Aglet, "Aglet", - GI.GT_1DECK_TYPE | GI.GT_ORIGINAL, 1, 0, GI.SL_MOSTLY_SKILL)) - + GI.GT_1DECK_TYPE | GI.GT_ORIGINAL, 1, 0, + GI.SL_MOSTLY_SKILL)) diff --git a/tests/style/py-flake8.t b/tests/style/py-flake8.t index ca63296a..d5e7962a 100644 --- a/tests/style/py-flake8.t +++ b/tests/style/py-flake8.t @@ -10,7 +10,7 @@ use String::ShellQuote qw/ shell_quote /; # my $cmd = shell_quote( 'flake8', '.' ); my $cmd = shell_quote( 'flake8', - grep { not($_ eq './pysollib/pysoltk.py' or $_ eq './pysollib/tile/ttk.py') } glob('./pysollib/*.py ./pysollib/[cmpuw]*/*.py ./pysollib/tile/*.py ./pysollib/ui/tktile/*.py ./pysollib/games/[a-my-z]*.py') ); + grep { not($_ eq './pysollib/pysoltk.py' or $_ eq './pysollib/tile/ttk.py') } glob('./pysollib/*.py ./pysollib/[cmpuw]*/*.py ./pysollib/tile/*.py ./pysollib/ui/tktile/*.py ./pysollib/games/[a-ny-z]*.py') ); # TEST eq_or_diff( scalar(`$cmd`), '', "flake8 is happy with the code." );