IIC2233 / syllabus-2019-1

Repositorio oficial del curso IIC2233 Programación Avanzada 🎉 🎊
43 stars 69 forks source link

Duda clase turno #606

Closed bpeirano1 closed 5 years ago

bpeirano1 commented 5 years ago

Hola! Hice una clase Partida para poder controlar los turnos de mi juego, esta clase hereda de threading.Thread y esta se instancia dentro de mi clase servidor. Quería saber como podía conectar el método del servidor servidor.send() con las acciones realizadas por la clase Partida ( al final que mi clase Partida pueda utilizar el metodo servidor.send()), ya que no puedo usar pyqt5.QtCore.pyqtSignal porque no estoy trabajando en una ventana (ya traté esto y me salió context error) y tampoco se si le puedo pasar como parametro servidor.send() a mi clase Partida, porque se podría tomar como moderación circular.

lily416 commented 5 years ago

Puedes hacer que el Servidor llame a la función de Partida y que esta le retorne lo que debes mandar mediante el send(), me refiero a algo como esto:

class Servidor:
    def __init__(self):
        # Toda la información necesaria
        self.partida = Partida()

    def jugada(self, socket, acción):
        # Le pasas la acción a la paridad y esta te retorna el mensaje que debes enviar
        resultado = self.paridad.jugada(acción)
        self.send(socket, resultado)

Ojalá te sea de ayuda. Ánimo y éxito con la tarea 👋 💪

jitorcas commented 5 years ago

@lily416 Hola!, Tengo un problema parecido, el mío está en que cuando inician un juego, creo una instancia de un Thread asociado a una función de mi clase Servidor (la cual solo simula los turnos) y cuando un jugador encierra un cuadrado no tengo cómo enviar una señal a ese Thread para que re inicie el contador del cliente que está jugando (ya que si lo hago esperar una señal no ejecutaría el ciclo del juego). He pensando en tres caminos para resolver la situación:

  1. Tener un método que haga que deje de escuchar al cliente por la función principal y seguir escuchando en la función del juego, pero eso me generaría estar escuchando a múltiples clientes desde la función del juego y creo que me generaría más de un problema.
  2. No instanciar el Thread y usar threading.timer asociado a una función que envíe un mensaje de cambio de turno a los clientes, pero de igual forma necesitaría un función actúese como simulador de turnos, y necesitaría enviar la señal de que completo un cuadrado lo que me lleva a mi problema principal.
  3. Tener una clase simuladora del juego, y que tenga un método que esté simulando el juego, con threading.timer ejecutar la función dentro de mi servidor que envié el mensaje de cambio de turno, pero tendría la instancia de mi clase servidor en la clase simuladora del juego lo que seria modelación circular. La verdad es que me falta solo reiniciar el contador para poder simular todo el juego de manera correcta y lo he pensado bastante pero no veo una solución factible que no cambie todo mi código. Saludos!
lily416 commented 5 years ago

@jitorcas Podrías tratar de reiniciar el Thread cada vez que se realice una jugada válida, buscando cómo volver a iniciar el tiempo o sino sobre escribiendo el Thread (volviendo a guardar en la misma variable otra instancia de Thread y conectandola con la misma función).

No estoy segura de si es la mejor solución o la más recomendada, pero es lo primero que se me ocurre tomando en cuenta que pronto se acaba el tiempo para responder issues. 😖 Te recomiendo buscar en internet lo que han hecho otras personas con respecto al tema, en general en StackOverflow siempre hay soluciones a la mayoría de los problemas que se les pueden presentar.

Saludos y éxito con la tarea 👋 💪