diff --git a/pysollib/help.py b/pysollib/help.py index 97fd61a3..c24a1d50 100644 --- a/pysollib/help.py +++ b/pysollib/help.py @@ -1,31 +1,31 @@ #!/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. -## Copyright (C) 2005-2009 Skomoroh -## -## 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 . -## -##---------------------------------------------------------------------------## +# ---------------------------------------------------------------------------## +# +# Copyright (C) 1998-2003 Markus Franz Xaver Johannes Oberhumer +# Copyright (C) 2003 Mt. Hood Playing Card Co. +# Copyright (C) 2005-2009 Skomoroh +# +# 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 . +# +# ---------------------------------------------------------------------------## # imports # PySol imports -from pysollib.mygettext import _, n_ +from pysollib.mygettext import _ from pysollib.settings import TITLE, PACKAGE_URL, TOOLKIT, VERSION from pysollib.pysoltk import make_help_toplevel from pysollib.pysoltk import MfxMessageDialog @@ -43,9 +43,9 @@ def help_about(app, timeout=0, sound=True): t = _("A Python Solitaire Game Collection\n") if app.miscrandom.random() < 0.8: t = _("A World Domination Project\n") - strings=(_("&Nice"), _("&Credits...")) + strings = (_("&Nice"), _("&Credits...")) if timeout: - strings=(_("&Enjoy"),) + strings = (_("&Enjoy"),) version = _("Version %s") % VERSION d = PysolAboutDialog(app, app.top, title=_("About ") + TITLE, timeout=timeout, @@ -74,12 +74,17 @@ def help_credits(app, timeout=0, sound=True): if sound: app.audio.playSample("credits") t = "" - if TOOLKIT == "tk" : t = "Tcl/Tk" - elif TOOLKIT == "gtk": t = "PyGTK" - elif TOOLKIT == "kde": t = "pyKDE" - elif TOOLKIT == "wx" : t = "wxPython" - d = MfxMessageDialog(app.top, title=_("Credits"), timeout=timeout, - text=TITLE+_(''' credits go to: + if TOOLKIT == "tk": + t = "Tcl/Tk" + elif TOOLKIT == "gtk": + t = "PyGTK" + elif TOOLKIT == "kde": + t = "pyKDE" + elif TOOLKIT == "wx": + t = "wxPython" + d = MfxMessageDialog( + app.top, title=_("Credits"), timeout=timeout, + text=TITLE+_(''' credits go to: Volker Weidner for getting me into Solitaire Guido van Rossum for the initial example program @@ -90,8 +95,8 @@ Natascha The Python, %s, SDL & Linux crews for making this program possible''') % t, - image=app.gimages.logos[3], image_side="right", - separator=True) + image=app.gimages.logos[3], image_side="right", + separator=True) return d.status @@ -102,6 +107,7 @@ for making this program possible''') % t, help_html_viewer = None help_html_index = None + def help_html(app, document, dir_, top=None): global help_html_viewer, help_html_index if not document: @@ -114,38 +120,38 @@ def help_html(app, document, dir_, top=None): document, dir_ = "index.html", "html" help_html_index = app.dataloader.findFile(document, dir_) except EnvironmentError: - d = MfxMessageDialog(app.top, title=TITLE + _(" HTML Problem"), - text=_("Cannot find help document\n") + document, - bitmap="warning") + MfxMessageDialog(app.top, title=TITLE + _(" HTML Problem"), + text=_("Cannot find help document\n") + document, + bitmap="warning") return None - ##print doc, help_html_index + # print doc, help_html_index try: viewer = help_html_viewer - #if viewer.parent.winfo_parent() != top._w: + # if viewer.parent.winfo_parent() != top._w: # viewer.destroy() # viewer = None viewer.updateHistoryXYView() viewer.display(doc, relpath=0) except: - ##traceback.print_exc() + # traceback.print_exc() top = make_help_toplevel(app, title=TITLE+_(" Help")) if top.winfo_screenwidth() < 800 or top.winfo_screenheight() < 600: - #maximized = 1 + # maximized = 1 top.wm_minsize(300, 150) else: - #maximized = 0 + # maximized = 0 top.wm_minsize(400, 200) viewer = HTMLViewer(top, app, help_html_index) viewer.display(doc) - #wm_map(top, maximized=maximized) + # wm_map(top, maximized=maximized) viewer.parent.wm_deiconify() viewer.parent.tkraise() help_html_viewer = viewer return viewer + def destroy_help_html(): try: help_html_viewer.destroy() except: pass - diff --git a/pysollib/hint.py b/pysollib/hint.py index 011876e1..7fbb345c 100644 --- a/pysollib/hint.py +++ b/pysollib/hint.py @@ -1,25 +1,25 @@ #!/usr/bin/env pytho # -*- mode: python; coding: utf-8; -*- -##---------------------------------------------------------------------------## -## -## Copyright (C) 1998-2003 Markus Franz Xaver Johannes Oberhumer -## Copyright (C) 2003 Mt. Hood Playing Card Co. -## Copyright (C) 2005-2009 Skomoroh -## -## 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 . -## -##---------------------------------------------------------------------------## +# ---------------------------------------------------------------------------## +# +# Copyright (C) 1998-2003 Markus Franz Xaver Johannes Oberhumer +# Copyright (C) 2003 Mt. Hood Playing Card Co. +# Copyright (C) 2005-2009 Skomoroh +# +# 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 . +# +# ---------------------------------------------------------------------------## # imports @@ -41,6 +41,7 @@ from pysollib.util import KING # * The whole hint system is exclusively used by Game.getHints(). # ************************************************************************ + class HintInterface: # level == 0: show hint (key `H') # level == 1: show hint and display score value (key `Ctrl-H') @@ -95,7 +96,7 @@ class AbstractHint(HintInterface): self.hints = [] self.max_score = 0 self.__destructClones() - self.solver_state = 'not_started'; + self.solver_state = 'not_started' # # stack cloning @@ -130,19 +131,22 @@ class AbstractHint(HintInterface): # # Pressing `Ctrl-H' (level 1) will preserve the score. - def addHint(self, score, ncards, from_stack, to_stack, text_color=None, forced_move=None): + def addHint(self, score, ncards, from_stack, + to_stack, text_color=None, forced_move=None): if score < 0: return self.max_score = max(self.max_score, score) # add an atomic hint if self.score_flatten_value > 0: - score = (score / self.score_flatten_value) * self.score_flatten_value + score = (score / self.score_flatten_value) * \ + self.score_flatten_value if text_color is None: text_color = self.BLACK assert forced_move is None or len(forced_move) == 7 # pos is used for preserving the original sort order on equal scores pos = -len(self.hints) - ah = (int(score), pos, ncards, from_stack, to_stack, text_color, forced_move) + ah = (int(score), pos, ncards, from_stack, to_stack, + text_color, forced_move) self.hints.append(ah) # clean up and return hints sorted by score @@ -198,13 +202,15 @@ class AbstractHint(HintInterface): # we move the pile if it is accepted by the target stack def _defaultShallMovePile(self, from_stack, to_stack, pile, rpile): - if from_stack is to_stack or not to_stack.acceptsCards(from_stack, pile): + if from_stack is to_stack or not \ + to_stack.acceptsCards(from_stack, pile): return 0 return 1 # same, but check for loops def _cautiousShallMovePile(self, from_stack, to_stack, pile, rpile): - if from_stack is to_stack or not to_stack.acceptsCards(from_stack, pile): + if from_stack is to_stack or not \ + to_stack.acceptsCards(from_stack, pile): return 0 # if len(rpile) == 0: @@ -219,7 +225,8 @@ class AbstractHint(HintInterface): # same, but only check for loops only when in demo mode def _cautiousDemoShallMovePile(self, from_stack, to_stack, pile, rpile): - if from_stack is to_stack or not to_stack.acceptsCards(from_stack, pile): + if from_stack is to_stack or not \ + to_stack.acceptsCards(from_stack, pile): return 0 if self.level >= 2: # @@ -235,7 +242,6 @@ class AbstractHint(HintInterface): shallMovePile = _defaultShallMovePile - # # other utility methods # @@ -243,17 +249,17 @@ class AbstractHint(HintInterface): def _canDropAllCards(self, from_stack, stacks, stackcards): assert from_stack not in stacks return 0 -## # FIXME: this does not account for cards which are dropped herein -## cards = pile[:] -## cards.reverse() -## for card in cards: -## for s in stacks: -## if s is not from_stack: -## if s.acceptsCards(from_stack, [card]): -## break -## else: -## return 0 -## return 1 + # FIXME: this does not account for cards which are dropped herein + # cards = pile[:] + # cards.reverse() + # for card in cards: + # for s in stacks: + # if s is not from_stack: + # if s.acceptsCards(from_stack, [card]): + # break + # else: + # return 0 + # return 1 # # misc. constants @@ -281,7 +287,6 @@ class DefaultHint(AbstractHint): # # BTW, we do not cheat ! - # # bonus scoring used in _getXxxScore() below - subclass overrideable # @@ -289,13 +294,12 @@ class DefaultHint(AbstractHint): def _preferHighRankMoves(self): return 0 - # Basic bonus for moving a card. # Bonus must be in range 0..999 - BONUS_DROP_CARD = 300 # 0..400 - BONUS_SAME_SUIT_MOVE = 200 # 0..400 - BONUS_NORMAL_MOVE = 100 # 0..400 + BONUS_DROP_CARD = 300 # 0..400 + BONUS_SAME_SUIT_MOVE = 200 # 0..400 + BONUS_NORMAL_MOVE = 100 # 0..400 def _getMoveCardBonus(self, r, t, pile, rpile): assert pile @@ -319,7 +323,6 @@ class DefaultHint(AbstractHint): bonus += self.BONUS_NORMAL_MOVE + (1 + pile[0].rank) return bonus - # Special bonus for facing up a card after the current move. # Bonus must be in range 0..9000 @@ -333,12 +336,11 @@ class DefaultHint(AbstractHint): bonus = max(self.BONUS_FLIP_CARD - len(rpile), 0) return bonus - # Special bonus for moving a pile from stack r to stack t. # Bonus must be in range 0..9000 - BONUS_CREATE_EMPTY_ROW = 9000 # 0..9000 - BONUS_CAN_DROP_ALL_CARDS = 4000 # 0..4000 + BONUS_CREATE_EMPTY_ROW = 9000 # 0..9000 + BONUS_CAN_DROP_ALL_CARDS = 4000 # 0..4000 BONUS_CAN_CREATE_EMPTY_ROW = 2000 # 0..4000 def _getMoveSpecialBonus(self, r, t, pile, rpile): @@ -352,9 +354,10 @@ class DefaultHint(AbstractHint): if self._canDropAllCards(r, self.game.s.foundations, stackcards=rpile): # we can drop the whole remaining pile # (and will create an empty row in the next move) - ##print "BONUS_CAN_DROP_ALL_CARDS", r, pile, rpile + # print "BONUS_CAN_DROP_ALL_CARDS", r, pile, rpile self.bonus_color = self.RED - return self.BONUS_CAN_DROP_ALL_CARDS + self.BONUS_CAN_CREATE_EMPTY_ROW + return self.BONUS_CAN_DROP_ALL_CARDS + \ + self.BONUS_CAN_CREATE_EMPTY_ROW # check if the cards below our pile are a whole row if r.canMoveCards(rpile): # could we move the remaining pile ? @@ -366,12 +369,11 @@ class DefaultHint(AbstractHint): continue if x.acceptsCards(r, rpile): # we can create an empty row in the next move - ##print "BONUS_CAN_CREATE_EMPTY_ROW", r, x, pile, rpile + # print "BONUS_CAN_CREATE_EMPTY_ROW", r, x, pile, rpile self.bonus_color = self.BLUE return self.BONUS_CAN_CREATE_EMPTY_ROW return 0 - # # scoring used in getHints() - subclass overrideable # @@ -387,24 +389,23 @@ class DefaultHint(AbstractHint): assert 0 <= b2 <= 999 return score + b1 + b2, self.bonus_color - # Score for moving a pile (usually a single card) from the WasteStack. def _getMoveWasteScore(self, score, color, r, t, pile, rpile): assert pile self.bonus_color = color score = 30000 - if t.cards: score = 31000 + if t.cards: + score = 31000 b2 = self._getMoveCardBonus(r, t, pile, rpile) assert 0 <= b2 <= 999 return score + b2, self.bonus_color - # Score for dropping ncards from stack r to stack t. def _getDropCardScore(self, score, color, r, t, ncards): assert t is not r if ncards > 1: - # drop immediately (Spider) - return 93000, color + # drop immediately (Spider) + return 93000, color pile = r.cards c = pile[-1] # compute distance to t.cap.base_rank - compare Stack.getRankDir() @@ -415,24 +416,24 @@ class DefaultHint(AbstractHint): if d > t.cap.mod / 2: d = d - t.cap.mod if abs(d) <= 1: - # drop Ace and 2 immediately - score = 92000 + # drop Ace and 2 immediately + score = 92000 elif r in self.game.sg.talonstacks: - score = 25000 # less than _getMoveWasteScore() + score = 25000 # less than _getMoveWasteScore() elif len(pile) == 1: - ###score = 50000 - score = 91000 - elif self._canDropAllCards(r, self.game.s.foundations, stackcards=pile[:-1]): - score = 90000 - color = self.RED + # score = 50000 + score = 91000 + elif self._canDropAllCards( + r, self.game.s.foundations, stackcards=pile[:-1]): + score = 90000 + color = self.RED else: - # don't drop this card too eagerly - we may need it - # for pile moving - score = 50000 - score = score + (self.K - c.rank) + # don't drop this card too eagerly - we may need it + # for pile moving + score = 50000 + score += (self.K - c.rank) return score, color - # # compute hints - main hint intelligence # @@ -462,7 +463,6 @@ class DefaultHint(AbstractHint): # Don't be too clever and give up ;-) - # # implementation of the hint steps # @@ -476,7 +476,8 @@ class DefaultHint(AbstractHint): t, ncards = r.canDropCards(self.game.s.foundations) if t: score, color = 0, None - score, color = self._getDropCardScore(score, color, r, t, ncards) + score, color = self._getDropCardScore( + score, color, r, t, ncards) self.addHint(score, ncards, r, t, color) if score >= 90000 and self.level >= 1: break @@ -493,7 +494,7 @@ class DefaultHint(AbstractHint): lp = len(pile) lr = len(r.cards) assert 1 <= lp <= lr - rpile = r.cards[ : (lr-lp) ] # remaining pile + rpile = r.cards[: (lr-lp)] # remaining pile empty_row_seen = 0 r_is_waste = r in self.game.sg.talonstacks @@ -504,7 +505,8 @@ class DefaultHint(AbstractHint): continue if r_is_waste: # moving a card from the WasteStack - score, color = self._getMoveWasteScore(score, color, r, t, pile, rpile) + score, color = self._getMoveWasteScore( + score, color, r, t, pile, rpile) else: if not t.cards: # the target stack is empty @@ -520,10 +522,10 @@ class DefaultHint(AbstractHint): else: # the target stack is not empty score = 80000 - score, color = self._getMovePileScore(score, color, r, t, pile, rpile) + score, color = self._getMovePileScore( + score, color, r, t, pile, rpile) self.addHint(score, lp, r, t, color) - # 2) try if we can move part of a pile within the RowStacks # so that we can drop a card afterwards # score: 40000 .. 59999 @@ -548,21 +550,22 @@ class DefaultHint(AbstractHint): # now try to make a move so that the drop-card will get free for di in drop_info: c = di[0] - sub_pile = pile[di[3]+1 : ] - ##print "trying drop move", c, pile, sub_pile - ##assert r.canMoveCards(sub_pile) + sub_pile = pile[di[3]+1:] + # print "trying drop move", c, pile, sub_pile + # assert r.canMoveCards(sub_pile) if not r.canMoveCards(sub_pile): continue for t in rows: if t is r or not t.acceptsCards(r, sub_pile): continue - ##print "drop move", r, t, sub_pile + # print "drop move", r, t, sub_pile score = 40000 score = score + 1000 + (self.K - r.getCard().rank) # force the drop (to avoid loops) force = (999999, 0, di[2], r, di[1], self.BLUE, None) - self.addHint(score, len(sub_pile), r, t, self.RED, forced_move=force) - + self.addHint( + score, len(sub_pile), r, t, + self.RED, forced_move=force) # 3) try if we should move a card from a Foundation to a RowStack # score: 20000 .. 29999 @@ -587,7 +590,7 @@ class DefaultHint(AbstractHint): if not tt.acceptsCards(r, pile): continue # compute remaining pile in r - rpile = r.cards[ : (len(r.cards)-len(pile)) ] + rpile = r.cards[:(len(r.cards)-len(pile))] rr = self.ClonedStack(r, stackcards=rpile) if rr.acceptsCards(t, pile): # the pile we are going to move from r to t @@ -595,12 +598,11 @@ class DefaultHint(AbstractHint): # dangerous as we can create loops... continue score = 20000 + card.rank - ##print score, s, t, r, pile, rpile + # print score, s, t, r, pile, rpile # force the move from r to t (to avoid loops) force = (999999, 0, len(pile), r, t, self.BLUE, None) self.addHint(score, 1, s, t, self.BLUE, forced_move=force) - # 4) try if we can move a card from a RowStack to a ReserveStack # score: 10000 .. 19999 @@ -613,7 +615,7 @@ class DefaultHint(AbstractHint): continue pile = [card] # compute remaining pile in r - rpile = r.cards[ : (len(r.cards)-len(pile)) ] + rpile = r.cards[:(len(r.cards)-len(pile))] rr = self.ClonedStack(r, stackcards=rpile) for t in reservestacks: if t is r or not t.acceptsCards(r, pile): @@ -624,17 +626,17 @@ class DefaultHint(AbstractHint): # dangerous as we can create loops... continue score = 10000 - score, color = self._getMovePileScore(score, None, r, t, pile, rpile) + score, color = self._getMovePileScore( + score, None, r, t, pile, rpile) self.addHint(score, len(pile), r, t, color) break - # 5) try if we should move a card from a ReserveStack to a RowStack def step050(self, reservestacks, rows): if not reservestacks: return - ### FIXME + # FIXME # ************************************************************************ @@ -643,7 +645,7 @@ class DefaultHint(AbstractHint): class CautiousDefaultHint(DefaultHint): shallMovePile = DefaultHint._cautiousShallMovePile - ##shallMovePile = DefaultHint._cautiousDemoShallMovePile + # shallMovePile = DefaultHint._cautiousDemoShallMovePile def _preferHighRankMoves(self): return 1 @@ -657,6 +659,7 @@ class CautiousDefaultHint(DefaultHint): class KlondikeType_Hint(DefaultHint): pass + # this works for Yukon, but not too well for Russian Solitaire class YukonType_Hint(CautiousDefaultHint): def step010b_getPiles(self, stack): @@ -668,14 +671,16 @@ class YukonType_Hint(CautiousDefaultHint): p = p[1:] # note: we need a fresh shallow copy return piles + class Yukon_Hint(YukonType_Hint): BONUS_FLIP_CARD = 9000 BONUS_CREATE_EMPTY_ROW = 100 - ## FIXME: this is only a rough approximation and doesn't seem to help - ## for Russian Solitaire + # FIXME: this is only a rough approximation and doesn't seem to help + # for Russian Solitaire def _getMovePileScore(self, score, color, r, t, pile, rpile): - s, color = YukonType_Hint._getMovePileScore(self, score, color, r, t, pile, rpile) + s, color = YukonType_Hint._getMovePileScore( + self, score, color, r, t, pile, rpile) bonus = s - score assert 0 <= bonus <= 9999 # We must take care when moving piles that we won't block cards, @@ -697,14 +702,15 @@ class Yukon_Hint(YukonType_Hint): class FreeCellType_Hint(CautiousDefaultHint): pass + class GolfType_Hint(DefaultHint): pass + class SpiderType_Hint(DefaultHint): pass - # ************************************************************************ # * FreeCell-Solver # ************************************************************************ @@ -727,17 +733,17 @@ class Base_Solver_Hint: self.base_rank = game_type['base_rank'] else: self.base_rank = game.s.foundations[0].cap.base_rank - ##print 'game_type:', game_type - ##print 'base_rank:', self.base_rank + # print 'game_type:', game_type + # print 'base_rank:', self.base_rank def config(self, **kw): self.options.update(kw) - def card2str1(self, card): # row and reserves rank = (card.rank-self.base_rank) % 13 return "A23456789TJQK"[rank] + "CSHD"[card.suit] + def card2str2(self, card): # foundations rank = (card.rank-self.base_rank) % 13 @@ -749,7 +755,7 @@ class Base_Solver_Hint: if taken_hint and taken_hint[6]: return [taken_hint[6]] h = self.hints[self.hints_index] - #print 'getHints', taken_hint, h + # print 'getHints', taken_hint, h if h is None: return None ncards, src, dest = h @@ -757,7 +763,7 @@ class Base_Solver_Hint: if len(src.cards) > ncards and not src.cards[-ncards-1].face_up: # flip card thint = (999999, 0, 1, src, src, None, None) - if dest == None: # foundation + if dest is None: # foundation cards = src.cards[-ncards:] for f in self.game.s.foundations: if f.acceptsCards(src, cards): @@ -766,7 +772,7 @@ class Base_Solver_Hint: assert dest hint = (999999, 0, ncards, src, dest, None, thint) self.hints_index += 1 - #print hint + # print hint return [hint] def colonPrefixMatch(self, prefix, s): @@ -778,6 +784,7 @@ class Base_Solver_Hint: self._v = None return False + class FreeCellSolver_Hint(Base_Solver_Hint): def _determineIfSolverState(self, line): if re.search('^(?:Iterations count exceeded)', line): @@ -791,7 +798,8 @@ class FreeCellSolver_Hint(Base_Solver_Hint): def _isSimpleSimon(self): game_type = self.game_type - return ('preset' in game_type and game_type['preset'] == 'simple_simon') + return ('preset' in game_type and + game_type['preset'] == 'simple_simon') def _addBoardLine(self, l): self.board += l + '\n' @@ -811,7 +819,8 @@ class FreeCellSolver_Hint(Base_Solver_Hint): b = '' for s in game.s.foundations: if s.cards: - b += ' ' + self.card2str2(s.cards[0 if is_simple_simon else -1]) + b += ' ' + self.card2str2( + s.cards[0 if is_simple_simon else -1]) self._addPrefixLine('Founds:', b) b = '' @@ -830,7 +839,6 @@ class FreeCellSolver_Hint(Base_Solver_Hint): return self.board - def computeHints(self): game = self.game game_type = self.game_type @@ -839,10 +847,10 @@ class FreeCellSolver_Hint(Base_Solver_Hint): board = self.calcBoardString() # if DEBUG: - print '--------------------\n', board, '--------------------' + print('--------------------\n', board, '--------------------') # args = [] - ##args += ['-sam', '-p', '-opt', '--display-10-as-t'] + # args += ['-sam', '-p', '-opt', '--display-10-as-t'] args += ['-m', '-p', '-opt', '-sel'] if progress: args += ['--iter-output'] @@ -867,7 +875,7 @@ class FreeCellSolver_Hint(Base_Solver_Hint): command = FCS_COMMAND+' '+' '.join([str(i) for i in args]) if DEBUG: - print command + print(command) kw = {'shell': True, 'stdin': subprocess.PIPE, 'stdout': subprocess.PIPE, @@ -880,9 +888,9 @@ class FreeCellSolver_Hint(Base_Solver_Hint): pin.close() # stack_types = { - 'the' : game.s.foundations, - 'stack' : game.s.rows, - 'freecell' : game.s.reserves, + 'the': game.s.foundations, + 'stack': game.s.rows, + 'freecell': game.s.reserves, } if DEBUG: start_time = time.time() @@ -894,7 +902,7 @@ class FreeCellSolver_Hint(Base_Solver_Hint): for s in pout: if DEBUG >= 5: - print s, + print(s) if self.colonPrefixMatch('Iteration', s): iter = self._v @@ -914,7 +922,7 @@ class FreeCellSolver_Hint(Base_Solver_Hint): hints = [] for s in pout: if DEBUG: - print s, + print(s) if self._determineIfSolverState(s): next m = re.match('Total number of states checked is (\d+)\.', s) @@ -934,7 +942,9 @@ class FreeCellSolver_Hint(Base_Solver_Hint): move_s = m.group(1) - m = re.match('the sequence on top of Stack (\d+) to the foundations', move_s); + m = re.match( + 'the sequence on top of Stack (\d+) to the foundations', + move_s) if m: ncards = 13 @@ -943,7 +953,12 @@ class FreeCellSolver_Hint(Base_Solver_Hint): src = st[sn] dest = None else: - m = re.match('(?Pa card|(?P\d+) cards) from (?Pstack|freecell) (?P\d+) to (?Pthe foundations|(?Pfreecell|stack) (?P\d+))\s*', move_s); + m = re.match( + '(?Pa card|(?P\d+) cards) ' + 'from (?Pstack|freecell)' + '(?P\d+) to ' + '(?Pthe foundations|(?Pfreecell|stack)' + ' (?P\d+))\s*', move_s) if not m: continue @@ -969,25 +984,26 @@ class FreeCellSolver_Hint(Base_Solver_Hint): dest = dt[dn] hints.append([ncards, src, dest]) - ##print src, dest, ncards + # print src, dest, ncards # if DEBUG: - print 'time:', time.time()-start_time - ##print perr.read(), + print('time:', time.time()-start_time) + # print perr.read(), self.hints = hints if len(hints) > 0: self.solver_state = 'solved' self.hints.append(None) # XXX - ##print self.hints + # print self.hints pout.close() perr.close() if os.name == 'posix': os.wait() + class BlackHoleSolver_Hint(Base_Solver_Hint): BLACK_HOLE_SOLVER_COMMAND = 'black-hole-solve' @@ -1008,27 +1024,27 @@ class BlackHoleSolver_Hint(Base_Solver_Hint): b += cs + ' ' board += b.strip() + '\n' - return board; + return board def computeHints(self): game = self.game game_type = self.game_type - progress = self.options['progress'] board = self.calcBoardString() # if DEBUG: - print '--------------------\n', board, '--------------------' + print('--------------------\n', board, '--------------------') # args = [] - ##args += ['-sam', '-p', '-opt', '--display-10-as-t'] - args += ['--game', game_type['preset'], '--rank-reach-prune',] - args += ['--max-iters', self.options['max_iters'],] + # args += ['-sam', '-p', '-opt', '--display-10-as-t'] + args += ['--game', game_type['preset'], '--rank-reach-prune'] + args += ['--max-iters', self.options['max_iters']] # - command = self.BLACK_HOLE_SOLVER_COMMAND+' '+' '.join([str(i) for i in args]) + command = self.BLACK_HOLE_SOLVER_COMMAND + ' ' + \ + ' '.join([str(i) for i in args]) if DEBUG: - print command + print(command) kw = {'shell': True, 'stdin': subprocess.PIPE, 'stdout': subprocess.PIPE, @@ -1051,7 +1067,7 @@ class BlackHoleSolver_Hint(Base_Solver_Hint): for s in pout: if DEBUG >= 5: - print s, + print(s) m = re.search('^(Intractable!|Unsolved!|Solved!)\n', s) if m: @@ -1071,7 +1087,7 @@ class BlackHoleSolver_Hint(Base_Solver_Hint): hints = [] for s in pout: if DEBUG: - print s, + print(s) m = re.match('Total number of states checked is (\d+)\.', s) if m: iter = int(m.group(1)) @@ -1085,7 +1101,8 @@ class BlackHoleSolver_Hint(Base_Solver_Hint): self.dialog.setText(states=states) continue - m = re.match('Move a card from stack ([0-9]+) to the foundations', s) + m = re.match( + 'Move a card from stack ([0-9]+) to the foundations', s) if not m: continue @@ -1097,23 +1114,24 @@ class BlackHoleSolver_Hint(Base_Solver_Hint): dest = None hints.append([ncards, src, dest]) - ##print src, dest, ncards + # print src, dest, ncards # if DEBUG: - print 'time:', time.time()-start_time - ##print perr.read(), + print('time:', time.time()-start_time) + # print perr.read(), self.hints = hints self.hints.append(None) # XXX - ##print self.hints + # print self.hints pout.close() perr.close() if os.name == 'posix': os.wait() + class FreeCellSolverWrapper: def __init__(self, **game_type): @@ -1123,6 +1141,7 @@ class FreeCellSolverWrapper: hint = FreeCellSolver_Hint(game, dialog, **self.game_type) return hint + class BlackHoleSolverWrapper: def __init__(self, **game_type): @@ -1131,4 +1150,3 @@ class BlackHoleSolverWrapper: def __call__(self, game, dialog): hint = BlackHoleSolver_Hint(game, dialog, **self.game_type) return hint - diff --git a/tests/style/py-flake8.t b/tests/style/py-flake8.t index 16ce3152..fe750956 100644 --- a/tests/style/py-flake8.t +++ b/tests/style/py-flake8.t @@ -9,7 +9,7 @@ use Test::Differences qw( eq_or_diff ); use String::ShellQuote qw/ shell_quote /; # my $cmd = shell_quote( 'flake8', '.' ); -my $cmd = shell_quote( 'flake8', glob('./pysollib/[a-g]*.py') ); +my $cmd = shell_quote( 'flake8', glob('./pysollib/[a-h]*.py') ); # TEST eq_or_diff( scalar(`$cmd`), '', "flake8 is happy with the code." );