PDA

View Full Version : [Python] comparison did not return an int


Heretic Curse
11-05-2013, 13:20
Sono sempre io :)
# !/usr/bin/env python
# -*- coding: iso-8859-15 -*-

import random

class Carta:

ListaSemi = ["Fiori", "Quadri", "Cuori", "Picche"]
ListaRanghi = ["impossibile", "Asso", "2", "3", "4", "5", "6", \
"7", "8", "9", "10", "Jack", "Queen", "King"]

def __init__(self, Seme = 0, Rango = 0):
self.Rango = Rango
self.Seme = Seme

def __str__(self):
return str(self.ListaRanghi[self.Rango]) + " di " + str(self.ListaSemi[self.Seme])

def __cmp__(self, Altro):
if self.Seme > Altro.Seme: return 1
if self.Seme < Altro.Seme: return -1

if self.Rango == 1 and self.Rango != Altro.Rango: return 1
if self.Rango > Altro.Rango: return 1
if self.Rango < Altro.Rango: return -1

class Mazzo:

def __init__(self):
self.Carte = []
for Seme in range(4):
for Rango in range(1, 13):
self.Carte.append(Carta(Seme, Rango))

def __str__(self):
s = ""
for i in range(len(self.Carte)):
s = s + " "*i + str(self.Carte[i]) + "\n"
return s

def Mescola(self):
NumCarte = len(self.Carte)
for i in range(NumCarte):
j = random.randrange(i, NumCarte)
x = 0
self.Carte[x] = self.Carte[i]
self.Carte[i] = self.Carte[j]
self.Carte[j] = self.Carte[x]



def RimuoviCarte(self, Carta):
if Carta in self.Carte:
self.Carte.remove(Carta)
return 1
else:
return 0

def PrimaCarta(self):
return self.Carte.pop()

def EVuoto(self):
return (len(self.Carte) == 0)

def Distribuisci(self, ListaMani, NumCarte=999):
NumMani = len(ListaMani)
for i in range(NumCarte):
if self.EVuoto(): break
Carta = self.PrimaCarta()
Mano = ListaMani[i%NumMani]
Mano.AggiungeCarta(Carta)


class Mano(Mazzo):

def __init__(self, Nome=""):
self.Carte = []
self.Nome = Nome

def __str__(self):
s = "La mano di " + self.Nome
if self.EVuoto():
s = s + " è vuota\n"
else:
s = s + " contiene tali carte:\n"
return s + Mazzo.__str__(self)

def AggiungeCarta(self, Carta):
self.Carte.append(Carta)

class GiocoDiCarte:
def __init__(self):
self.Mazzo = Mazzo()
self.Mazzo.Mescola()

class ManoOldMaid(Mano):

def RimuoveCoppie(self):
Conteggio = 0
CarteOriginali = self.Carte[:]
for CartaOrig in CarteOriginali:
CartaDaCercare = Carta(3-CartaOrig.Seme, CartaOrig.Rango)
if CartaDaCercare in self.Carte:
self.Carte.remove(CartaOrig)
self.Carte.remove(CartaDaCercare)
print "Mano di %s : %s elimina %s" % (self.Nome, CartaOrig, CartaDaCercare)
Conteggio = Conteggio + 1
return Conteggio

Partita = GiocoDiCarte()
Mano1 = ManoOldMaid("Volpio")
Partita.Mazzo.Distribuisci([Mano1], 13)
print Mano1
Mano1.RimuoveCoppie()

Errore:File "/home/meurem/Scrivania/untitled.py", line 103, in RimuoveCoppie
if CartaDaCercare in self.Carte
Traceback (most recent call last):
File "/home/meurem/Scrivania/untitled.py", line 114, in <module>
Mano1.RimuoveCoppie()
File "/home/meurem/Scrivania/untitled.py", line 103, in RimuoveCoppie
if CartaDaCercare in self.Carte:
TypeError: comparison did not return an int

Questi ultimi capitoli di "Pensare in Python" mi stanno dando un po' di problemi :/ inoltre sul libro ala terzultima riga veniva utilizzato il metodo Mescola anziché Distribuisci. L'argomento tuttavia era lo stesso, quindi era palesemente un errore del testo :D

Tuttavia il mio problema rimane quello della riga 103 (e l'annessa riga 114). Nemmeno googoland ho trovato un soluzione :(

cdimauro
11-05-2013, 20:21
Hai definito __cmp__, ma NON restituisce sempre un intero in tutti i casi. Infatti se nessuna condizione viene soddisfatta, restituisce None, e dunque ottieni quell'eccezione.

P.S. Ti scongiuro, usa almeno due spazi per l'indentazione. :cry:

Heretic Curse
12-05-2013, 09:34
haha che poco sveglio che sono! Inizialmente quando scrissi quel metodo sul terminale misi un return 0 alla fine, ma mi sono dimenticato di trascriverlo quando ho passato il codice su Sublime Text 2 :D grazie mille.

Per quel che riguarda l''indentazione ok, da ora metterò più spazi.

GByTe87
12-05-2013, 10:16
Per quel che riguarda l''indentazione ok, da ora metterò più spazi.

Vai di 4, che è (quasi) lo standard :D

cdimauro
12-05-2013, 10:37
Io sono un po' fuori standard: ne uso due. :stordita:

GByTe87
12-05-2013, 11:31
Io sono un po' fuori standard: ne uso due. :stordita:

I (quasi) standard servono a questo :D