mirror of
https://github.com/shlomif/PySolFC.git
synced 2025-04-15 02:54:09 -04:00
Added Fire and Ice game.
This commit is contained in:
parent
d6ca9c9e25
commit
bdb62f94b7
6 changed files with 87 additions and 8 deletions
24
html-src/rules/fireandice.html
Normal file
24
html-src/rules/fireandice.html
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
<h1>Fire and Ice</h1>
|
||||||
|
<p>
|
||||||
|
One-deck game type. 1 deck. No redeal.
|
||||||
|
|
||||||
|
<h3>Object</h3>
|
||||||
|
<p>
|
||||||
|
Move all the red "fire" cards to the left five tableau piles and the black
|
||||||
|
"ice" cards to the right five tableau piles.
|
||||||
|
|
||||||
|
<h3>Rules</h3>
|
||||||
|
<p>
|
||||||
|
Five cards are dealt to each of ten tableau piles, with the leftmost and
|
||||||
|
rightmost piles receiving an extra card. Any card or sequence of cards can
|
||||||
|
be moved between tableau piles, building down by rank, regardless of suit.
|
||||||
|
<p>
|
||||||
|
In this game, the red cards are called "fire" cards and the black cards are
|
||||||
|
called "ice" cards. The object is to move all of the "fire" cards to the
|
||||||
|
leftmost five tableau piles, and all the "ice" cards to the rightmost five.
|
||||||
|
When dealing, a gap is left between the two sets of tableau piles to show
|
||||||
|
this clearer.
|
||||||
|
|
||||||
|
<h3>Notes</h3>
|
||||||
|
<p>
|
||||||
|
Fire and Ice was invented by David Bernazzani.
|
|
@ -16,3 +16,8 @@ Cards may not be moved between the reserve stacks.
|
||||||
The tableau stacks are built down by suit. Any sequence of cards in the
|
The tableau stacks are built down by suit. Any sequence of cards in the
|
||||||
tableau stacks may be moved to another appropriate tableau stack. The game
|
tableau stacks may be moved to another appropriate tableau stack. The game
|
||||||
is won when four stacks contain complete sequences from king to ace.
|
is won when four stacks contain complete sequences from king to ace.
|
||||||
|
|
||||||
|
<h3>Notes</h3>
|
||||||
|
<p>
|
||||||
|
Wave Motion was invented by David Bernazzani. Its name is a reference to
|
||||||
|
the anime series Space Battleship Yamato, also called Star Blazers.
|
||||||
|
|
|
@ -381,7 +381,7 @@ class GI:
|
||||||
GAMES_BY_INVENTORS = (
|
GAMES_BY_INVENTORS = (
|
||||||
("Paul Alfille", (8,)),
|
("Paul Alfille", (8,)),
|
||||||
("C.L. Baker", (45,)),
|
("C.L. Baker", (45,)),
|
||||||
("David Bernazzani", (314,)),
|
("David Bernazzani", (314, 830,)),
|
||||||
("Gordon Bower", (763, 783,)),
|
("Gordon Bower", (763, 783,)),
|
||||||
("Art Cabral", (9,)),
|
("Art Cabral", (9,)),
|
||||||
("Richard A. Canfield", (105,)),
|
("Richard A. Canfield", (105,)),
|
||||||
|
@ -479,7 +479,7 @@ class GI:
|
||||||
('fc-2.12', tuple(range(774, 811)) + (16681,) +
|
('fc-2.12', tuple(range(774, 811)) + (16681,) +
|
||||||
tuple(range(22217, 22219))),
|
tuple(range(22217, 22219))),
|
||||||
('fc-2.14', tuple(range(811, 827))),
|
('fc-2.14', tuple(range(811, 827))),
|
||||||
('fc-2.16', tuple(range(827, 830)))
|
('fc-2.16', tuple(range(827, 831)))
|
||||||
)
|
)
|
||||||
|
|
||||||
# deprecated - the correct way is to or a GI.GT_XXX flag
|
# deprecated - the correct way is to or a GI.GT_XXX flag
|
||||||
|
|
|
@ -45,8 +45,8 @@ from pysollib.stack import \
|
||||||
WasteTalonStack, \
|
WasteTalonStack, \
|
||||||
isRankSequence, \
|
isRankSequence, \
|
||||||
isSameSuitSequence
|
isSameSuitSequence
|
||||||
from pysollib.util import ACE, ANY_RANK, ANY_SUIT, KING, UNLIMITED_ACCEPTS, \
|
from pysollib.util import ACE, ANY_RANK, ANY_SUIT, BLACK, KING, RED,\
|
||||||
UNLIMITED_MOVES
|
UNLIMITED_ACCEPTS, UNLIMITED_MOVES
|
||||||
|
|
||||||
# ************************************************************************
|
# ************************************************************************
|
||||||
# * Curds and Whey
|
# * Curds and Whey
|
||||||
|
@ -528,6 +528,53 @@ class FourPacks(EightPacks):
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
# ************************************************************************
|
||||||
|
# * Fire and Ice
|
||||||
|
# ************************************************************************
|
||||||
|
|
||||||
|
class FireAndIce(Game):
|
||||||
|
RowStack_Class = RK_RowStack
|
||||||
|
|
||||||
|
def createGame(self, playcards=18):
|
||||||
|
l, s = Layout(self), self.s
|
||||||
|
self.setSize(l.XM + (10.5 * l.XS),
|
||||||
|
l.YM + l.YS + playcards * l.YOFFSET)
|
||||||
|
|
||||||
|
x, y = l.XM, l.YM
|
||||||
|
for i in range(5):
|
||||||
|
s.rows.append(self.RowStack_Class(x, y, self))
|
||||||
|
x += l.XS
|
||||||
|
|
||||||
|
x += l.XS / 2
|
||||||
|
|
||||||
|
for i in range(5):
|
||||||
|
s.rows.append(self.RowStack_Class(x, y, self))
|
||||||
|
x += l.XS
|
||||||
|
|
||||||
|
x, y = self.width - l.XS, self.height - l.YS
|
||||||
|
s.talon = InitialDealTalonStack(x, y, self)
|
||||||
|
|
||||||
|
l.defaultStackGroups()
|
||||||
|
|
||||||
|
def startGame(self):
|
||||||
|
for i in range(4):
|
||||||
|
self.s.talon.dealRow(frames=0)
|
||||||
|
r = self.s.rows
|
||||||
|
rows = (r[0], r[9])
|
||||||
|
self.s.talon.dealRow(rows=rows, frames=0)
|
||||||
|
self._startAndDealRow()
|
||||||
|
|
||||||
|
def isGameWon(self):
|
||||||
|
for i in self.s.rows[0:5]:
|
||||||
|
for j in i.cards:
|
||||||
|
if j.color != RED:
|
||||||
|
return False
|
||||||
|
for i in self.s.rows[5:10]:
|
||||||
|
for j in i.cards:
|
||||||
|
if j.color != BLACK:
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
# register the game
|
# register the game
|
||||||
registerGame(GameInfo(294, CurdsAndWhey, "Curds and Whey",
|
registerGame(GameInfo(294, CurdsAndWhey, "Curds and Whey",
|
||||||
GI.GT_SPIDER | GI.GT_OPEN, 1, 0, GI.SL_MOSTLY_SKILL))
|
GI.GT_SPIDER | GI.GT_OPEN, 1, 0, GI.SL_MOSTLY_SKILL))
|
||||||
|
@ -564,3 +611,5 @@ registerGame(GameInfo(724, EightPacks, "Eight Packs",
|
||||||
GI.SL_MOSTLY_SKILL))
|
GI.SL_MOSTLY_SKILL))
|
||||||
registerGame(GameInfo(762, FourPacks, "Four Packs",
|
registerGame(GameInfo(762, FourPacks, "Four Packs",
|
||||||
GI.GT_2DECK_TYPE, 2, 1, GI.SL_MOSTLY_SKILL))
|
GI.GT_2DECK_TYPE, 2, 1, GI.SL_MOSTLY_SKILL))
|
||||||
|
registerGame(GameInfo(830, FireAndIce, "Fire and Ice",
|
||||||
|
GI.GT_1DECK_TYPE, 1, 0, GI.SL_SKILL))
|
||||||
|
|
|
@ -40,7 +40,7 @@ from pysollib.stack import \
|
||||||
StackWrapper, \
|
StackWrapper, \
|
||||||
WasteStack, \
|
WasteStack, \
|
||||||
WasteTalonStack
|
WasteTalonStack
|
||||||
from pysollib.util import ACE, ANY_SUIT, JACK, KING, QUEEN, RANKS
|
from pysollib.util import ACE, ANY_SUIT, BLACK, JACK, KING, QUEEN, RANKS, RED
|
||||||
|
|
||||||
|
|
||||||
class GrandfathersClock_Hint(CautiousDefaultHint):
|
class GrandfathersClock_Hint(CautiousDefaultHint):
|
||||||
|
@ -187,9 +187,6 @@ class Dial(Game):
|
||||||
# * Hemispheres
|
# * Hemispheres
|
||||||
# ************************************************************************
|
# ************************************************************************
|
||||||
|
|
||||||
BLACK, RED = 0, 1
|
|
||||||
|
|
||||||
|
|
||||||
class Hemispheres_Hint(DefaultHint):
|
class Hemispheres_Hint(DefaultHint):
|
||||||
def shallMovePile(self, from_stack, to_stack, pile, rpile):
|
def shallMovePile(self, from_stack, to_stack, pile, rpile):
|
||||||
if not self._defaultShallMovePile(from_stack, to_stack, pile, rpile):
|
if not self._defaultShallMovePile(from_stack, to_stack, pile, rpile):
|
||||||
|
|
|
@ -52,6 +52,10 @@ SPADE = 1
|
||||||
HEART = 2
|
HEART = 2
|
||||||
DIAMOND = 3
|
DIAMOND = 3
|
||||||
|
|
||||||
|
# Specific colors
|
||||||
|
BLACK = 0
|
||||||
|
RED = 1
|
||||||
|
|
||||||
# Card ranks are 0-12. We also define symbolic names for the picture cards.
|
# Card ranks are 0-12. We also define symbolic names for the picture cards.
|
||||||
RANKS = (_("Ace"), "2", "3", "4", "5", "6", "7", "8", "9", "10",
|
RANKS = (_("Ace"), "2", "3", "4", "5", "6", "7", "8", "9", "10",
|
||||||
_("Jack"), _("Queen"), _("King"))
|
_("Jack"), _("Queen"), _("King"))
|
||||||
|
|
Loading…
Add table
Reference in a new issue