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"
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
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
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"