From: <umg...@us...> - 2007-03-01 17:29:43
|
Revision: 360 http://svn.sourceforge.net/pybridge/?rev=360&view=rev Author: umgangee Date: 2007-03-01 09:29:38 -0800 (Thu, 01 Mar 2007) Log Message: ----------- Relocate symbol types to pybridge.bridge.symbols. Renamed "Seat" type to the more intuitive "Player". Modified Paths: -------------- trunk/pybridge/pybridge/bridge/bidding.py trunk/pybridge/pybridge/bridge/call.py trunk/pybridge/pybridge/bridge/card.py trunk/pybridge/pybridge/bridge/deck.py trunk/pybridge/pybridge/bridge/game.py trunk/pybridge/pybridge/bridge/playing.py trunk/pybridge/pybridge/bridge/scoring.py trunk/pybridge/pybridge/network/localbridge.py trunk/pybridge/pybridge/network/localtable.py trunk/pybridge/pybridge/network/remotebridge.py trunk/pybridge/pybridge/network/remotetable.py trunk/pybridge/pybridge/server/database.py trunk/pybridge/pybridge/ui/cardarea.py trunk/pybridge/pybridge/ui/window_bridgetable.py trunk/pybridge/tests/gumby.py trunk/pybridge/tests/test_bidding.py trunk/pybridge/tests/test_playing.py Modified: trunk/pybridge/pybridge/bridge/bidding.py =================================================================== --- trunk/pybridge/pybridge/bridge/bidding.py 2007-03-01 17:22:17 UTC (rev 359) +++ trunk/pybridge/pybridge/bridge/bidding.py 2007-03-01 17:29:38 UTC (rev 360) @@ -1,5 +1,5 @@ # PyBridge -- online contract bridge made easy. -# Copyright (C) 2004-2006 PyBridge Project. +# Copyright (C) 2004-2007 PyBridge Project. # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License @@ -10,19 +10,16 @@ # 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, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from call import Call, Bid, Pass, Double, Redouble +from symbols import Level, Player, Strain -from call import Level, Strain -from deck import Seat - - class Bidding: """This class models the bidding (auction) phase of a game of bridge. @@ -31,7 +28,7 @@ def __init__(self, dealer): - assert dealer in Seat + assert dealer in Player self.calls = [] self.dealer = dealer @@ -75,7 +72,7 @@ redouble = self.getCurrentCall(Redouble) # Determine declarer. partnership = (self.whoCalled(bid), \ - Seat[(self.whoCalled(bid).index + 2) % 4]) + Player[(self.whoCalled(bid).index + 2) % 4]) for call in self.calls: if isinstance(call, Bid) and call.strain == bid.strain \ and self.whoCalled(call) in partnership: @@ -125,8 +122,8 @@ @param player: the player attempting to call, or None. @return: True if call is available, False if not. """ - assert(isinstance(call, Call)) - assert(player in Seat or player is None) + assert isinstance(call, Call) + assert player in Player or player is None # The bidding must not be complete. if self.isComplete(): @@ -153,15 +150,15 @@ # A double must be made on the current bid from opponents, # with has not been already doubled by partnership. if isinstance(call, Double): - opposition = (Seat[(self.whoseTurn().index + 1) % 4], - Seat[(self.whoseTurn().index + 3) % 4]) + opposition = (Player[(self.whoseTurn().index + 1) % 4], + Player[(self.whoseTurn().index + 3) % 4]) return not self.getCurrentCall(Double) and bidder in opposition # A redouble must be made on the current bid from partnership, # which has been doubled by an opponent. elif isinstance(call, Redouble): partnership = (self.whoseTurn(), - Seat[(self.whoseTurn().index + 2) % 4]) + Player[(self.whoseTurn().index + 2) % 4]) return self.getCurrentCall(Double) and bidder in partnership return False # Otherwise unavailable. @@ -175,7 +172,7 @@ """ assert isinstance(call, Call) if call in self.calls: - return Seat[(self.calls.index(call) + self.dealer.index) % 4] + return Player[(self.calls.index(call) + self.dealer.index) % 4] return False # Call not made by any player. @@ -184,6 +181,6 @@ @return: the player next to call. """ - player = Seat[(len(self.calls) + self.dealer.index) % 4] - return not(self.isComplete()) and player + player = Player[(len(self.calls) + self.dealer.index) % 4] + return not self.isComplete() and player Modified: trunk/pybridge/pybridge/bridge/call.py =================================================================== --- trunk/pybridge/pybridge/bridge/call.py 2007-03-01 17:22:17 UTC (rev 359) +++ trunk/pybridge/pybridge/bridge/call.py 2007-03-01 17:29:38 UTC (rev 360) @@ -1,5 +1,5 @@ # PyBridge -- online contract bridge made easy. -# Copyright (C) 2004-2006 PyBridge Project. +# Copyright (C) 2004-2007 PyBridge Project. # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License @@ -10,7 +10,7 @@ # 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, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. @@ -18,18 +18,11 @@ from twisted.spread import pb -from pybridge.enum import Enum +from symbols import Level, Strain -# Bid levels. -Level = Enum('One', 'Two', 'Three', 'Four', 'Five', 'Six', 'Seven') - -# Bid strains, or denominations. -Strain = Enum('Club', 'Diamond', 'Heart', 'Spade', 'NoTrump') - - class Call(pb.Copyable, pb.RemoteCopy): - """Superclass for bids, passes, doubles and redoubles.""" + """Abstract class, inherited by Bid, Pass, Double and Redouble.""" class Bid(Call): @@ -44,12 +37,13 @@ def __cmp__(self, other): - assert issubclass(other.__class__, Call) + if not issubclass(other.__class__, Call): + raise TypeError, "Expected Call, got %s" % type(other) if isinstance(other, Bid): # Compare two bids. - selfVal = self.level.index*len(Strain) + self.strain.index - otherVal = other.level.index*len(Strain) + other.strain.index - return cmp(selfVal, otherVal) + selfIndex = self.level.index*len(Strain) + self.strain.index + otherIndex = other.level.index*len(Strain) + other.strain.index + return cmp(selfIndex, otherIndex) else: # Comparing non-bid calls returns true. return 1 Modified: trunk/pybridge/pybridge/bridge/card.py =================================================================== --- trunk/pybridge/pybridge/bridge/card.py 2007-03-01 17:22:17 UTC (rev 359) +++ trunk/pybridge/pybridge/bridge/card.py 2007-03-01 17:29:38 UTC (rev 360) @@ -1,5 +1,5 @@ # PyBridge -- online contract bridge made easy. -# Copyright (C) 2004-2006 PyBridge Project. +# Copyright (C) 2004-2007 PyBridge Project. # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License @@ -10,7 +10,7 @@ # 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, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. @@ -18,23 +18,15 @@ from twisted.spread import pb -from pybridge.enum import Enum +from symbols import Rank, Suit -# Card ranks. -Rank = Enum('Two', 'Three', 'Four', 'Five', 'Six', 'Seven', 'Eight', 'Nine', - 'Ten', 'Jack', 'Queen', 'King', 'Ace') - -# Card suits. -Suit = Enum('Club', 'Diamond', 'Heart', 'Spade') - - class Card(pb.Copyable, pb.RemoteCopy): """A card has a rank and a suit.""" + def __init__(self, rank, suit): - assert(rank in Rank) - assert(suit in Suit) + assert rank in Rank and suit in Suit self.rank = rank self.suit = suit @@ -51,7 +43,9 @@ Care must be taken when comparing cards of different suits. """ - assert isinstance(other, Card) + if not isinstance(other, Card): + raise TypeError, "Expected Card, got %s" % type(other) + selfIndex = self.suit.index*13 + self.rank.index otherIndex = other.suit.index*13 + other.rank.index return cmp(selfIndex, otherIndex) Modified: trunk/pybridge/pybridge/bridge/deck.py =================================================================== --- trunk/pybridge/pybridge/bridge/deck.py 2007-03-01 17:22:17 UTC (rev 359) +++ trunk/pybridge/pybridge/bridge/deck.py 2007-03-01 17:29:38 UTC (rev 360) @@ -20,13 +20,10 @@ from operator import mul from random import shuffle -from card import Card, Rank, Suit +from card import Card +from symbols import Player, Rank, Suit -from pybridge.enum import Enum -Seat = Enum('North', 'East', 'South', 'West') # Clockwise. - - # See http://mail.python.org/pipermail/edu-sig/2001-May/001288.html for details. comb = lambda n, k: reduce(mul, range(n, n-k, -1)) / reduce(mul, range(1, k+1)) @@ -39,7 +36,7 @@ A hand is a collection of 13 cards from the deck. A deal is a distribution of all 52 cards to four hands. - A deal is represented as a dictionary, mapping Seat labels to lists (hands) + A deal is represented as a dictionary, mapping Player labels to lists (hands) of Card objects. There are exactly 52! / (13!)**4 (comb(52,13) * comb(39,13) * comb(26,13)) @@ -59,7 +56,7 @@ def isValidDeal(self, deal): """Checks that structure of deal conforms to requirements: - * 4-element dict, mapping Seat objects to hand lists. + * 4-element dict, mapping Player objects to hand lists. * Hand lists contain exactly 13 Card objects. * No card may be repeated in the same hand, or between hands. * The cards in hands may be in any order. @@ -70,17 +67,17 @@ return True # TODO - def dealRandom(self): # randomDeal + def randomDeal(self): """Shuffles the deck and generates a random deal of hands. @return: a deal dictionary. """ shuffle(self.cards) hands = {} - for seat in Seat: - hands[seat] = [] + for player in Player: + hands[player] = [] for index, card in enumerate(self.cards): - hands[Seat[index % len(Seat)]].append(card) + hands[Player[index % len(Player)]].append(card) for hand in hands.values(): hand.sort() return hands @@ -101,20 +98,20 @@ indexes = {} # For each hand, compute indexes of cards in cardSeq. - for seat in (Seat.North, Seat.East, Seat.South): - indexes[seat] = 0 - deal[seat].sort(reverse=False) + for player in (Player.North, Player.East, Player.South): + indexes[player] = 0 + deal[player].sort(reverse=False) # It is desirable to remove cards from cardSeq when adding their # indexes, instead of doing so in an extra step. # Removing cards backwards preserves the indexes of later cards. - for i, card in enumerate(deal[seat]): - indexes[seat] += comb(cardSeq.index(card), 13-i) + for i, card in enumerate(deal[player]): + indexes[player] += comb(cardSeq.index(card), 13-i) cardSeq.remove(card) # Deal index = (Nindex * Emax * Smax) + (Eindex * Smax) + Sindex - indexes[Seat.North] *= self.Emax * self.Smax - indexes[Seat.East] *= self.Smax - return sum(indexes.values()) + indexes[Player.North] *= self.Emax * self.Smax + indexes[Player.East] *= self.Smax + return long(sum(indexes.values())) def indexToDeal(self, num): @@ -133,28 +130,28 @@ deal = {} # Split index into hand indexes. - indexes = {Seat.North : (num / self.Smax) / self.Emax, - Seat.East : (num / self.Smax) % self.Emax, - Seat.South : (num % self.Smax) } + indexes = {Player.North : (num / self.Smax) / self.Emax, + Player.East : (num / self.Smax) % self.Emax, + Player.South : (num % self.Smax) } - for seat in (Seat.North, Seat.East, Seat.South): - deal[seat] = [] + for player in (Player.North, Player.East, Player.South): + deal[player] = [] for k in range(13, 0, -1): - # Find the largest n such that comb(n, k) <= indexes[seat]. + # Find the largest n such that comb(n, k) <= indexes[player]. n = k-1 # n < k implies comb(n, k) = 0 # comb(n+1, k) = # n-k = -1 => comb(n, k) * (n+1) # otherwise => (comb(n, k) * (n+1)) / (n+1 - k) - while comb(n+1, k) <= indexes[seat]: + while comb(n+1, k) <= indexes[player]: n += 1 # Remove card index from indices, add card to hand. - indexes[seat] -= comb(n, k) + indexes[player] -= comb(n, k) card = cardSeq[n] - deal[seat].append(card) + deal[player].append(card) cardSeq.remove(card) - - deal[Seat.West] = cardSeq # South has the remaining cards. + + deal[Player.West] = cardSeq # West has the remaining cards. return deal Modified: trunk/pybridge/pybridge/bridge/game.py =================================================================== --- trunk/pybridge/pybridge/bridge/game.py 2007-03-01 17:22:17 UTC (rev 359) +++ trunk/pybridge/pybridge/bridge/game.py 2007-03-01 17:29:38 UTC (rev 360) @@ -1,5 +1,5 @@ # PyBridge -- online contract bridge made easy. -# Copyright (C) 2004-2006 PyBridge Project. +# Copyright (C) 2004-2007 PyBridge Project. # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License @@ -10,7 +10,7 @@ # 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 write to the Free Software # Foundation Inc. 51 Franklin Street Fifth Floor Boston MA 02110-1301 USA. @@ -18,19 +18,15 @@ from bidding import Bidding from playing import Playing +from symbols import Player, Suit -# Enumerations. -from card import Suit -from deck import Seat +class GameError(Exception): + pass -class GameError(Exception): pass - class Game: - """A bridge game models the bidding, playing, scoring sequence. - - """ + """A bridge game models the bidding, playing, scoring sequence.""" def __init__(self, dealer, deal, scoring, vulnNS, vulnEW): @@ -55,7 +51,7 @@ return self.bidding.isPassedOut() - def isHandVisible(self, seat, viewer): + def isHandVisible(self, player, viewer): """A hand is visible if one of the following conditions is met: 1. The hand is the viewer's own hand. @@ -63,23 +59,23 @@ 3. Bidding complete and hand is dummy's, and first card of first trick has been played. """ - return seat == viewer \ + return player == viewer \ or self.isComplete() \ - or (self.bidding.isComplete() and seat == self.playing.dummy and \ + or (self.bidding.isComplete() and player == self.playing.dummy and \ len(self.playing.getTrick(0)[1]) >= 1) - def makeCall(self, seat, call): - """Makes call from seat.""" + def makeCall(self, player, call): + """Makes call from player.""" if self.bidding.isComplete(): raise GameError('not in bidding') - if self.bidding.whoseTurn() is not seat: + if self.bidding.whoseTurn() is not player: raise GameError('out of turn') - elif not self.bidding.isValidCall(call, seat): + elif not self.bidding.isValidCall(call, player): raise GameError('invalid call') - self.bidding.makeCall(call, seat) + self.bidding.makeCall(call, player) # If bidding is complete, start playing. if self.bidding.isComplete() and not self.bidding.isPassedOut(): @@ -90,31 +86,31 @@ self.playing = Playing(contract['declarer'], trumpSuit) - def playCard(self, seat, card): - """Plays card from seat.""" + def playCard(self, player, card): + """Plays card from player.""" if not self.bidding.isComplete() or self.bidding.isPassedOut(): raise GameError('not in play') elif self.playing.isComplete(): raise GameError('not in play') - hand = self.deal[seat] - if self.playing.whoseTurn() is not seat: + hand = self.deal[player] + if self.playing.whoseTurn() is not player: raise GameError('out of turn') - elif not self.playing.isValidPlay(card, seat, hand): + elif not self.playing.isValidPlay(card, player, hand): raise GameError('invalid card') self.playing.playCard(card) - def getHand(self, seat, viewer=None): - """Returns the hand of player specified by seat. + def getHand(self, player, viewer=None): + """Returns the hand of specified player. If viewer player is specified, then the ability of viewer to "see" the hand will be examined. """ - if viewer and not self.isHandVisible(seat, viewer): + if viewer and not self.isHandVisible(player, viewer): raise GameError('hand not visible') - return self.deal[seat] + return self.deal[player] def getTrickCount(self): @@ -165,9 +161,9 @@ else: contract = self.bidding.getContract() declarer = contract['declarer'] - dummy = Seat[(declarer.index + 2) % 4] - vulnerable = (self.vulnNS and declarer in (Seat.North, Seat.South)) + \ - (self.vulnEW and declarer in (Seat.West, Seat.East)) + dummy = Player[(declarer.index + 2) % 4] + vulnerable = (self.vulnNS and declarer in (Player.North, Player.South)) + \ + (self.vulnEW and declarer in (Player.West, Player.East)) tricksMade = 0 # Count of tricks won by declarer or dummy. for index in range(len(self.playing.winners)): @@ -183,7 +179,7 @@ def whoseTurn(self): - """Returns the seat that is next to call or play card.""" + """Returns the player that is next to call or play card.""" if not self.isComplete(): if self.bidding.isComplete(): return self.playing.whoseTurn() Modified: trunk/pybridge/pybridge/bridge/playing.py =================================================================== --- trunk/pybridge/pybridge/bridge/playing.py 2007-03-01 17:22:17 UTC (rev 359) +++ trunk/pybridge/pybridge/bridge/playing.py 2007-03-01 17:29:38 UTC (rev 360) @@ -1,5 +1,5 @@ # PyBridge -- online contract bridge made easy. -# Copyright (C) 2004-2006 PyBridge Project. +# Copyright (C) 2004-2007 PyBridge Project. # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License @@ -10,19 +10,16 @@ # 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, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from card import Card +from symbols import Player, Suit -# Enumerations. -from card import Suit -from deck import Seat - class Playing: """This class models the trick-taking phase of a game of bridge. @@ -32,19 +29,19 @@ def __init__(self, declarer, trumps): - assert declarer in Seat + assert declarer in Player assert trumps in Suit or trumps is None # (None = No Trumps) self.trumps = trumps self.declarer = declarer - self.dummy = Seat[(declarer.index + 2) % 4] - self.lho = Seat[(declarer.index + 1) % 4] - self.rho = Seat[(declarer.index + 3) % 4] + self.dummy = Player[(declarer.index + 2) % 4] + self.lho = Player[(declarer.index + 1) % 4] + self.rho = Player[(declarer.index + 3) % 4] # Each trick corresponds to a cross-section of lists. self.played = {} - for seat in Seat: - self.played[seat] = [] + for player in Player: + self.played[player] = [] self.winners = [] # Winning player of each trick. @@ -63,17 +60,17 @@ @param: trick index, in range 0 to 12. @return: a (leader, cards) trick tuple. """ - assert(index in range(13)) + assert 0 <= index < 13 if index == 0: # First trick. leader = self.lho # Leader is declarer's left-hand opponent. else: # Leader is winner of previous trick. leader = self.winners[index - 1] cards = {} - for seat in Seat: + for player in Player: # If length of list exceeds index value, player's card in trick. - if len(self.played[seat]) > index: - cards[seat] = self.played[seat][index] + if len(self.played[player]) > index: + cards[player] = self.played[player][index] return leader, cards @@ -116,7 +113,7 @@ """Card is playable if and only if: - Play session is not complete. - - Seat is on turn to play. + - Player is on turn to play. - Card exists in hand. - Card has not been previously played. @@ -174,7 +171,7 @@ if len(cards) == 4: # If trick is complete, trick winner's turn. return self.whoPlayed(self.winningCard(trick)) else: # Otherwise, turn is next (clockwise) player in trick. - return Seat[(leader.index + len(cards)) % 4] + return Player[(leader.index + len(cards)) % 4] return False Modified: trunk/pybridge/pybridge/bridge/scoring.py =================================================================== --- trunk/pybridge/pybridge/bridge/scoring.py 2007-03-01 17:22:17 UTC (rev 359) +++ trunk/pybridge/pybridge/bridge/scoring.py 2007-03-01 17:29:38 UTC (rev 360) @@ -1,5 +1,5 @@ # PyBridge -- online contract bridge made easy. -# Copyright (C) 2004-2006 PyBridge Project. +# Copyright (C) 2004-2007 PyBridge Project. # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License @@ -10,13 +10,13 @@ # 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, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -from call import Strain +from symbols import Strain # There are undoubtedly many minor variations of the score values. @@ -24,7 +24,11 @@ def scoreDuplicate(result): - """Scoring algorithm for duplicate bridge.""" + """Scoring algorithm for duplicate bridge. + + This code includes the scoring values from: + http://www.ebu.co.uk/lawsandethics/the_laws/chapter8.asp + """ score = 0 isDoubled = result['contract']['doubleBy'] Modified: trunk/pybridge/pybridge/network/localbridge.py =================================================================== --- trunk/pybridge/pybridge/network/localbridge.py 2007-03-01 17:22:17 UTC (rev 359) +++ trunk/pybridge/pybridge/network/localbridge.py 2007-03-01 17:29:38 UTC (rev 360) @@ -1,5 +1,5 @@ # PyBridge -- online contract bridge made easy. -# Copyright (C) 2004-2006 PyBridge Project. +# Copyright (C) 2004-2007 PyBridge Project. # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License @@ -10,7 +10,7 @@ # 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, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. @@ -37,11 +37,9 @@ from pybridge.bridge.deck import Deck from pybridge.bridge.game import Game, GameError from pybridge.bridge.scoring import scoreDuplicate +from pybridge.bridge.symbols import Player -# Enumerations. -from pybridge.bridge.deck import Seat - class LocalBridgeTable(LocalTable): """A bridge table, implementing the IBridgeTable interface. @@ -57,12 +55,12 @@ self.dealer = None self.deck = Deck() self.game = None - self.players = dict.fromkeys(Seat, None) + self.players = dict.fromkeys(Player, None) self.scoring = scoreDuplicate self.handsSeen = {} - for seat in Seat: - self.handsSeen[seat] = [] + for player in Player: + self.handsSeen[player] = [] self.pendingDeals = [] # Queue of deals for successive games. @@ -83,13 +81,13 @@ if self.game.playing: state['game']['declarer'] = self.game.playing.declarer.key state['game']['played'] = {} - for seat, played in self.game.playing.played.items(): - state['game']['played'][seat.key] = played + for player, played in self.game.playing.played.items(): + state['game']['played'][player.key] = played # Add visible hands. state['game']['deal'] = {} - for seat, hand in self.game.deal.items(): - if self.game.isHandVisible(seat, viewer=None): - state['game']['deal'][seat.key] = hand + for player, hand in self.game.deal.items(): + if self.game.isHandVisible(player, viewer=None): + state['game']['deal'][player.key] = hand else: state['game'] = None @@ -118,7 +116,7 @@ raise DeniedRequest, 'Not a player' try: - self.game.makeCall(call=call, seat=position) + self.game.makeCall(call=call, player=position) except GameError, error: raise DeniedRequest, error @@ -142,7 +140,7 @@ raise DeniedRequest, 'Dummy cannot play cards' try: - self.game.playCard(card=card, seat=position) + self.game.playCard(card=card, player=position) except GameError, error: raise DeniedRequest, error @@ -164,9 +162,9 @@ if (self.game is None or self.game.isComplete()) \ and len([p for p in self.players.values() if p is None]) == 0: - deal = deal or self.deck.dealRandom() + deal = deal or self.deck.randomDeal() vulnNS, vulnEW = False, False - self.dealer = dealer or (self.dealer and Seat[(self.dealer.index + 1) % 4]) or Seat.North + self.dealer = dealer or (self.dealer and Player[(self.dealer.index + 1) % 4]) or Player.North self.game = Game(self.dealer, deal, self.scoring, vulnNS, vulnEW) self.updateObservers('gameStarted', dealer=self.dealer.key, vulnNS=vulnNS, vulnEW=vulnEW) @@ -198,7 +196,7 @@ """ # TODO: what about observers? for viewer, player in self.players.items(): - for seat in Seat: + for seat in Player: if seat not in self.handsSeen[viewer] and self.game.isHandVisible(seat, viewer): self.handsSeen[viewer].append(seat) hand = self.game.deal[seat] Modified: trunk/pybridge/pybridge/network/localtable.py =================================================================== --- trunk/pybridge/pybridge/network/localtable.py 2007-03-01 17:22:17 UTC (rev 359) +++ trunk/pybridge/pybridge/network/localtable.py 2007-03-01 17:29:38 UTC (rev 360) @@ -1,5 +1,5 @@ # PyBridge -- online contract bridge made easy. -# Copyright (C) 2004-2006 PyBridge Project. +# Copyright (C) 2004-2007 PyBridge Project. # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License @@ -10,7 +10,7 @@ # 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, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. @@ -23,10 +23,9 @@ from pybridge.interfaces.table import ITable from pybridge.network.error import DeniedRequest, IllegalRequest +from pybridge.bridge.symbols import Player # XX TODO: Try to avoid this. -from pybridge.bridge.deck import Seat # XX TODO: Try to avoid this. - class LocalTable(pb.Cacheable): """""" @@ -168,7 +167,7 @@ def view_addPlayer(self, user, position, player=None): - position = getattr(Seat, position) # XX + position = getattr(Player, position) # XX self.table.addPlayer(position, user) Modified: trunk/pybridge/pybridge/network/remotebridge.py =================================================================== --- trunk/pybridge/pybridge/network/remotebridge.py 2007-03-01 17:22:17 UTC (rev 359) +++ trunk/pybridge/pybridge/network/remotebridge.py 2007-03-01 17:29:38 UTC (rev 360) @@ -1,5 +1,5 @@ # PyBridge -- online contract bridge made easy. -# Copyright (C) 2004-2006 PyBridge Project. +# Copyright (C) 2004-2007 PyBridge Project. # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License @@ -10,7 +10,7 @@ # 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, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. @@ -35,11 +35,9 @@ # Bridge game. from pybridge.bridge.game import Game, GameError from pybridge.bridge.scoring import scoreDuplicate +from pybridge.bridge.symbols import Player -# Enumerations. -from pybridge.bridge.deck import Seat - class RemoteBridgeTable(RemoteTable): """A bridge table, implementing the IBridgeTable interface. @@ -54,36 +52,36 @@ self.dealer = None self.game = None - self.players = dict.fromkeys(Seat, None) + self.players = dict.fromkeys(Player, None) self.scoring = scoreDuplicate def setCopyableState(self, state): RemoteTable.setCopyableState(self, state) - # Convert seat strings to Seat enumeration values. + # Convert seat strings to Player enumeration values. players = {} for seat, player in self.players.items(): - players[getattr(Seat, seat)] = player + players[getattr(Player, seat)] = player self.players = players if state.get('game'): - self.dealer = getattr(Seat, state['game']['dealer']) # XX + self.dealer = getattr(Player, state['game']['dealer']) # XX deal = {} - for seat in Seat: - deal[seat] = state['game']['deal'].get(seat, []) + for player in Player: + deal[player] = state['game']['deal'].get(player, []) vulnNS, vulnEW = state['game']['vulnNS'], state['game']['vulnEW'] self.game = Game(self.dealer, deal, self.scoring, vulnNS, vulnEW) if state['game'].get('calls'): for call in state['game']['calls']: - seat = self.game.whoseTurn() - self.game.makeCall(call=call, seat=seat) + player = self.game.whoseTurn() + self.game.makeCall(call=call, player=player) if state['game'].get('played'): played = state['game']['played'] while sum([len(cards) for cards in played.values()]) > 0: - seat = self.game.whoseTurn() - card = played[seat.key].pop(0) - self.game.playCard(card=card, seat=seat) + player = self.game.whoseTurn() + card = played[player.key].pop(0) + self.game.playCard(card=card, player=player) def gameMakeCall(self, call, position=None): @@ -101,22 +99,6 @@ def gamePlayCard(self, card, position): d = self.master.callRemote('gamePlayCard', card) return d -# # Check that game is running, we are playing, -# # the position specified is on turn to play, -# # and the card specified is in player's hand. -# if self.game and self.position \ -# and self.game.whoseTurn() == position \ -# and self.game.playing.isValidPlay(card, position, self.game.deal[position]): -# d = self.master.callRemote('gamePlayCard', card) -# return d -# declarer = self.game.playing.declarer -# dummy = self.game.playing.dummy -# # Can play card from own hand, or from dummy's hand as declarer. -# seat = -# if self.game.whoseTurn() == self.position \ -# or (self.game.whoseTurn() == dummy and self.position == declarer): -# d = self.master.callRemote('gamePlayCard', card) -# return d def requestNextGame(self, ready=True, player=None): @@ -128,9 +110,9 @@ def observe_gameStarted(self, dealer, vulnNS, vulnEW): - dealer = getattr(Seat, dealer) # XX + dealer = getattr(Player, dealer) # XX self.dealer = dealer - deal = dict.fromkeys(Seat, []) # Unknown hands. + deal = dict.fromkeys(Player, []) # Unknown hands. self.game = Game(dealer, deal, self.scoring, vulnNS, vulnEW) self.eventHandler.gameStarted(self, dealer, vulnNS, vulnEW) @@ -140,19 +122,19 @@ def observe_gameCallMade(self, call, position): - position = getattr(Seat, position) # XX - self.game.makeCall(call=call, seat=position) + position = getattr(Player, position) # XX + self.game.makeCall(call=call, player=position) self.eventHandler.gameCallMade(self, call, position) def observe_gameCardPlayed(self, card, position): - position = getattr(Seat, position) # XX - self.game.playCard(card=card, seat=position) + position = getattr(Player, position) # XX + self.game.playCard(card=card, player=position) self.eventHandler.gameCardPlayed(self, card, position) def observe_gameHandRevealed(self, hand, position): - position = getattr(Seat, position) # XX + position = getattr(Player, position) # XX self.game.deal[position] = hand self.eventHandler.gameHandRevealed(self, hand, position) Modified: trunk/pybridge/pybridge/network/remotetable.py =================================================================== --- trunk/pybridge/pybridge/network/remotetable.py 2007-03-01 17:22:17 UTC (rev 359) +++ trunk/pybridge/pybridge/network/remotetable.py 2007-03-01 17:29:38 UTC (rev 360) @@ -1,5 +1,5 @@ # PyBridge -- online contract bridge made easy. -# Copyright (C) 2004-2006 PyBridge Project. +# Copyright (C) 2004-2007 PyBridge Project. # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License @@ -10,7 +10,7 @@ # 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, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. @@ -21,10 +21,9 @@ from pybridge.interfaces.table import ITable from pybridge.network.error import DeniedRequest, IllegalRequest +from pybridge.bridge.symbols import Player # XX TODO: Try to avoid this. -from pybridge.bridge.deck import Seat # XX TODO: Try to avoid this. - class RemoteTable(pb.RemoteCache): """ @@ -87,13 +86,13 @@ def observe_playerAdded(self, player, position): - position = getattr(Seat, position) # XX + position = getattr(Player, position) # XX self.players[position] = player self.eventHandler.playerAdded(self, player, position) def observe_playerRemoved(self, player, position): - position = getattr(Seat, position) # XX + position = getattr(Player, position) # XX self.players[position] = None self.eventHandler.playerRemoved(self, player, position) Modified: trunk/pybridge/pybridge/server/database.py =================================================================== --- trunk/pybridge/pybridge/server/database.py 2007-03-01 17:22:17 UTC (rev 359) +++ trunk/pybridge/pybridge/server/database.py 2007-03-01 17:29:38 UTC (rev 360) @@ -22,7 +22,7 @@ from sqlobject.inheritance import InheritableSQLObject import pybridge.environment as env -from pybridge.bridge.deck import Seat +from pybridge.bridge.symbols import Player backend = "sqlite" @@ -119,10 +119,9 @@ """Captures game attributes specific to bridge games. """ - board = ForeignKey('BridgeBoard') - declarer = EnumCol(enumValues=list(Seat)) + declarer = EnumCol(enumValues=list(Player)) # contract = trickCount = IntCol() # Number of tricks won by score = IntCol() @@ -145,6 +144,6 @@ """ deal = IntCol() - dealer = EnumCol(enumValues=list(Seat)) + dealer = EnumCol(enumValues=list(Player)) vuln = EnumCol(enumValues=['none', 'ns', 'ew', 'all']) Modified: trunk/pybridge/pybridge/ui/cardarea.py =================================================================== --- trunk/pybridge/pybridge/ui/cardarea.py 2007-03-01 17:22:17 UTC (rev 359) +++ trunk/pybridge/pybridge/ui/cardarea.py 2007-03-01 17:29:38 UTC (rev 360) @@ -24,8 +24,8 @@ import pybridge.environment as env from canvas import CairoCanvas -from pybridge.bridge.card import Card, Rank, Suit -from pybridge.bridge.deck import Seat +from pybridge.bridge.card import Card +from pybridge.bridge.symbols import Player, Rank, Suit # The order in which card graphics are expected in card mask. CARD_MASK_RANKS = [Rank.Ace, Rank.Two, Rank.Three, Rank.Four, Rank.Five, @@ -60,11 +60,11 @@ super(CardArea, self).__init__() # Initialise parent. # To receive card clicked events, override this with external method. - self.on_card_clicked = lambda card, seat: True + self.on_card_clicked = lambda card, player: True self.hands = {} self.trick = None - self.set_seat_mapping(Seat.South) + self.set_player_mapping(Player.South) self.connect('button_press_event', self.button_press) self.add_events(gtk.gdk.BUTTON_PRESS_MASK) @@ -91,15 +91,14 @@ context.reset_clip() - def set_hand(self, hand, seat, facedown=False, omit=[]): - """Sets the hand of player at seat. - Draws representation of cards in hand to context. + def set_hand(self, hand, player, facedown=False, omit=[]): + """Sets the hand of player. Draws cards in hand to context. The hand is buffered into an ImageSurface, since hands change infrequently and multiple calls to draw_card() are expensive. @param hand: a list of Card objects. - @param seat: a member of Seat. + @param player: a member of Player. @param facedown: if True, cards are drawn face-down. @param omit: a list of elements of hand not to draw. """ @@ -107,7 +106,7 @@ # TODO: coords should be dict (card : (pos_x, pos_y)), but this breaks when hashing. def get_coords_for_hand(): coords = [] - if seat in (self.TOP, self.BOTTOM): + if player in (self.TOP, self.BOTTOM): pos_y = 0 if facedown is True: # Draw cards in one continuous row. for index, card in enumerate(hand): @@ -124,14 +123,14 @@ else: # LEFT or RIGHT. if facedown is True: # Wrap cards to a 4x4 grid. for index, card in enumerate(hand): - adjust = seat is self.RIGHT and index == 12 and 3 + adjust = player is self.RIGHT and index == 12 and 3 pos_x = ((index % 4) + adjust) * self.spacing_x pos_y = (index / 4) * self.spacing_y coords.append((card, pos_x, pos_y)) else: longest = max([len(cards) for cards in suits.values()]) for index, card in enumerate(hand): - adjust = seat is self.RIGHT and longest - len(suits[card.suit]) + adjust = player is self.RIGHT and longest - len(suits[card.suit]) pos_x = (suits[card.suit].index(card) + adjust) * self.spacing_x pos_y = RED_BLACK.index(card.suit) * self.spacing_y coords.append((card, pos_x, pos_y)) @@ -150,7 +149,7 @@ for suit in RED_BLACK: hand.extend(suits[suit]) - saved = self.hands.get(seat) + saved = self.hands.get(player) if saved and saved['hand'] == hand: # If hand has been set previously, do not recalculate coords. coords = saved['coords'] @@ -169,24 +168,24 @@ self.draw_card(context, pos_x, pos_y, card) # Save - self.hands[seat] = {'hand' : hand, 'visible' : visible, - 'surface' : surface, 'coords' : coords, } + self.hands[player] = {'hand' : hand, 'visible' : visible, + 'surface' : surface, 'coords' : coords, } - id = 'hand-%s' % seat # Identifier for this item. + id = 'hand-%s' % player # Identifier for this item. if id in self.items: self.update_item(id, source=surface) else: xy = {self.TOP : (0.5, 0.15), self.BOTTOM : (0.5, 0.85), self.LEFT : (0.15, 0.5), self.RIGHT : (0.85, 0.5), } - self.add_item(id, surface, xy[seat], 0) + self.add_item(id, surface, xy[player], 0) - def set_player_name(self, seat, name=None): + def set_player_name(self, player, name=None): """ @param name: the name of the player, or None. """ - id = 'player-%s' % seat + id = 'player-%s' % player if name is None or id in self.items: self.remove_item(id) return @@ -216,19 +215,19 @@ else: xy = {self.TOP : (0.5, 0.15), self.BOTTOM : (0.5, 0.85), self.LEFT : (0.15, 0.6), self.RIGHT : (0.85, 0.6), } - self.add_item(id, surface, xy[seat], 2) + self.add_item(id, surface, xy[player], 2) - def set_seat_mapping(self, focus=Seat.South): - """Sets the mapping between seats at table and positions of hands. + def set_player_mapping(self, focus=Player.South): + """Sets the mapping between players at table and positions of hands. - @param focus: the Seat to be drawn "closest" to the observer. + @param focus: the Player to be drawn "closest" to the observer. """ - # Assumes Seat elements are ordered clockwise from North. - order = Seat[focus.index:] + Seat[:focus.index] - for seat, attr in zip(order, ('BOTTOM', 'LEFT', 'TOP', 'RIGHT')): - setattr(self, attr, seat) - # TODO: set seat labels. + # Assumes Player elements are ordered clockwise from North. + order = Player[focus.index:] + Player[:focus.index] + for player, attr in zip(order, ('BOTTOM', 'LEFT', 'TOP', 'RIGHT')): + setattr(self, attr, player) + # TODO: set player labels. def set_trick(self, trick): @@ -241,18 +240,18 @@ self.LEFT : (0.425, 0.5), self.RIGHT : (0.575, 0.5), } if trick: - # The order of play is the leader, then clockwise around Seat. + # The order of play is the leader, then clockwise around Player. leader = trick[0] - order = Seat[leader.index:] + Seat[:leader.index] - for i, seat in enumerate(order): - id = 'trick-%s' % seat - old_card = self.trick and self.trick[1].get(seat) or None - new_card = trick[1].get(seat) + order = Player[leader.index:] + Player[:leader.index] + for i, player in enumerate(order): + id = 'trick-%s' % player + old_card = self.trick and self.trick[1].get(player) or None + new_card = trick[1].get(player) # If old card matches new card, take no action. if old_card is None and new_card is not None: surface, context = self.new_surface(self.card_width, self.card_height) self.draw_card(context, 0, 0, new_card) - self.add_item(id, surface, xy[seat], z_index=i+1) + self.add_item(id, surface, xy[player], z_index=i+1) elif new_card is None and old_card is not None: self.remove_item(id) elif old_card != new_card: @@ -261,8 +260,8 @@ self.update_item(id, surface, z_index=i+1) elif self.trick: # Remove all cards from previous trick. - for seat in self.trick[1]: - self.remove_item('trick-%s' % seat) + for player in self.trick[1]: + self.remove_item('trick-%s' % player) self.trick = trick # Save trick and return. @@ -273,14 +272,14 @@ The hand of the player on turn is drawn opaque; the other hands are drawn translucent. - @param turn: a member of Seat, or None. + @param turn: a member of Player, or None. """ if turn is None: return - for seat in Seat: - opacity = (seat is turn) and 1 or 0.5 - self.update_item('hand-%s' % seat, opacity=opacity) + for player in Player: + opacity = (player is turn) and 1 or 0.5 + self.update_item('hand-%s' % player, opacity=opacity) def button_press(self, widget, event): @@ -289,10 +288,10 @@ found_hand = False # Determine the hand which was clicked. - for seat in self.hands: - card_coords = self.hands[seat]['coords'] - surface = self.hands[seat]['surface'] - hand_x, hand_y = self.items['hand-%s' % seat]['area'][0:2] + for player in self.hands: + card_coords = self.hands[player]['coords'] + surface = self.hands[player]['surface'] + hand_x, hand_y = self.items['hand-%s' % player]['area'][0:2] if (hand_x <= event.x <= hand_x + surface.get_width()) and \ (hand_y <= event.y <= hand_y + surface.get_height()): found_hand = True @@ -302,11 +301,11 @@ # Determine the card in hand which was clicked. pos_x, pos_y = event.x - hand_x, event.y - hand_y # Iterate through visible cards backwards. - for i, card in self.hands[seat]['visible'][::-1]: + for i, card in self.hands[player]['visible'][::-1]: x, y = card_coords[i][1:] if (x <= pos_x <= x + self.card_width) and \ (y <= pos_y <= y + self.card_height): - self.on_card_clicked(card, seat) + self.on_card_clicked(card, player) break return True # Expected to return True. Modified: trunk/pybridge/pybridge/ui/window_bridgetable.py =================================================================== --- trunk/pybridge/pybridge/ui/window_bridgetable.py 2007-03-01 17:22:17 UTC (rev 359) +++ trunk/pybridge/pybridge/ui/window_bridgetable.py 2007-03-01 17:29:38 UTC (rev 360) @@ -1,5 +1,5 @@ # PyBridge -- online contract bridge made easy. -# Copyright (C) 2004-2006 PyBridge Project. +# Copyright (C) 2004-2007 PyBridge Project. # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License @@ -10,7 +10,7 @@ # 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, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. @@ -24,13 +24,9 @@ import utils from pybridge.bridge.call import Bid, Pass, Double, Redouble +from pybridge.bridge.symbols import Level, Strain, Player, Rank -# Enumerations. -from pybridge.bridge.call import Level, Strain -from pybridge.bridge.card import Rank -from pybridge.bridge.deck import Seat - # Translatable symbols for elements of bridge. CALLTYPE_SYMBOLS = {Pass : _('pass'), Double : _('dbl'), Redouble : _('rdbl') } @@ -51,8 +47,8 @@ Strain.Spade : u'\N{BLACK SPADE SUIT}', Strain.NoTrump : u'NT', } -SEAT_SYMBOLS = {Seat.North : _('North'), Seat.East : _('East'), - Seat.South : _('South'), Seat.West : _('West') } +SEAT_SYMBOLS = {Player.North : _('North'), Player.East : _('East'), + Player.South : _('South'), Player.West : _('West') } class WindowBridgetable(GladeWrapper): @@ -72,11 +68,11 @@ # Set up "Take Seat" menu. items = {} menu = gtk.Menu() - for seat in Seat: - items[seat] = gtk.MenuItem(SEAT_SYMBOLS[seat], True) - items[seat].connect('activate', self.on_seat_activated, seat) - items[seat].show() - menu.append(items[seat]) + for player in Player: + items[player] = gtk.MenuItem(SEAT_SYMBOLS[player], True) + items[player].connect('activate', self.on_seat_activated, player) + items[player].show() + menu.append(items[player]) self.takeseat.set_menu(menu) self.takeseat_items = items @@ -92,8 +88,8 @@ # Set up bidding history and column display. self.call_store = gtk.ListStore(str, str, str, str) self.biddingview.set_model(self.call_store) - for index, seat in enumerate(Seat): - title = SEAT_SYMBOLS[seat] + for index, player in enumerate(Player): + title = SEAT_SYMBOLS[player] column = gtk.TreeViewColumn(str(title), renderer, text=index) column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED) column.set_fixed_width(50) @@ -102,8 +98,8 @@ # Set up trick history and column display. self.trick_store = gtk.ListStore(str, str, str, str) self.trickview.set_model(self.trick_store) - for index, seat in enumerate(Seat): - title = SEAT_SYMBOLS[seat] + for index, player in enumerate(Player): + title = SEAT_SYMBOLS[player] column = gtk.TreeViewColumn(str(title), renderer, text=index) column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED) column.set_fixed_width(50) @@ -152,8 +148,8 @@ self.setTurnIndicator() for call in table.game.bidding.calls: - seat = table.game.bidding.whoCalled(call) - self.addCall(call, seat) + player = table.game.bidding.whoCalled(call) + self.addCall(call, player) self.setDealer(table.dealer) self.setVuln(table.game.vulnNS, table.game.vulnEW) @@ -165,9 +161,9 @@ # If playing, set trick counts. if table.game.playing: - for seat, cards in table.game.playing.played.items(): + for player, cards in table.game.playing.played.items(): for card in cards: - self.addCard(card, seat) + self.addCard(card, player) self.setTrickCount(table.game.getTrickCount()) # If user is a player and bidding in progress, open bidding box. @@ -180,7 +176,7 @@ self.takeseat_items[seat].set_property('sensitive', available) if player: self.event_playerAdded(table, player, seat) - else: # Seat vacant. + else: # Player vacant. self.event_playerRemoved(table, None, seat) # Initialise observer listing. @@ -238,8 +234,8 @@ def addScore(self, contract, made, score): textContract = self.getContractFormat(contract) textMade = '%s' % made - if contract['declarer'] in (Seat.North, Seat.South) and score > 0 \ - or contract['declarer'] in (Seat.East, Seat.West) and score < 0: + if contract['declarer'] in (Player.North, Player.South) and score > 0 \ + or contract['declarer'] in (Player.East, Player.West) and score < 0: textNS, textEW = '%s' % abs(score), '' else: textNS, textEW = '', '%s' % abs(score) @@ -374,7 +370,7 @@ widget.set_property('sensitive', True) # Reset player label. label = getattr(self, 'label_%s' % position.key.lower()) - label.set_markup('<i>%s</i>' % _('Seat vacant')) + label.set_markup('<i>%s</i>' % _('Player vacant')) # If we are not seated, ensure Take Seat is enabled. if not table.seated: Modified: trunk/pybridge/tests/gumby.py =================================================================== --- trunk/pybridge/tests/gumby.py 2007-03-01 17:22:17 UTC (rev 359) +++ trunk/pybridge/tests/gumby.py 2007-03-01 17:29:38 UTC (rev 360) @@ -1,7 +1,7 @@ #!/usr/bin/env python # PyBridge -- online contract bridge made easy. -# Copyright (C) 2004-2006 PyBridge Project. +# Copyright (C) 2004-2007 PyBridge Project. # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License @@ -12,7 +12,7 @@ # 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, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. @@ -47,8 +47,7 @@ from pybridge.network.client import client from pybridge.bridge.call import Bid, Double, Redouble, Pass -from pybridge.bridge.call import Level, Strain -from pybridge.bridge.deck import Seat +from pybridge.bridge.symbols import Level, Strain # Give the bot some "personality". Modified: trunk/pybridge/tests/test_bidding.py =================================================================== --- trunk/pybridge/tests/test_bidding.py 2007-03-01 17:22:17 UTC (rev 359) +++ trunk/pybridge/tests/test_bidding.py 2007-03-01 17:29:38 UTC (rev 360) @@ -3,12 +3,9 @@ from pybridge.bridge.bidding import Bidding from pybridge.bridge.call import Bid, Pass, Double, Redouble +from pybridge.bridge.symbols import Level, Player, Strain -# Enumerations. -from pybridge.bridge.call import Level, Strain -from pybridge.bridge.deck import Seat - class TestBidding(unittest.TestCase): @@ -16,9 +13,8 @@ bids = [Bid(l, s) for l in Level for s in Strain] - def setUp(self): - dealer = random.choice(Seat) + dealer = random.choice(Player) self.bidding = Bidding(dealer) @@ -30,13 +26,13 @@ """getCurrentCall""" for calltype in [Bid, Pass, Double, Redouble]: self.assertEqual(self.bidding.getCurrentCall(calltype), None) - + for call, calltype in [(Pass(), Pass), (Bid(Level.One, Strain.Club), Bid), (Double(), Double), (Redouble(), Redouble)]: self.assertEqual(self.bidding.getCurrentCall(calltype), None) self.bidding.makeCall(call) self.assertEqual(self.bidding.getCurrentCall(calltype), call) - + # A bid should clear types Pass, Double, Redouble. bid = Bid(Level.One, Strain.Diamond) self.bidding.makeCall(bid) @@ -48,11 +44,11 @@ def testWhoseTurn(self): """whoseTurn""" # Tests whoseTurn() before and after making calls. - turn = Seat[self.bidding.dealer.index] + turn = Player[self.bidding.dealer.index] for call in self.bids: self.assertEqual(self.bidding.whoseTurn(), turn) self.bidding.makeCall(call) - turn = Seat[(turn.index + 1) % 4] + turn = Player[(turn.index + 1) % 4] self.assertEqual(self.bidding.whoseTurn(), turn) @@ -61,8 +57,6 @@ pass - - def main(): suite = unittest.makeSuite(TestBidding) unittest.TextTestRunner(verbosity=2).run(suite) Modified: trunk/pybridge/tests/test_playing.py =================================================================== --- trunk/pybridge/tests/test_playing.py 2007-03-01 17:22:17 UTC (rev 359) +++ trunk/pybridge/tests/test_playing.py 2007-03-01 17:29:38 UTC (rev 360) @@ -4,19 +4,16 @@ from pybridge.bridge.card import Card from pybridge.bridge.deck import Deck from pybridge.bridge.playing import Playing +from pybridge.bridge.symbols import Player, Rank, Suit -# Enumerations. -from pybridge.bridge.card import Suit -from pybridge.bridge.deck import Seat - class TestPlaying(unittest.TestCase): def setUp(self): - decl... [truncated message content] |