esta es mi primera vez en desbordamiento de pila así que lo siento si el formato no encaja del todo bien con el sitio. Recientemente empecé a aprender programación, han pasado casi 2 semanas desde entonces. Estoy aprendiendo Python desde http://openbookproject.net/thinkcs/python/english3e/index.html y todo había sido bastante agradable hasta ahora, donde me quedé atrapado durante horas. Busqué en Google pero no pude encontrar una solución adecuada a mi problema, así que aquí estoy.Python: 'objeto en la lista de' controles y rebosadero '__cmp__'
Estoy intentando conseguir el JuegoDeLaMona() funcionar sin problemas como se explica en CH17. - La mayoría del código también proviene del capítulo anterior.
Lo que he descubierto es que no puedo conseguir los Deck.remove, Hand.remove_matches, o cualquier otro tipo de función Remove para trabajar. Después de algunas depuraciones descubrí que el problema ocurre cuando el programa comprueba si la tarjeta dada está presente en el mazo/mano/etc. No puede hacer una coincidencia. A continuación, después de algún mirando hacia atrás en el capítulo , (en CH16), descubrí que 'si la tarjeta en la cubierta/de la mano/etc: eliminar (tarjeta)', etc busca el. cmp() del objeto para determinar si la tarjeta existe realmente en el mazo/mano/etc. Esta es mi versión de la cmp después de hacer las adiciones de 'de As en el código dado desde el libro electrónico.
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
El cmp en sí parece muy bien que yo sepa, OFC que podría utilizar algunos consejos sobre cómo hacer que sea mejor (como con cheques as). Así que no tengo idea de por qué la tarjeta en el mazo/cheque siempre devuelve falso. Esta fue la función Remove dado:
class Deck:
...
def remove(self, card):
if card in self.cards:
self.cards.remove(card)
return True
else:
return False
Tratando desesperadamente de conseguir que funcione, se me ocurrió esto:
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
parecía funcionar bien, hasta que pasé a la otra no que trabajan quitar funciones:
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
me volvieron a hacer algunos ajustes:
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
la remoción funcionó bien para la tarjeta, pero le daría un error (x no está en la lista) cuando intenté quitar partido. Otro nuestro más o menos, podría haber sido capaz de hacer ese trabajo también, pero ya que parece que estoy en el camino equivocado ya que no puedo arreglar la "tarjeta original en cubierta/mano/etc.", etc. vino aquí en busca de algunas respuestas/consejos.
Gracias por leer y aprecio enormemente cualquier ayuda que puede dar :)
--------------------- EDIT 1 *>
Este es mi código actual: http://pastebin.com/g77Y4Tjr
--------------------- EDIT 2 * >
que he probado cada uno cmp aconsejados aquí, y todavía no puedo encontrar una tarjeta con '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
>>>
También he probado la @DSM card.py ha utilizado con éxito, y tengo errores allí también, al igual que en la función de clasificación que dice que no puede comparar las dos tarjetas de objetos.
Entonces, me preguntaba, tal vez sea un problema con Python 3.2, ¿o tal vez la sintaxis ha cambiado en alguna parte?
+1 para decidir a aprender Python! –
¿Estás seguro de que en realidad hay cartas en la baraja? –
@ Space_C0wb0y Sí, todo lo demás funciona bien. No publiqué todo el programa, ya que no estaba seguro de si sería apropiado en este sitio, y ya que se puede encontrar en el libro electrónico que he vinculado. Lo único que falla es el control 'in'. Incluso si solo creo manualmente una baraja/mano vacía, agrego 1-2 cartas, y trato de verificar si el programa reconoce alguna de ellas, falla. – Ulquiomaru