def decide(self, info: GameData) -> str:
        print("Kopf ist bei ", info.head_x, " / ", info.head_y)
        print("Abstand zur Wand im Norden: ", info.walldistance_n)

        # Versuche näher zum Futter zu kommen
        if info.food_x < info.head_x:
            # Eigentlich return "west"
            # Aber lass mal vorher prüfen, ob das überhaupt geht
            if info.can_move_to(info.head_x - 1, info.head_y):
                return "west"
        if info.food_x > info.head_x:
            #Eigentlich return "east"
            if info.can_move_to(info.head_x + 1, info.head_y):
                return "east"
        if info.food_y < info.head_y:
            #Eigentlich return "north"
            if info.can_move_to(info.head_x , info.head_y - 1):
                return "north"
        if info.food_y > info.head_y:
            #Eigentlich return "south"
            if info.can_move_to(info.head_x , info.head_y + 1):
                return "south"

        # Die Schlange konnte nicht in Richtung Futter laufen, weil der Weg dorthin blockiert war
        # Daher: irgendeinen Weg suchen, wo man hinlaufen kann
        #if info.can_move_to(info.head_x - 1, info.head_y):
        #    return "west"
        #if info.can_move_to(info.head_x + 1, info.head_y):
        #    return "east"
        #if info.can_move_to(info.head_x, info.head_y - 1):
        #    return "north"
        #if info.can_move_to(info.head_x, info.head_y + 1):
        #    return "south"

        for max_distance in range(5, 0, -1):
            can_walk_north = True
            can_walk_east = True
            can_walk_south = True
            can_walk_west = True
            for distance in range(1, max_distance + 1):
                if not info.can_move_to(info.head_x - distance, info.head_y):
                    can_walk_west = False
                if not info.can_move_to(info.head_x + distance, info.head_y):
                    can_walk_east = False
                if not info.can_move_to(info.head_x, info.head_y - distance):
                    can_walk_north = False
                if not info.can_move_to(info.head_x, info.head_y + distance):
                    can_walk_south = False
            if can_walk_west:
                return "west"
            if can_walk_east:
                return "east"
            if can_walk_north:
                return "north"
            if can_walk_south:
                return "south"

        # Nix gefunden? Dann hab ich mich wohl eingezingelt
        return "straight"
    def decide(self, info: GameData) -> str:
        if info.head_x < info.food_x:
            if info.can_move_to(info.head_x + 1, info.head_y):
                return "east"
        if info.head_x > info.food_x:
            if info.can_move_to(info.head_x - 1, info.head_y):
                return "west"
        if info.head_y < info.food_y:
            if info.can_move_to(info.head_x, info.head_y + 1):
                return "south"
        if info.head_y > info.food_y:
            if info.can_move_to(info.head_x, info.head_y - 1):
                return "north"

        return "north"
Exemple #3
0
def situation_number(kantenlänge: int, maske: str, field: GameData):
    maske = maske.replace(" ", "")

    beginn = int(-(kantenlänge - 1) / 2)
    ende = int((kantenlänge - 1) / 2)
    auschnitt = []
    for deltay in range(beginn, ende + 1):
        for deltax in range(beginn, ende + 1):
            print(deltax, deltay)
            kästchen_x = field.head_x + deltax
            kästchen_y = field.head_y + deltay
            leer = field.can_move_to(kästchen_x, kästchen_y)
            if leer:
                auschnitt.append(0)
            else:
                auschnitt.append(1)
    # Schritt 2: in eine Zahl umwandeln
    wertigkeit = 1
    summe = 0
    # for Binearziffer in auschnitt:
    for stelle in range(kantenlänge**2):
        Binearziffer = auschnitt[stelle]
        maskiert = int(maske[stelle])
        if maskiert != 0:
            if Binearziffer == 1:
                summe += wertigkeit
            wertigkeit = wertigkeit * 2

    return summe
 def situation_berechnen(self, field: GameData):
     ergebnis = 0
     wertigkeit = 1
     for i in range(0, len(self.vektoren)):
         vektor = tuple(self.vektoren[i])
         if field.can_move_to(field.head_x + vektor[0],
                              field.head_y + vektor[1]) == False:
             ergebnis += wertigkeit
         wertigkeit *= 2
     return ergebnis
