Это мой первый раз при переполнении стека, поэтому я сожалею, если формат не подходит с сайта. Я только недавно начал изучать программирование, с тех пор прошло почти 2 недели. Я изучаю python из http://openbookproject.net/thinkcs/python/english3e/index.html, и до сих пор все было довольно хорошо, где я просто застрял часами. Я много искал, но не смог найти правильное решение моей проблемы, так что я здесь.
Я пытаюсь запустить OldMaidGame() без проблем, как описано в CH17. http://openbookproject.net/thinkcs/python/english3e/ch17.html - Большая часть кода также поступает из предыдущей главы.
Что я выяснил, я не могу заставить Deck.remove, Hand.remove_matches или любую другую функцию удаления работать. После некоторой отладки я узнал что проблема возникает, когда программа проверяет, присутствует ли данная карта в колоде/руке/и т.д. Он никогда не сможет сделать матч. Затем после некоторого оглядки на глава (в ch16), я узнал, что "если карта в палубе/рука/etc: remove (card)" и т.д. ищет объект cmp() объекта, чтобы определить, фактически существует в колоде/руке/и т.д. Это моя версия 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 a tie
return 0
Сам cmp кажется прекрасным afaik, из чего я мог бы использовать несколько советов о том, как сделать его лучше (например, с проверкой туза). Поэтому я понятия не имею, почему карта в колоде/ручном проверке всегда возвращает 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 не в списке). Еще один наш или около того, я, возможно, тоже смог сделать эту работу, но поскольку он уже чувствует, что я на неправильной дороге, так как я не могу исправить оригинальную "карточку в колоде/руке/etc" и т.д., Я пришел сюда, чтобы найти ответы/советы.
Спасибо за чтение, и я очень признателен за любую помощь, которую вы можете дать:)
--------------------- EDIT 1 * >
Это мой текущий код: http://pastebin.com/g77Y4Tjr
--------------------- EDIT 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
>>>
Я также пробовал использовать card.py @DSM успешно, и я тоже там получаю ошибки, например, в функции сортировки он говорит, что не может сравнить два объекта карты.
Поэтому мне было интересно, может быть, это проблема с Python 3.2, или, возможно, синтаксис где-то изменился?