这是我第一次在stackoverflow上,如果格式不太适合该网站,请见谅。我最近才开始学习编程,差不多已经过去了两个星期。我正在从http://openbookproject.net/thinkcs/python/english3e/index.html学习Python,一切都很好,直到现在,我卡了几个小时。
我谷歌过很多,但找不到一个合适的解决方案来解决我的问题,所以我来到这里。
我尝试让OldMaidGame()按照CH17的说明运行而没有问题。http://openbookproject.net/thinkcs/python/english3e/ch17.html-大部分代码也来自前一章节。
我发现无法使Deck.remove、Hand.remove_matches或任何其他类型的remove函数正常工作。经过一些调试,我发现当程序检查给定卡是否存在于牌组/手牌等中时出现问题。它永远无法匹配。然后,在回顾了一下第16章后,我发现“if card in deck/hand/etc: remove(card)”等会查找对象的.cmp(),以确定卡片是否实际存在于牌组/手牌等中。这是我根据电子书中的代码添加“ace”的版本。
def __cmp__(self, other):
""" Compares cards, returns 1 if greater, -1 if lesser, 0 if equal """
# check the suits
if self.suit > other.suit: return 1
if self.suit < other.suit: return -1
# suits are the same... check ranks
# check for aces first.
if self.rank == 1 and other.rank == 1: return 0
if self.rank == 1 and other.rank != 1: return 1
if self.rank != 1 and other.rank == 1: return -1
# check for non-aces.
if self.rank > other.rank: return 1
if self.rank < other.rank: return -1
# ranks are the same... it's a tie
return 0
cmp 本身看起来没问题,当然我可能需要一些关于如何改进它的技巧(例如使用ace checks)。 所以我不知道为什么牌组/手牌中的卡牌检查总是返回 false。 这是给定的移除函数:
class Deck:
...
def remove(self, card):
if card in self.cards:
self.cards.remove(card)
return True
else:
return False
我拼命尝试让它工作,最终得出了以下代码:
class Deck:
...
def remove(self, card):
""" Removes the card from the deck, returns true if successful """
for lol in self.cards:
if lol.__cmp__(card) == 0:
self.cards.remove(lol)
return True
return False
看起来很正常,直到我转向其他不起作用的删除函数:
class OldMaidHand(Hand):
def remove_matches(self):
count = 0
original_cards = self.cards[:]
for card in original_cards:
match = Card(3 - card.suit, card.rank)
if match in self.cards:
self.cards.remove(card)
self.cards.remove(match)
print("Hand {0}: {1} matches {2}".format(self.name, card, match))
count = count + 1
return count
我再次进行了一些调整:
class OldMaidHand(Hand):
def remove_matches(self):
count = 0
original_cards = self.cards[:]
for card in original_cards:
match = Card(3 - card.suit, card.rank)
for lol in self.cards:
if lol.__cmp__(match) == 0:
self.cards.remove(card)
self.cards.remove(match)
print("Hand {0}: {1} matches {2}".format(self.name, card, match))
count = count + 1
return count
移除卡牌的操作没有问题,但是当我尝试移除匹配项时会出现错误(x不在列表中)。或许再花一两个小时也能解决这个问题,但由于已经感觉自己走错了路,因为无法修复原始的“牌在牌堆/手牌等中”的问题,所以我来到这里寻求一些答案/提示。
谢谢阅读,非常感谢你能给予任何帮助 :)
--------------------- 编辑 1 *>
这是我的当前代码: http://pastebin.com/g77Y4Tjr
--------------------- 编辑 2 *>
我已经尝试了这里提供的每一个cmp,但仍然无法使用“in”找到卡牌。
>>> a = Card(0, 5)
>>> b = Card(0, 1)
>>> c = Card(3, 1)
>>> hand = Hand('Baris')
>>> hand.add(a)
>>> hand.add(b)
>>> hand.add(c)
>>> d = Card(3, 1)
>>> print(hand)
Hand Baris contains
5 of Clubs
Ace of Clubs
Ace of Spades
>>> d in hand.cards
False
>>>
我也尝试了@DSM使用成功的card.py,但在那里也出现了错误,例如在sort函数处,它说它无法比较两个卡对象。
所以我想知道,也许这是Python 3.2的问题,或者语法在某些地方发生了变化?