это мой первый раз при переполнении стека, поэтому извините, если формат не совсем подходит для сайта. Я только недавно начал изучать программирование, прошло почти 2 недели. Я изучаю Python из http://openbookproject.net/thinkcs/python/english3e/index.html , и до сих пор все было довольно хорошо, когда я просто застрял на несколько часов. Я много гуглил, но не смог найти правильного решения моей проблемы, так что я здесь.
Я пытаюсь запустить OldMaidGame () без проблем, как описано на канале 17. http://openbookproject.net/thinkcs/python/english3e/ch17.html - Большая часть кода также взята из предыдущей главы.
Я обнаружил, что я не могу заставить работать Deck.remove, Hand.remove_matches или любую другую функцию удаления. После некоторой отладки я узнал что проблема возникает, когда программа проверяет, присутствует ли данная карта в колоде / руке / и т. д. Это никогда не может сравниться. Затем, оглянувшись на в главе (в главе 16) я обнаружил, что «if card in deck / hand / 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's a tie
return 0
Сам cmp кажется прекрасным afaik, конечно, я мог бы использовать несколько советов, как сделать это лучше (например, с чеками с тузом). Поэтому я понятия не имею, почему карта в проверках колоды / руки всегда возвращает ложь. Это была данная функция удаления:
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 * >
I Я пробовал каждый 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, или, может быть, синтаксис где-то изменился?