Foros del Web » Programando para Internet » Python »

Seguir utilizando una instancia

Estas en el tema de Seguir utilizando una instancia en el foro de Python en Foros del Web. Buenas noches a todos! Me he encontrado con un problema a la hora de resolver un ejercicio para la facultad, y espero que pudan ayudarme ...
  #1 (permalink)  
Antiguo 12/06/2009, 16:52
 
Fecha de Ingreso: septiembre-2008
Ubicación: Nuñez, Capital Federal
Mensajes: 423
Antigüedad: 16 años, 2 meses
Puntos: 1
Seguir utilizando una instancia

Buenas noches a todos!

Me he encontrado con un problema a la hora de resolver un ejercicio para la facultad, y espero que pudan ayudarme con un problemita que tengo.

La cuestion es la siguiente: yo tengo un campeonato de Piedra, papel o tijera, donde cada jugador hereda de una clase jugador generica, y lo que se hace es cambiar su atributo nombre y su estrategia de juego (si metodo jugar).

La cosa es la siguiente: el enunciado dice que si se juega mas de un campeonato, debe hacerse con la misma instancia de cada jugador todos los campeonatos. Entonces, mi duda surge ahi:

Si por ejemplo, para jugar 1 campeonato, yo hago:

Código:
mod_jugadores = sys.argv[2:]
n_campeonatos = sys.argv[1]
c_jugadores =  Cola()

def _init_jugadores(l_modulos,c_jugadores):
   "importa el nombre de los modulos contenidos en la lista y encola \
   las intancias de los jugadores en una cola pasada como segundo parametro"
   for _mod in l_modulos:
      print _mod
      j_mod = __import__(_mod)
      jx = j_mod.JugadorPPT()
      c_jugadores.encolar(jx)
Y para jugar el campeonato hago (falta el codigo del campeonato, pero creo que no hace a la pregunta):

Código:
_init_jugadores(mod_jugadores,c_jugadores)
winer = campeonato(c_jugadores)
print "el ganador del campeonato es %s" % (winer.nombre)
Ahora, si yo quiero correr x campeonatos, yo haria:

Código:
ganadores={}
for x in range(int(n_campeonatos)):
    _init_jugadores(mod_jugadores,c_jugadores)
    winer = campeonato(c_jugadores)
    print "el ganador del %d campeonato es %s" % (x+1,winer.nombre)
    if winer.nombre in ganadores:
        ganadores[winer.nombre] +=1
    else:
        ganadores[winer.nombre] = 1
De esa forma, jugaria x campeontaos y al final tendria guardado en un diccionario la cantidad de torneos que ganó cada jugador. La duda, entonces, me surge si yo al hacer el
_init_jugadores(mod_jugadores,c_jugadores)
por cada vez que me lo pida el for, estoy creando una nueva instancia del jugador y,por ende, esta mal lo que estoy haciendo, o esta bien como lo estoy aplicando y sirve el codigo.

Si esta mal, no se me ocurre como hacer, pq si lo dejo fuera del for el _init_jugadores(mod_jugadores,c_jugadores) al jugar el segundo campeonato, no tiene jugadores en la cola, ya que fueron desencolados en el primer campeonato. Alguna pista para este problema??

Nota: el sistema del campeonato funciona de la siguiente forma: encola todas las instancias, luego agarra las 2 primeras y juegan entre si. Al ganador, lo vuelve a encolar, y asi hasta que en la cola queda un solo jugador, que es el ganador del torneo. Esta aclaracion es por si no entienden qué es lo que me ocurre en el segundo campeonato (y en los posteriores tmb) cuando digo que la cola esta vacia.

GRACIAS!!

Pablo.

ACLARACION 2: Los jugadores estan en modulos separados, por eso se hace el __import__(modulo). Gracias!

Última edición por locoxchacho; 12/06/2009 a las 16:53 Razón: Aclaracion
  #2 (permalink)  
Antiguo 13/06/2009, 12:31
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Seguir utilizando una instancia

Ya que llamas a init_jugadores en cada "vuelta", creo que sí estás creando nuevos objetos cada vez. De todas formas podrías comprobarlo conservando alguno de los jugadores de la "vuelta" anterior y comparando con el operador de igual (=) que solamente dará verdadero si los objetos son el mismo (que no es lo mismo que decir que son objetos diferentes con iguales valores es sus atributos).

Yo creo que no necesitas una cola de jugadores. Simplemente ármate una tupla (o una lista, la diferencia es que la tupla es inmutable) de jugadores, y luego al jugar el campeonato recórrela con un for.

Algo así:

Código python:
Ver original
  1. def campeonato(tupla_jugadores):
  2.     ganador = None
  3.  
  4.     for jugador in tupla_jugadores:
  5.         ganador = juego(ganador, jugador)
  6.  
  7.     return ganador

Así no hay necesidad de recrear la tupla de jugadores cada vez y el código de la función juego se encarga de decidir quién gana, siempre entre dos jugadores. Lo que esta función devuelve es el objeto que representa al jugador ganador. Deberá hacerse cargo del caso en el que ganador es None, pero eso es simplemente agregar una excepción.


Saludos.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:45.