Beispiel #1
0
class MaexchenBot:
    def __init__(self, server_ip="127.0.0.1", server_port=9000, name=random_bot_name()):
        self.name = name
        self.watcher = None
        signal.signal(signal.SIGINT, self.signal_handler)
        self.kommunikator = UdpKommunikator(server_ip=server_ip, server_port=server_port)

    def warte_auf_nachricht(self):
        try:
            (nachricht, parameter) = self.kommunikator.warte_auf_nachricht()
        except socket.error:
            print("Der Server", self.kommunikator.server_adresse(), "antwortet nicht. Bot wird beendet.")
            sys.exit(-1)

        print("<---- ", nachricht, parameter)
        return (nachricht, parameter)

    def starte(self, automatisch_mitspielen=True, beobachte_herzschlag=True):
        if beobachte_herzschlag:
            self.restart_heartbeat_watcher()
        self.melde_dich_an(automatisch_mitspielen, beobachte_herzschlag)

    def restart_heartbeat_watcher(self):
        if self.watcher is not None:
            self.watcher.cancel()
        self.watcher = Timer(5.0, self.kein_server_herzschlag_mehr)
        self.watcher.start()

    def kein_server_herzschlag_mehr(self):
        self.kommunikator.close()

    def melde_dich_an(self, automatisch_mitspielen, beobachte_herzschlag):
        self.schicke_nachricht(Nachrichten.ANMELDEN, [self.name])
        (antwort, parameter) = self.warte_auf_nachricht()
        if (antwort == Nachrichten.ANGEMELDET):
            self.starte_spiel(automatisch_mitspielen, beobachte_herzschlag)
        else:
            print("Ich konnte mich nicht registrieren.", "Grund: " + antwort + str(parameter))

    def schicke_nachricht(self, nachricht, nachrichten_parameter=[]):
        if not isinstance(nachrichten_parameter, (list, tuple)):
            raise Exception("'nachrichten_parameter' muss eine Liste oder ein Tupel sein!")
        print("----> ", nachricht, nachrichten_parameter)
        self.kommunikator.sende_nachricht(nachricht, nachrichten_parameter)

    def starte_spiel(self, automatisch_mitspielen, handle_heartbeat):
        while (True):
            nachricht, parameter = self.warte_auf_nachricht()
            if handle_heartbeat and nachricht == Nachrichten.SERVER_HERZSCHLAG:
                self.restart_heartbeat_watcher()
            if automatisch_mitspielen:
                if (nachricht == Nachrichten.MACHST_DU_MIT):
                    token = parameter[-1]
                    self.schicke_nachricht(Nachrichten.ICH_MACHE_MIT, [token])
                else:
                    self.reagiere_auf_nachricht(nachricht, parameter)
            else:
                self.reagiere_auf_nachricht(nachricht, parameter)

    def reagiere_auf_nachricht(self, kommando, parameter):
        pass

    def signal_handler(self, signal, frame):
        self.reagiere_auf_stopp()
        sys.exit()

    def reagiere_auf_stopp(self):
        self.schicke_nachricht(Nachrichten.ABMELDEN)

    def zerlege_wuerfel_string(self, wuerfel_string):
        list_of_wuerfel = wuerfel_string.split(',')
        return [int(augenzahl) for augenzahl in list_of_wuerfel]

    def fuege_wuerfel_zusammen(self, wuerfel):
        gewuerfelte_augen_als_strings = [str(wuerfel) for wuerfel in wuerfel]
        return ','.join(gewuerfelte_augen_als_strings)

    def ist_hoeher(self, wuerfel_1, wuerfel_2):
        if self.ist_maexchen(wuerfel_1):
            return True
        if self.ist_maexchen(wuerfel_2):
            return False

        if self.ist_pasch(wuerfel_1):
            if not self.ist_pasch(wuerfel_2):
                return True
        if self.ist_pasch(wuerfel_2):
            if not self.ist_pasch(wuerfel_1):
                return False

        return wuerfel_1 > wuerfel_2

    def ist_maexchen(self, wuerfel):
        return wuerfel == [2, 1]

    def ist_pasch(self, wuerfel):
        return wuerfel[0] == wuerfel[1]
Beispiel #2
0
 def __init__(self, server_ip="127.0.0.1", server_port=9000, name=random_bot_name()):
     self.name = name
     self.watcher = None
     signal.signal(signal.SIGINT, self.signal_handler)
     self.kommunikator = UdpKommunikator(server_ip=server_ip, server_port=server_port)
Beispiel #3
0
from udp_kommunikator import UdpKommunikator


def sende_und_empfange_echo(message):
    maexchen.sende_nachricht("ECHO", [message])
    (kommando, paramter) = maexchen.warte_auf_nachricht()

    print("Kommando erhalten:", kommando)
    print("   mit Parametern:", paramter)


udp_ip = "127.0.0.1"
udp_port = 9000

maexchen = UdpKommunikator(server_ip=udp_ip, server_port=udp_port)

for index in range(10):
    sende_und_empfange_echo("Hallo: " + str(index))