## vim:ts=4:et:nowrap ## ##---------------------------------------------------------------------------## ## ## PySol -- a Python Solitaire game ## ## Copyright (C) 2000 Markus Franz Xaver Johannes Oberhumer ## Copyright (C) 1999 Markus Franz Xaver Johannes Oberhumer ## Copyright (C) 1998 Markus Franz Xaver Johannes Oberhumer ## ## 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 2 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; see the file COPYING. ## If not, write to the Free Software Foundation, Inc., ## 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ## ## Markus F.X.J. Oberhumer ## ## http://www.oberhumer.com/pysol ## ##---------------------------------------------------------------------------## __all__ = [] # imports import sys # PySol imports 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.pysoltk import MfxCanvasText # /*********************************************************************** # // Doublets # ************************************************************************/ class Doublets_Foundation(AbstractFoundationStack): def acceptsCards(self, from_stack, cards): if not AbstractFoundationStack.acceptsCards(self, from_stack, cards): return 0 if self.cards: # check the rank if (2 * self.cards[-1].rank + 1) % self.cap.mod != cards[0].rank: return 0 return 1 class Doublets(Game): Hint_Class = CautiousDefaultHint # # game layout # def createGame(self): # create layout l, s = Layout(self), self.s # set window self.setSize(l.XM + 5.5*l.XS, l.YM + 4*l.YS) # create stacks for dx, dy in ((0, 0), (1, 0), (2, 0), (0, 1), (2, 1), (0, 2), (2, 2)): x, y = l.XM + (2*dx+5)*l.XS/2, l.YM + (2*dy+1)*l.YS/2 s.rows.append(ReserveStack(x, y, self)) dx, dy = 1, 2 x, y = l.XM + (2*dx+5)*l.XS/2, l.YM + (2*dy+1)*l.YS/2 s.foundations.append(Doublets_Foundation(x, y, self, ANY_SUIT, dir=0, mod=13, max_move=0, max_cards=48)) l.createText(s.foundations[0], "ss") ## help = "A, 2, 4, 8, 3, 6, Q, J, 9, 5, 10, 7, A, ..." ## self.texts.help = MfxCanvasText(self.canvas, x + l.CW/2, y + l.YS + l.YM, anchor="n", text=help) x, y = l.XM, l.YM + 3*l.YS/2 s.talon = WasteTalonStack(x, y, self, max_rounds=3) l.createText(s.talon, "ss") x = x + l.XS s.waste = WasteStack(x, y, self) l.createText(s.waste, "ss") # define stack-groups l.defaultStackGroups() # # game overrides # def _shuffleHook(self, cards): # move all Kings in the first 8 cards to the bottom kings, topcards = [], [] for c in cards[:]: cards.remove(c) if c.rank == KING: kings.append(c) else: topcards.append(c) if len(topcards) == 8: break return kings + cards + topcards def startGame(self): self.startDealSample() self.s.talon.dealRow() self.s.talon.dealRow(rows=self.s.foundations) self.s.talon.dealCards() # deal first card to WasteStack def isGameWon(self): if self.s.talon.cards or self.s.waste.cards: return 0 return len(self.s.foundations[0].cards) == 48 def fillStack(self, stack): if stack in self.s.rows and not stack.cards: old_state = self.enterState(self.S_FILL) if self.s.waste.cards: self.s.waste.moveMove(1, stack) elif self.s.talon.canDealCards(): self.s.talon.dealCards() self.s.waste.moveMove(1, stack) self.leaveState(old_state) def getAutoStacks(self, event=None): return ((), (), self.sg.dropstacks) # register the game registerGame(GameInfo(111, Doublets, "Doublets", GI.GT_1DECK_TYPE, 1, 2, GI.SL_MOSTLY_LUCK, altnames=('Double or Quits',) ))