スタック オーバーフローは初めてなので、フォーマットがサイトに合わない場合は申し訳ありません。最近プログラミングを始めたばかりで、2週間ほど経ちました。私はhttp://openbookproject.net/thinkcs/python/english3e/index.htmlから python を学ん でいますが、今まではすべてがうまくいっていて、何時間も立ち往生していました。私はたくさんグーグルで検索しましたが、私の問題に対する適切な解決策を見つけることができなかったので、ここにいます.
CH17 で説明されているように、問題なく OldMaidGame() を実行しようとしています。http://openbookproject.net/thinkcs/python/english3e/ch17.html - ほとんどのコードも前の章からのものです。
私が見つけたのは、Deck.remove、Hand.remove_matches、またはその他の種類の削除機能を機能させることができないということです。いくつかのデバッグの後、プログラムが特定のカードがデッキ/ハンド/その他に存在するかどうかをチェックするときに問題が発生することがわかりました。それは決して一致することはできません。その後、チャプター(ch16)を振り返ってみると、「デッキ/ハンド/etcの場合:remove(カード)」などが. オブジェクトのcmp () を呼び出して、カードが実際にデッキ/手札などに存在するかどうかを判断します。これは、電子書籍の指定されたコードに 'ace's を追加した後の私のバージョンのcmpです。
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自体はうまくいっているようですが、それを改善する方法についていくつかのヒントを使用できます(エースチェックなど)。したがって、デッキ/ハンド チェックでカードが常に 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 not in list) が表示されました。別の私たちかそこらで、私もそれを機能させることができたかもしれませんが、元の「デッキ/手札/その他のカード」などを修正できないため、間違った道を進んでいるような気がするので、私はいくつかの答え/ヒントを探してここに来ました。
読んでいただきありがとうございます。
--------------------- 編集 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 も試してみましたが、そこでもエラーが発生します。たとえば、並べ替え関数で 2 つのカード オブジェクトを比較できないと表示されます。
だから私は疑問に思っていました.Python 3.2に問題があるのでしょうか、それとも構文がどこかで変更されたのでしょうか?