From 2505afdb6882521d627be6d7a4a96d1eea6f512d Mon Sep 17 00:00:00 2001 From: Shlomi Fish Date: Tue, 18 Apr 2017 14:37:17 +0300 Subject: [PATCH] flake8 - mahjongg --- pysollib/games/mahjongg/mahjongg.py | 189 ++++++++++++++------------- pysollib/games/mahjongg/mahjongg3.py | 8 +- pysollib/games/mahjongg/shisensho.py | 106 ++++++++------- tests/style/py-flake8.t | 6 +- 4 files changed, 165 insertions(+), 144 deletions(-) diff --git a/pysollib/games/mahjongg/mahjongg.py b/pysollib/games/mahjongg/mahjongg.py index 9b7b733f..c50e3973 100644 --- a/pysollib/games/mahjongg/mahjongg.py +++ b/pysollib/games/mahjongg/mahjongg.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,30 +19,40 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . # -# ---------------------------------------------------------------------------## +# --------------------------------------------------------------------------- __all__ = [] # Imports -import sys, re +import sys +import re import time -#from tkFont import Font +# from tkFont import Font from gettext import ungettext # 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, Struct, Image -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 AbstractHint from pysollib.settings import TOOLKIT, DEBUG from pysollib.pysoltk import MfxCanvasText, MfxCanvasImage from pysollib.pysoltk import bind, EVENT_HANDLED, ANCHOR_NW from pysollib.pysoltk import MfxMessageDialog +from pysollib.util import ANY_SUIT, NO_RANK + +from pysollib.stack import \ + InitialDealTalonStack, \ + OpenStack + +from new import classobj + +if sys.version_info > (3,): + xrange = range + def factorial(x): if x <= 1: @@ -72,14 +82,14 @@ class Mahjongg_Hint(AbstractHint): for t in stacks[i+1:]: if game.cardsMatch(r.cards[0], t.cards[0]): # simple scoring... - ##score = 10000 + r.id + t.id + # score = 10000 + r.id + t.id rb = r.blockmap tb = t.blockmap score = \ - 10000 + \ - 1000 * (len(rb.below) + len(tb.below)) + \ - len(rb.all_left) + len(rb.all_right) + \ - len(tb.all_left) + len(tb.all_right) + 10000 + \ + 1000 * (len(rb.below) + len(tb.below)) + \ + len(rb.all_left) + len(rb.all_right) + \ + len(tb.all_left) + len(tb.all_right) self.addHint(score, 1, r, t) i += 1 @@ -88,7 +98,7 @@ class Mahjongg_Hint(AbstractHint): # * # ************************************************************************ -#class Mahjongg_Foundation(AbstractFoundationStack): +# class Mahjongg_Foundation(AbstractFoundationStack): class Mahjongg_Foundation(OpenStack): def __init__(self, x, y, game, suit=ANY_SUIT, **cap): @@ -103,11 +113,11 @@ class Mahjongg_Foundation(OpenStack): def basicIsBlocked(self): return 1 - #def initBindings(self): + # def initBindings(self): # pass def _position(self, card): - #AbstractFoundationStack._position(self, card) + # AbstractFoundationStack._position(self, card) OpenStack._position(self, card) fnds = self.game.s.foundations @@ -166,8 +176,9 @@ class Mahjongg_RowStack(OpenStack): self._dropPairMove(ncards, to_stack, frames=-1, shadow=shadow) def _dropPairMove(self, n, other_stack, frames=-1, shadow=-1): - ##print 'drop:', self.id, other_stack.id - assert n == 1 and self.acceptsCards(other_stack, [other_stack.cards[-1]]) + # print 'drop:', self.id, other_stack.id + assert n == 1 and self.acceptsCards( + other_stack, [other_stack.cards[-1]]) if not self.game.demo: self.game.playSample("droppair", priority=200) old_state = self.game.enterState(self.game.S_FILL) @@ -213,24 +224,23 @@ class Mahjongg_RowStack(OpenStack): for s in self.game.s.rows[self.id+1:]: s.group.tkraise() - # In Mahjongg games type there are a lot of stacks, so we optimize # and don't create bindings that are not used anyway. def initBindings(self): group = self.group # FIXME: dirty hack to access the Stack's private methods - #bind(group, "<1>", self._Stack__clickEventHandler) - #bind(group, "<3>", self._Stack__controlclickEventHandler) - #bind(group, "", self._Stack__controlclickEventHandler) + # bind(group, "<1>", self._Stack__clickEventHandler) + # bind(group, "<3>", self._Stack__controlclickEventHandler) + # bind(group, "", self._Stack__controlclickEventHandler) # bind(group, "<1>", self.__clickEventHandler) bind(group, "<3>", self.__controlclickEventHandler) bind(group, "", self.__controlclickEventHandler) - ##bind(group, "", self._Stack__enterEventHandler) - ##bind(group, "", self._Stack__leaveEventHandler) + # bind(group, "", self._Stack__enterEventHandler) + # bind(group, "", self._Stack__leaveEventHandler) def __defaultClickEventHandler(self, event, handler): - self.game.event_handled = True # for Game.undoHandler + self.game.event_handled = True # for Game.undoHandler if self.game.demo: self.game.stopDemo(event) if self.game.busy: @@ -239,7 +249,7 @@ class Mahjongg_RowStack(OpenStack): return EVENT_HANDLED def __clickEventHandler(self, event): - ##print 'click:', self.id + # print 'click:', self.id return self.__defaultClickEventHandler(event, self.clickHandler) def __controlclickEventHandler(self, event): @@ -259,8 +269,8 @@ class Mahjongg_RowStack(OpenStack): self._stopDrag() return 1 if self.basicIsBlocked(): - ### remove selection - ##self.game.playSample("nomove") + # remove selection + # self.game.playSample("nomove") return 1 # possible move if from_stack: @@ -273,11 +283,12 @@ class Mahjongg_RowStack(OpenStack): self.game.playSample("startdrag") # create the shade image (see stack.py, _updateShade) if drag.shade_img: - #drag.shade_img.dtag(drag.shade_stack.group) + # drag.shade_img.dtag(drag.shade_stack.group) drag.shade_img.delete() - #game.canvas.delete(drag.shade_img) + # game.canvas.delete(drag.shade_img) drag.shade_img = None - img = game.app.images.getHighlightedCard(card.deck, card.suit, card.rank) + img = game.app.images.getHighlightedCard( + card.deck, card.suit, card.rank) if img is None: return 1 img = MfxCanvasImage(game.canvas, self.x, self.y, image=img, @@ -335,11 +346,10 @@ class AbstractMahjonggGame(Game): for tl in range(level, level + height): tiles.append((tl, tx, ty)) assert len(tiles) == self.NCARDS - #tiles.sort() - #tiles = tuple(tiles) + # tiles.sort() + # tiles = tuple(tiles) return tiles, max_tl, max_tx, max_ty - # # game layout # @@ -351,8 +361,8 @@ class AbstractMahjonggGame(Game): l, s = Layout(self), self.s show_removed = self.app.opt.mahjongg_show_removed - ##dx, dy = 2, -2 - ##dx, dy = 3, -3 + # dx, dy = 2, -2 + # dx, dy = 3, -3 cs = self.app.cardset if cs.version >= 6: dx = l.XOFFSET @@ -369,12 +379,12 @@ class AbstractMahjonggGame(Game): d_x = 0 d_y = 0 self._delta_x, self._delta_y = 0, 0 - #print dx, dy, d_x, d_y, cs.version + # print dx, dy, d_x, d_y, cs.version font = self.app.getFont("canvas_default") # width of self.texts.info - #ti_width = Font(self.canvas, font).measure(_('Remaining')) + # ti_width = Font(self.canvas, font).measure(_('Remaining')) ti_width = 80 # set window size @@ -403,21 +413,18 @@ class AbstractMahjonggGame(Game): self.check_dist = l.CW*l.CW + l.CH*l.CH # see _getClosestStack() # sort tiles (for 3D) - tiles.sort(lambda a, b: - cmp(a[0], b[0]) or - cmp(-a[1]+a[2], -b[1]+b[2]) - ) + tiles.sort(key=lambda x: (x[0], x[2]-x[1])) # create a row stack for each tile and compute the tilemap tilemap = {} x0 = left_margin y0 = l.YM + dyy for level, tx, ty in tiles: - #print level, tx, ty + # print level, tx, ty x = x0 + (tx * cardw) / 2 + level * dx y = y0 + (ty * cardh) / 2 + level * dy stack = self.RowStack_Class(x, y, self) - ##stack.G = (level, tx, ty) + # stack.G = (level, tx, ty) stack.CARD_XOFFSET = dx stack.CARD_YOFFSET = dy s.rows.append(stack) @@ -430,7 +437,7 @@ class AbstractMahjonggGame(Game): # compute blockmap for stack in s.rows: level, tx, ty = tiles[stack.id] - above, below, left, right, up, bottom = {}, {}, {}, {}, {}, {} + above, below, left, right = {}, {}, {}, {} # above blockers for tl in range(level+1, level+2): above[tilemap.get((tl, tx, ty))] = 1 @@ -450,11 +457,11 @@ class AbstractMahjonggGame(Game): right[tilemap.get((level, tx+2, ty))] = 1 right[tilemap.get((level, tx+2, ty+1))] = 1 # up blockers - ##up[tilemap.get((level, tx, ty-1))] = 1 - ##up[tilemap.get((level, tx+1, ty-1))] = 1 + # up[tilemap.get((level, tx, ty-1))] = 1 + # up[tilemap.get((level, tx+1, ty-1))] = 1 # bottom blockers - ##bottom[tilemap.get((level, tx, ty+2))] = 1 - ##bottom[tilemap.get((level, tx+1, ty+2))] = 1 + # bottom[tilemap.get((level, tx, ty+2))] = 1 + # bottom[tilemap.get((level, tx+1, ty+2))] = 1 # sanity check - assert that there are no overlapping tiles assert tilemap.get((level, tx, ty)) is stack assert tilemap.get((level, tx+1, ty)) is stack @@ -465,19 +472,19 @@ class AbstractMahjonggGame(Game): below = tuple(filter(None, below.keys())) left = tuple(filter(None, left.keys())) right = tuple(filter(None, right.keys())) - ##up = tuple(filter(None, up.keys())) - ##bottom = tuple(filter(None, bottom.keys())) + # up = tuple(filter(None, up.keys())) + # bottom = tuple(filter(None, bottom.keys())) # assemble stack.blockmap = Struct( - above = above, - below = below, - left = left, - right = right, - ##up = up, - ##bottom = bottom, - all_left = None, - all_right = None, + above=above, + below=below, + left=left, + right=right, + # up=up, + # bottom=bottom, + all_left=None, + all_right=None, ) def get_all_left(s): @@ -488,6 +495,7 @@ class AbstractMahjonggGame(Game): get_all_left(t) s.blockmap.all_left.update(t.blockmap.all_left) s.blockmap.all_left[t] = 1 + def get_all_right(s): if s.blockmap.all_right is None: s.blockmap.all_right = {} @@ -504,7 +512,6 @@ class AbstractMahjonggGame(Game): r.blockmap.all_left = tuple(r.blockmap.all_left.keys()) r.blockmap.all_right = tuple(r.blockmap.all_right.keys()) - # create other stacks for i in range(4): for j in range(9): @@ -517,7 +524,7 @@ class AbstractMahjonggGame(Game): y = l.YM+dyy elif TOOLKIT == 'gtk': # FIXME - x = self.width -l.XS + x = self.width - l.XS y = self.height - l.YS stack = Mahjongg_Foundation(x, y, self) if show_removed: @@ -536,7 +543,6 @@ class AbstractMahjonggGame(Game): # Define stack groups l.defaultStackGroups() - # # game overrides # @@ -554,7 +560,6 @@ class AbstractMahjonggGame(Game): return cards return new_cards - def _shuffleHook1(self, cards): # old version; it generate a very easy layouts old_cards = cards[:] @@ -625,10 +630,9 @@ class AbstractMahjonggGame(Game): if new_cards: new_cards.reverse() return new_cards - print 'oops! can\'t create a solvable game' + print('oops! can\'t create a solvable game') return old_cards - def _shuffleHook2(self, rows, cards): start_time = time.time() @@ -690,15 +694,16 @@ class AbstractMahjonggGame(Game): break # find suitable stacks -## suitable_stacks = [] -## for r in rows: -## if nc[r.id] is None and is_suitable(r, nc): -## suitable_stacks.append(r) + # suitable_stacks = [] + # for r in rows: + # if nc[r.id] is None and is_suitable(r, nc): + # suitable_stacks.append(r) suitable_stacks = [r for r in rows if nc[r.id] is None and is_suitable(r, nc)] old_pairs = [] - i = factorial(len(suitable_stacks))/2/factorial(len(suitable_stacks)-2) + i = factorial(len(suitable_stacks))/2 \ + / factorial(len(suitable_stacks)-2) for j in xrange(i): if iters[0] > max_iters: return None @@ -728,11 +733,11 @@ class AbstractMahjonggGame(Game): if ret: ret = [x for x in ret if x != 1] return ret - nc[s1.id] = nc[s2.id] = None # try another way + nc[s1.id] = nc[s2.id] = None # try another way return None - new_cards = [None]*len(self.s.rows) # None - empty stack, 1 - non-used + new_cards = [None]*len(self.s.rows) # None - empty stack, 1 - non-used drows = dict.fromkeys(rows) # optimization for r in self.s.rows: if r not in drows: @@ -742,16 +747,16 @@ class AbstractMahjonggGame(Game): while True: ret = create_solvable(cards[:], new_cards) if DEBUG: - print 'create_solvable time:', time.time() - start_time + print('create_solvable time:', time.time() - start_time) if ret: ret.reverse() return ret if time.time() - start_time > max_time or \ - iters[0] <= max_iters: - print 'oops! can\'t create a solvable game' + iters[0] <= max_iters: + print('oops! can\'t create a solvable game') return None iters = [0] - print 'oops! can\'t create a solvable game' + print('oops! can\'t create a solvable game') return None def _mahjonggShuffle(self): @@ -785,13 +790,13 @@ class AbstractMahjonggGame(Game): new_cards = self._shuffleHook2(rows, cards) if new_cards is None: - d = MfxMessageDialog(self.top, title=_('Warning'), - text=_('''\ + MfxMessageDialog(self.top, title=_('Warning'), + text=_('''\ Sorry, I can\'t find a solvable configuration.'''), - bitmap='warning') + bitmap='warning') self.leaveState(old_state) - ##self.finishMove() + # self.finishMove() # hack am = self.moves.current[0] am.undo(self) # restore random @@ -817,7 +822,7 @@ a solvable configuration.'''), def startGame(self): assert len(self.s.talon.cards) == self.NCARDS - #self.s.talon.dealRow(rows = self.s.rows, frames = 0) + # self.s.talon.dealRow(rows = self.s.rows, frames = 0) n = 12 self.s.talon.dealRow(rows=self.s.rows[:self.NCARDS-n], frames=0) self.startDealSample() @@ -850,8 +855,8 @@ a solvable configuration.'''), for t in stacks[i+1:]: if self.cardsMatch(r.cards[0], t.cards[0]): n += 1 - #if n == 3: n = 1 - #elif n == 2: n = 0 + # if n == 3: n = 1 + # elif n == 2: n = 0 n = n % 2 f += n i += 1 @@ -881,7 +886,7 @@ a solvable configuration.'''), # Mahjongg special: highlight all moveable tiles return ((self.s.rows, 1),) - def _highlightCards(self, info, sleep=1.5, delta=(1,1,1,1)): + def _highlightCards(self, info, sleep=1.5, delta=(1, 1, 1, 1)): if not Image: delta = (-self._delta_x, 0, 0, -self._delta_y) return Game._highlightCards(self, info, sleep=sleep, delta=delta) @@ -895,9 +900,9 @@ a solvable configuration.'''), for s, c1, c2, color in info: assert c1 is c2 assert c1 in s.cards - tkraise = False x, y = s.x, s.y - img = self.app.images.getHighlightedCard(c1.deck, c1.suit, c1.rank, 'black') + img = self.app.images.getHighlightedCard( + c1.deck, c1.suit, c1.rank, 'black') if img is None: continue img = MfxCanvasImage(self.canvas, x, y, image=img, @@ -944,8 +949,8 @@ a solvable configuration.'''), return self.getCardFaceImage(deck, suit, rank) def _createCard(self, id, deck, suit, rank, x, y): - ##if deck >= 1 and suit == 3 and rank >= 4: - if deck%4 and suit == 3 and rank >= 4: + # if deck >= 1 and suit == 3 and rank >= 4: + if deck % 4 and suit == 3 and rank >= 4: return None return Game._createCard(self, id, deck, suit, rank, x, y) @@ -977,11 +982,11 @@ a solvable configuration.'''), return card1.rank == card2.rank -## mahjongg util +# mahjongg util def comp_cardset(ncards): # calc decks, ranks & trumps assert ncards % 4 == 0 - assert 0 < ncards <= 288 # ??? + assert 0 < ncards <= 288 # ??? decks = 1 cards = ncards/4 if ncards > 144: @@ -1001,7 +1006,6 @@ def comp_cardset(ncards): # * register a Mahjongg type game # ************************************************************************ -from new import classobj def r(id, short_name, name=None, ncards=144, layout=None): assert layout @@ -1014,7 +1018,7 @@ def r(id, short_name, name=None, ncards=144, layout=None): gameclass.NCARDS = ncards decks, ranks, trumps = comp_cardset(ncards) gi = GameInfo(id, gameclass, name, - GI.GT_MAHJONGG, 4*decks, 0, ##GI.SL_MOSTLY_SKILL, + GI.GT_MAHJONGG, 4*decks, 0, # GI.SL_MOSTLY_SKILL, category=GI.GC_MAHJONGG, short_name=short_name, suits=range(3), ranks=range(ranks), trumps=range(trumps), si={"decks": decks, "ncards": ncards}) @@ -1022,4 +1026,3 @@ def r(id, short_name, name=None, ncards=144, layout=None): gi.rules_filename = "mahjongg.html" registerGame(gi) return gi - diff --git a/pysollib/games/mahjongg/mahjongg3.py b/pysollib/games/mahjongg/mahjongg3.py index 5ad81933..6155e1ea 100644 --- a/pysollib/games/mahjongg/mahjongg3.py +++ b/pysollib/games/mahjongg/mahjongg3.py @@ -24,10 +24,10 @@ from mahjongg import r # test -#r(5991, "AAA 1", ncards=4, layout="0daa") -#r(5992, "AAA 2", ncards=8, layout="0daadca") -#r(5993, "AAA 3", ncards=20, layout="0daaCabdacKbbdcaCcbdcc") -#r(5994, "AAA 4", ncards=20, layout="0daaDabdacdcaDcbdcc") +# r(5991, "AAA 1", ncards=4, layout="0daa") +# r(5992, "AAA 2", ncards=8, layout="0daadca") +# r(5993, "AAA 3", ncards=20, layout="0daaCabdacKbbdcaCcbdcc") +# r(5994, "AAA 4", ncards=20, layout="0daaDabdacdcaDcbdcc") # ************************************************************************ # * game definitions diff --git a/pysollib/games/mahjongg/shisensho.py b/pysollib/games/mahjongg/shisensho.py index 2f2d38f4..da2fa61a 100644 --- a/pysollib/games/mahjongg/shisensho.py +++ b/pysollib/games/mahjongg/shisensho.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,36 +19,43 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . # -# ---------------------------------------------------------------------------## +# --------------------------------------------------------------------------- __all__ = [] # Imports import sys -#from tkFont import Font +# from tkFont import Font from gettext import ungettext # 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 AbstractHint from pysollib.pysoltk import MfxCanvasText, MfxCanvasLine from mahjongg import Mahjongg_RowStack, AbstractMahjonggGame, comp_cardset +from pysollib.util import ANY_SUIT + +from pysollib.stack import \ + AbstractFoundationStack, \ + InitialDealTalonStack + +if sys.version_info > (3,): + xrange = range # ************************************************************************ # * # ************************************************************************ + class Shisen_Hint(AbstractHint): TOP_MATCHING = False # FIXME: no intelligence whatsoever is implemented here + def computeHints(self): game = self.game # get free stacks @@ -60,7 +67,7 @@ class Shisen_Hint(AbstractHint): i = 0 for r in stacks: for t in stacks[i+1:]: - #if game.cardsMatch(r.cards[0], t.cards[0]): + # if game.cardsMatch(r.cards[0], t.cards[0]): if r.acceptsCards(t, t.cards): # simple scoring... if self.TOP_MATCHING: @@ -122,7 +129,7 @@ class Shisen_RowStack(Mahjongg_RowStack): if nx < 0 or ny < 0 or nx > cols+1 or ny > rows+1: return 0 if nx in (0, cols+1) or ny in (0, rows+1) \ - or not game_cols[nx-1][ny-1].cards: + or not game_cols[nx-1][ny-1].cards: if direct_chng_cnt == 0: return 1 elif direct_chng_cnt == 1: @@ -159,20 +166,21 @@ class Shisen_RowStack(Mahjongg_RowStack): return 0 res_path = [None] + def do_accepts(x, y, direct, direct_chng_cnt, path): - #if direct_chng_cnt > 3: + # if direct_chng_cnt > 3: # return if a[x][y] < direct_chng_cnt: return - #if res_path[0]: + # if res_path[0]: # return a[x][y] = direct_chng_cnt if x == x2 and y == y2: res_path[0] = path return - if can_move(x, y, x, y+1, direct, 1, direct_chng_cnt): #### 1 - #dcc = direct == 1 and direct_chng_cnt or direct_chng_cnt+1 + if can_move(x, y, x, y+1, direct, 1, direct_chng_cnt): # 1 + # dcc = direct == 1 and direct_chng_cnt or direct_chng_cnt+1 p = path[:] if direct == 1: dcc = direct_chng_cnt @@ -180,8 +188,8 @@ class Shisen_RowStack(Mahjongg_RowStack): dcc = direct_chng_cnt+1 p.append((x, y)) do_accepts(x, y+1, 1, dcc, p) - if can_move(x, y, x, y-1, direct, 2, direct_chng_cnt): #### 2 - #dcc = direct == 2 and direct_chng_cnt or direct_chng_cnt+1 + if can_move(x, y, x, y-1, direct, 2, direct_chng_cnt): # 2 + # dcc = direct == 2 and direct_chng_cnt or direct_chng_cnt+1 p = path[:] if direct == 2: dcc = direct_chng_cnt @@ -189,8 +197,8 @@ class Shisen_RowStack(Mahjongg_RowStack): dcc = direct_chng_cnt+1 p.append((x, y)) do_accepts(x, y-1, 2, dcc, p) - if can_move(x, y, x+1, y, direct, 3, direct_chng_cnt): #### 3 - #dcc = direct == 3 and direct_chng_cnt or direct_chng_cnt+1 + if can_move(x, y, x+1, y, direct, 3, direct_chng_cnt): # 3 + # dcc = direct == 3 and direct_chng_cnt or direct_chng_cnt+1 p = path[:] if direct == 3: dcc = direct_chng_cnt @@ -198,8 +206,8 @@ class Shisen_RowStack(Mahjongg_RowStack): dcc = direct_chng_cnt+1 p.append((x, y)) do_accepts(x+1, y, 3, dcc, p) - if can_move(x, y, x-1, y, direct, 4, direct_chng_cnt): #### 4 - #dcc = direct == 4 and direct_chng_cnt or direct_chng_cnt+1 + if can_move(x, y, x-1, y, direct, 4, direct_chng_cnt): # 4 + # dcc = direct == 4 and direct_chng_cnt or direct_chng_cnt+1 p = path[:] if direct == 4: dcc = direct_chng_cnt @@ -209,18 +217,17 @@ class Shisen_RowStack(Mahjongg_RowStack): do_accepts(x-1, y, 4, dcc, p) do_accepts(x1, y1, 0, 0, []) - #from pprint import pprint - #pprint(a) + # from pprint import pprint + # pprint(a) if a[x2][y2] > 3: return None res_path = res_path[0] res_path.append((x2, y2)) - #print res_path + # print res_path return res_path - def fillStack(self): self.game.fillStack(self) @@ -229,13 +236,14 @@ class Shisen_RowStack(Mahjongg_RowStack): if to_stack.cards: self._dropPairMove(ncards, to_stack, frames=-1, shadow=shadow) else: - Mahjongg_RowStack.moveMove(self, ncards, to_stack, frames=frames, shadow=shadow) + Mahjongg_RowStack.moveMove(self, ncards, to_stack, frames=frames, + shadow=shadow) def _dropPairMove(self, n, other_stack, frames=-1, shadow=-1): game = self.game old_state = game.enterState(game.S_FILL) f = game.s.foundations[0] - game.updateStackMove(game.s.talon, 2|16) # for undo + game.updateStackMove(game.s.talon, 2 | 16) # for undo if not game.demo: if game.app.opt.shisen_show_hint: self.drawArrow(other_stack, game.app.opt.timeouts['hint']) @@ -245,23 +253,22 @@ class Shisen_RowStack(Mahjongg_RowStack): game.moveMove(n, other_stack, f, frames=frames, shadow=shadow) self.fillStack() other_stack.fillStack() - game.updateStackMove(game.s.talon, 1|16) # for redo + game.updateStackMove(game.s.talon, 1 | 16) # for redo game.leaveState(old_state) - def drawArrow(self, other_stack, sleep): game = self.game images = game.app.images cs = game.app.cardset path = self.acceptsCards(other_stack, [other_stack.cards[-1]]) - #print path + # print path x0, y0 = game.XMARGIN, game.YMARGIN cardw, cardh = images.CARDW, images.CARDH if cs.version >= 6: cardw -= cs.SHADOW_XOFFSET cardh -= cs.SHADOW_YOFFSET coords = [] - dx, dy = game._delta_x, game._delta_y + dx = game._delta_x xf, yf = images._xfactor, images._yfactor for x, y in path: if x == 0: @@ -276,17 +283,17 @@ class Shisen_RowStack(Mahjongg_RowStack): coords.append(int(round(yf * (y0+cardh*(y-1)+6)))) else: coords.append(int(round(yf * (y0+cardh/2+cardh*(y-1))))) - #print coords - ##s1 = min(cardw/2, cardh/2, 30) - ##w = min(s1/3, 7) - ##s2 = min(w, 10) + # print coords + # s1 = min(cardw/2, cardh/2, 30) + # w = min(s1/3, 7) + # s2 = min(w, 10) w = 7 arrow = MfxCanvasLine(game.canvas, coords, {'width': w, 'fill': game.app.opt.colors['hintarrow'], - ##'arrow': 'last', - ##'arrowshape': (s1, s1, s2) + # 'arrow': 'last', + # 'arrowshape': (s1, s1, s2) } ) game.canvas.update_idletasks() @@ -297,10 +304,10 @@ class Shisen_RowStack(Mahjongg_RowStack): class AbstractShisenGame(AbstractMahjonggGame): - Hint_Class = NotShisen_Hint #Shisen_Hint + Hint_Class = NotShisen_Hint # Shisen_Hint RowStack_Class = Shisen_RowStack - #NCARDS = 144 + # NCARDS = 144 GRAVITY = True def createGame(self): @@ -309,7 +316,7 @@ class AbstractShisenGame(AbstractMahjonggGame): # start layout l, s = Layout(self), self.s - ##dx, dy = 3, -3 + # dx, dy = 3, -3 cs = self.app.cardset if cs.version >= 6: @@ -328,7 +335,7 @@ class AbstractShisenGame(AbstractMahjonggGame): font = self.app.getFont("canvas_default") # width of self.texts.info - #ti_width = Font(self.canvas, font).measure(_('Remaining')) + # ti_width = Font(self.canvas, font).measure(_('Remaining')) ti_width = 80 # set window size @@ -358,8 +365,8 @@ class AbstractShisenGame(AbstractMahjonggGame): stack.coln, stack.rown = col, row s.rows.append(stack) self.cols[col].append(stack) - #from pprint import pprint - #pprint(self.cols) + # from pprint import pprint + # pprint(self.cols) # create other stacks y = l.YM + dyy @@ -376,7 +383,8 @@ class AbstractShisenGame(AbstractMahjonggGame): l.defaultStackGroups() def fillStack(self, stack): - if not self.GRAVITY: return + if not self.GRAVITY: + return to_stack = stack for from_stack in self.cols[stack.coln][stack.rown+1::-1]: if not from_stack.cards: @@ -419,13 +427,11 @@ class AbstractShisenGame(AbstractMahjonggGame): self.NCARDS - t) % (self.NCARDS - t) t = r1 + r2 + f - self.texts.info.config(text = t) - + self.texts.info.config(text=t) def drawHintArrow(self, from_stack, to_stack, ncards, sleep): from_stack.drawArrow(to_stack, sleep) - def _shuffleHook(self, cards): return cards @@ -436,23 +442,28 @@ class AbstractShisenGame(AbstractMahjonggGame): class Shisen_18x8(AbstractShisenGame): L = (18, 8) + class Shisen_14x6(AbstractShisenGame): L = (14, 6) NCARDS = 84 + class Shisen_24x12(AbstractShisenGame): L = (24, 12) NCARDS = 288 + class Shisen_18x8_NoGravity(AbstractShisenGame): L = (18, 8) GRAVITY = False + class Shisen_14x6_NoGravity(AbstractShisenGame): L = (14, 6) NCARDS = 84 GRAVITY = False + class Shisen_24x12_NoGravity(AbstractShisenGame): L = (24, 12) NCARDS = 288 @@ -479,11 +490,13 @@ class NotShisen_14x6(AbstractShisenGame): L = (14, 6) NCARDS = 84 + class NotShisen_18x8(AbstractShisenGame): Hint_Class = NotShisen_Hint RowStack_Class = NotShisen_RowStack L = (18, 8) + class NotShisen_24x12(AbstractShisenGame): Hint_Class = NotShisen_Hint RowStack_Class = NotShisen_RowStack @@ -507,6 +520,7 @@ def r(id, gameclass, name, rules_filename="shisensho.html"): registerGame(gi) return gi + r(11001, Shisen_14x6, "Shisen-Sho 14x6") r(11002, Shisen_18x8, "Shisen-Sho 18x8") r(11003, Shisen_24x12, "Shisen-Sho 24x12") diff --git a/tests/style/py-flake8.t b/tests/style/py-flake8.t index 2a481cea..cc6bcb02 100644 --- a/tests/style/py-flake8.t +++ b/tests/style/py-flake8.t @@ -13,6 +13,10 @@ my %skip = map { $_ => 1 } qw( ./pysollib/games/__init__.py + ./pysollib/games/mahjongg/__init__.py + ./pysollib/games/mahjongg/mahjongg1.py + ./pysollib/games/mahjongg/mahjongg2.py + ./pysollib/games/mahjongg/mahjongg3.py ./pysollib/games/ultra/__init__.py ./pysollib/pysoltk.py ./pysollib/tile/ttk.py @@ -21,7 +25,7 @@ my %skip = # my $cmd = shell_quote( 'flake8', '.' ); my $cmd = shell_quote( 'flake8', - grep { not exists $skip{$_} } glob('./pysollib/*.py ./pysollib/[cmpuw]*/*.py ./pysollib/tile/*.py ./pysollib/ui/tktile/*.py ./pysollib/games/*.py ./pysollib/games/ultra/*.py') ); + grep { not exists $skip{$_} } glob('./pysollib/*.py ./pysollib/[cmpuw]*/*.py ./pysollib/tile/*.py ./pysollib/ui/tktile/*.py ./pysollib/games/*.py ./pysollib/games/[mu]*/*.py') ); # TEST eq_or_diff( scalar(`$cmd`), '', "flake8 is happy with the code." );