Exemple #5
0
    def get_head_view_with_food(info: GameData):
        surrounding = [[0 for x in range(-1, 2)] for x in range(-1, 2)]
        for dy in range(-1, 2):
            for dx in range(-1, 2):
                can_move = info.can_move_to(info.head_x + dx, info.head_y + dy)
                is_food = info.is_food(info.head_x + dx, info.head_y + dy)

                if not can_move:
                    surrounding[dy + 1][dx + 1] = BLOCKED
                elif can_move and not is_food:
                    surrounding[dy + 1][dx + 1] = FREE
                elif can_move and is_food:
                    surrounding[dy + 1][dx + 1] = FOOD

        return surrounding
def situation_number(kantenlänge: int, maske: str, field: GameData):
    maske = maske.replace(" ", "")

    # Schritt 1: wir suchen den Ausschnitt um den Kopf herum
    # Bei einer Kantenlänge von 3 müssen wir bei -1 links vom Kopf anfangen
    # und bei +1 rechts vom Kopf aufhören.
    # Kantenlänge 5: von -2 bis +2
    # Kantenlänge 7: von -3 bis +3
    beginn = int(-(kantenlänge - 1) / 2)
    ende = int((kantenlänge - 1) / 2)
    ausschnitt = []
    for deltay in range(beginn, ende + 1):
        for deltax in range(beginn, ende + 1):
            print(deltax, deltay)
            kästchen_x = field.head_x + deltax
            kästchen_y = field.head_y + deltay
            leer = field.can_move_to(kästchen_x, kästchen_y)
            if leer:
                ausschnitt.append(0)
            else:
                ausschnitt.append(1)

    # Schritt 2: in eine Zahl umwandeln
    wertigkeit = 1
    summe = 0
    # for binärziffer in ausschnitt:
    for stelle in range(kantenlänge**2):
        binärziffer = ausschnitt[stelle]
        maskiert = int(maske[stelle])
        if maskiert != 0:
            if binärziffer == 1:
                summe += wertigkeit
            wertigkeit = wertigkeit * 2
    # 0   1    0   0   1   0  0  0  0  Eingang
    # 1   1    1   1   0   1  1  1  1  Maske
    # 128 64   32  16      8  4  2  1

    return summe
Exemple #7
0
    def decide(self, info: GameData) -> str:
        # Strategie: zum Futter laufen
        if info.head_x < info.food_x:  # Liegt Futter im Osten?
            if info.can_move_to(info.head_x + 1,
                                info.head_y):  # Kann ich nach Osten?
                return "east"

        if info.head_x > info.food_x:  # Liegt Futter im Westen?
            if info.can_move_to(info.head_x - 1,
                                info.head_y):  # Kann ich nach Westen?
                return "west"

        if info.head_y < info.food_y:  # Liegt Futter im Süden?
            if info.can_move_to(info.head_x,
                                info.head_y + 1):  # Kann ich nach Süden?
                return "south"

        if info.head_y > info.food_y:  # Liegt Futter im Norden?
            if info.can_move_to(info.head_x,
                                info.head_y - 1):  # Kann ich nach Norden?
                return "north"

        # Der direkte Weg zum Futter ist wohl versperrt
        # Strategie: so weiterlaufen wie bisher
        if info.direction == "east":  # Laufe ich nach Osten?
            if info.can_move_to(info.head_x + 1,
                                info.head_y):  # Kann ich weiter nach Osten?
                return "east"

        if info.direction == "west":  # Laufe ich nach Westen?
            if info.can_move_to(info.head_x - 1,
                                info.head_y):  # Kann ich weiter nach Westen?
                return "west"

        if info.direction == "south":  # Laufe ich nach Süden?
            if info.can_move_to(info.head_x, info.head_y +
                                1):  # Kann ich weiter nach Süden?
                return "south"

        if info.direction == "north":  # Laufe ich nach Westen?
            if info.can_move_to(info.head_x, info.head_y -
                                1):  # Kann ich weiter nach Norden?
                return "north"

        # Weiter wie bisher geht nicht
        # Strategie: Egal wohin, bloß nicht sterben...
        if info.can_move_to(info.head_x + 1,
                            info.head_y):  # Kann ich nach Osten?
            return "east"
        if info.can_move_to(info.head_x - 1,
                            info.head_y):  # Kann ich nach Westen?
            return "west"
        if info.can_move_to(info.head_x,
                            info.head_y + 1):  # Kann ich nach Süden?
            return "south"
        if info.can_move_to(info.head_x,
                            info.head_y - 1):  # Kann ich nach Norden?
            return "north"

        # Öhm ... alle Richtungen versperrt?
        # Dann lieber auf einer Südseeinsel sterben
        return "south"