コード例 #1
0
    def get_lines(self, color, coord):
        pos_fin = Coordinate(coord.x, coord.y)
        pos_inicial = Coordinate(coord.x, coord.y)
        can_fichas_volteables = 0
        vec_lineas = []
        for inc_fila in xrange(-1, 2):
            for inc_col in xrange(-1, 2):
                pos_fin.x = pos_inicial.x + inc_fila
                pos_fin.y = pos_inicial.y + inc_col
                #Verifica que haya al menos una ficha del color opuesto para voltear
                if Referee.can_turn(color, pos_inicial, inc_fila, inc_col,
                                    self):
                    hash_linea = {}
                    vec_casillas = []
                    #Contar las fichas volteables en esa linea
                    while True:
                        can_fichas_volteables += 1
                        vec_casillas.append(Coordinate(pos_fin.x, pos_fin.y))
                        pos_fin.x += inc_fila
                        pos_fin.y += inc_col
                        if not self.__casilla[pos_fin.x][pos_fin.y] == -color:
                            break
                    hash_linea["casilla_inicial"] = pos_inicial
                    hash_linea["casilla_final"] = Coordinate(
                        pos_fin.x, pos_fin.y)
                    hash_linea["can_fichas_volteables"] = can_fichas_volteables
                    hash_linea["casillas_volteables"] = vec_casillas
                    vec_lineas.append(hash_linea)
                    can_fichas_volteables = 0

        return vec_lineas
コード例 #2
0
class Direction:
    LEFT = Coordinate(-1, 0)
    RIGHT = Coordinate(1, 0)
    DOWN = Coordinate(0, -1)
    UP = Coordinate(0, 1)
    STAY = Coordinate(0, 0)

    @staticmethod
    def all():
        return {
            Direction.LEFT, Direction.RIGHT, Direction.UP, Direction.DOWN,
            Direction.STAY
        }

    @staticmethod
    def as_movement_delta(direction):
        directions = {
            "DOWN": (0, 1),
            "UP": (0, -1),
            "RIGHT": (1, 0),
            "LEFT": (-1, 0),
            "STAY": (0, 0)
        }

        return directions[direction.upper()]
コード例 #3
0
ファイル: test.py プロジェクト: beauxq/survey-robot-swarm
def test_data_repository():
    width = 10
    height = 10
    seed = random.randint(76, 76000)
    print("seed:", seed)
    a = SimPhysicalInterface(width, height, seed)
    d = DataRepository(width, height)

    print(a.env.text_map())

    visit(a, d)

    c = d.find_target(a.position, Coordinate(0, 0))
    while c != Coordinate(0, 0):
        print("target:", c)

        p = d.find_path(a.position, c)
        print("path:", p)
        if len(p) > 0:
            a.turn(p[0])
            a.forward()
            visit(a, d)

        print(d.text_map(a.position, a.facing))
        input()
        c = d.find_target(a.position, Coordinate(0, 0))
コード例 #4
0
    def possibles_moves(color, tablero):
        coordenadas = []
        pos = Coordinate()
        dimension = tablero.get_dimension()

        for i in range(0, dimension):
            for j in range(0, dimension):
                pos.x = i
                pos.y = j
                if Referee.is_valid_move(color, pos, tablero):
                    nueva_pos = Coordinate(i, j)
                    coordenadas.append(nueva_pos)

        return coordenadas
コード例 #5
0
ファイル: ai.py プロジェクト: sugar-activities/4286-activity
 def __init__(self,
              tablero,
              turno=NEGRO,
              etiqueta=MAX,
              profundidad=0,
              cantidad_hnos=0):
     self.tablero = tablero.copy()
     self.etiqueta = etiqueta
     self.profundidad = profundidad
     self.turno = turno
     self.cantidad_hnos = cantidad_hnos
     #Guardo la coordenada para llegar al mejor sucesor de este estado
     self.mejor_sucesor = Coordinate()
     #Guardo la accion que dio nacimiento al estado
     self.iniciador = Coordinate()
コード例 #6
0
ファイル: Message.py プロジェクト: beauxq/survey-robot-swarm
    def extract_coordinates(self) -> Coordinate:
        """ inverse of coord_str starting from index cursor
            :returns Coordinate """
        x = self.extract_number()
        y = self.extract_number()

        return Coordinate(x, y)
コード例 #7
0
    def is_at_least_one_move(color, tablero):
        dimension = tablero.get_dimension()
        pos = Coordinate()

        for i in range(0, dimension):
            for j in range(0, dimension):
                pos.x = i
                pos.y = j
                if Referee.is_valid_move(color, pos, tablero):
                    return True

        return False
コード例 #8
0
    def number_of_successors(color, tablero):
        cant_sucesores = 0
        pos = Coordinate()
        dimension = tablero.get_dimension()

        for i in range(0, dimension):
            for j in range(0, dimension):
                pos.x = i
                pos.y = j
                if Referee.is_valid_move(color, pos, tablero):
                    cant_sucesores += 1

        return cant_sucesores
コード例 #9
0
    def parse_telemetry(self):
        """
        Parse a command received and turn it into a coordinate if possible

        :return: The coordinate parsed from the command stream
        """
        telemetry = self.buffer
        self.buffer = ""
        if telemetry[0] == '<':
            if telemetry[len(telemetry) - 1] == '>':
                values = telemetry[1:len(telemetry)-1].split(',')
                coord = Coordinate(int(values[0]), int(values[1]))
                return coord
        return None
コード例 #10
0
    def turn_pieces(self, color, pos_ini):
        pos_fin = Coordinate(pos_ini.x, pos_ini.y)

        for inc_fila in xrange(-1, 2):
            for inc_col in xrange(-1, 2):
                pos_fin.x = pos_ini.x + inc_fila
                pos_fin.y = pos_ini.y + inc_col
                #Verifica que haya al menos una ficha del color opuesto para voltear
                if Referee.can_turn(color, pos_ini, inc_fila, inc_col, self):
                    #Voltear las fichas
                    while True:
                        self.__casilla[pos_fin.x][pos_fin.y] = color
                        pos_fin.x += inc_fila
                        pos_fin.y += inc_col
                        if not self.__casilla[pos_fin.x][pos_fin.y] == -color:
                            break
        #Actualizo los contadores de las fichas blancas o negras dependiendo del color
        self.update_pieces_counters()
コード例 #11
0
ファイル: test.py プロジェクト: beauxq/survey-robot-swarm
def test_message():
    print(Message.coord_str(Coordinate(536, 0)))
    assert Message.coord_str(Coordinate(536, 0)) == "536 0 "
    print("passed Message.coord_str")

    Message.set_my_robot_id(1)

    m = Message()
    m.add_objective(Coordinate(3, 5), 2.0)
    print(m.get_data())
    assert m.get_data() == Message.BEGIN + "1 1 j3 5 2.0k" + Message.END
    print("passed add_objective")

    m._cursor = 10
    ov = m.extract_objective_value()
    print(ov)
    assert ov == 2.0
    print("passed extract_objective_value")

    m = Message()
    m.add_obstacle(Coordinate(0, 6), Knowledge.YES)
    print(m.get_data())
    assert m.get_data() == Message.BEGIN + "1 2 s0 6 yt" + Message.END
    print("passed add_obstacle")

    m._cursor = 6
    co = m.extract_coordinates()
    print(co)
    assert co == Coordinate(0, 6)
    print("passed extract coordinate")

    d = DataRepository(10, 10)
    m.add_objective(Coordinate(6, 0), 7.0)
    m.handle(d)
    obs = d.get_obstacle(Coordinate(0, 6))
    obj = d.get_objective(Coordinate(6, 0))
    print(obs, obj)
    assert obs == Knowledge.YES
    assert obj == 7.0
    print("passed handle")
コード例 #12
0
    def can_turn(color, pos_ini, dir_horizontal, dir_vertical, tablero):
        pos_fin = Coordinate(pos_ini.x + dir_horizontal,
                             pos_ini.y + dir_vertical)
        if not tablero.valid_coord(pos_fin):
            return False

        # Verifica que haya al menos una ficha del color opuesto en esa direccion
        if tablero.get_casillas()[pos_fin.x][pos_fin.y] != -1 * color:
            return False

        # Ejecuto el while mientras la casilla del tablero contenga piezas del color opuesto,
        # es decir no sea VACIO, ni de mi color, ni este fuera del tablero
        while True:
            pos_fin.x += dir_horizontal
            pos_fin.y += dir_vertical
            if not tablero.valid_coord(pos_fin):
                return False
            if tablero.get_casillas()[pos_fin.x][pos_fin.y] == board.VACIO:
                return False
            elif tablero.get_casillas()[pos_fin.x][pos_fin.y] == color:
                return True
コード例 #13
0
ファイル: ai.py プロジェクト: sugar-activities/4286-activity
    def __number_stable_boxes(self, tablero):
        pos = Coordinate()
        estables = []
        dim = tablero.get_dimension()
        for _ in xrange(dim):
            estables.append([False] * dim)

        cambio_estado = True
        while (cambio_estado):
            cambio_estado = False
            for i in xrange(0, dim):
                for j in xrange(0, dim):
                    pos.x = i
                    pos.y = j
                    if tablero.get_valor_casilla(
                            i, j
                    ) != VACIO and not estables[i][j] and not self.__can_turn(
                            pos, tablero, estables):
                        estables[i][j] = True
                        cambio_estado = True

        return estables
コード例 #14
0
ファイル: ai.py プロジェクト: sugar-activities/4286-activity
 def __init__(self, nivel=1):
     if nivel == Ai.FACIL:
         self.__profundidad_maxima = 1
         self.__frontera_peso = 1  #Cuanto mas fichas tengas en la frontera es peor
         self.__movilidad_peso = 0  #Cuantas jugadas posible se tiene
         self.__estabilidad_peso = 0  #Cuantas mas fichas logres estabilizar en la jugada mejor
         self.__diferencia_cantidad_fichas_peso = 8
     elif nivel == Ai.MEDIO:
         self.__profundidad_maxima = 2
         self.__frontera_peso = 1  #Cuanto mas fichas tengas en la frontera es peor
         self.__movilidad_peso = 0  #Cuantas jugadas posible se tiene
         self.__estabilidad_peso = 3  #Cuantas mas fichas logres estabilizar en la jugada mejor
         self.__diferencia_cantidad_fichas_peso = 1
     elif nivel == Ai.DIFICIL:
         self.__profundidad_maxima = 3
         self.__frontera_peso = 2  #Cuanto mas fichas tengas en la frontera es peor
         self.__movilidad_peso = 1  #Cuantas jugadas posible se tiene
         self.__estabilidad_peso = 5  #Cuantas mas fichas logres estabilizar en la jugada mejor
         self.__diferencia_cantidad_fichas_peso = 4
     else:
         raise Exception("Nivel desconocido (Ai Class)")
     #Guardo la ultima jugada de la PC
     self.__ultima_jugada = Coordinate(0, 0)
コード例 #15
0
ファイル: ai.py プロジェクト: sugar-activities/4286-activity
    def __border_pieces(self, tablero, color):
        can_fichas_frontera = 0
        dim = tablero.get_dimension()

        for i in xrange(0, dim):
            for j in xrange(0, dim):
                es_frontera = False
                if tablero.get_valor_casilla(i, j) == color:
                    aux_coord = Coordinate()
                    for inc_fila in xrange(-1, 2):
                        for inc_col in xrange(-1, 2):
                            aux_coord.x = i + inc_fila
                            aux_coord.y = j + inc_col
                            if not (inc_fila == 0 and inc_col == 0
                                    and tablero.valid_pos(aux_coord)
                                    and tablero.get_valor_casilla(
                                        aux_coord.x, aux_coord.y) == VACIO):
                                es_frontera = True
                                inc_fila = 2
                                break
                if es_frontera:
                    can_fichas_frontera += 1

        return can_fichas_frontera
コード例 #16
0
ファイル: main.py プロジェクト: beauxq/survey-robot-swarm
def create_robot_with_options(options: dict) -> Robot:
    return Robot(options["width"], options["height"],
                 Coordinate(options["home_x"], options["home_y"]),
                 options["seed"], options["robot_id"], options["robot_count"])
コード例 #17
0
 def __init__(self):
     self.position = Coordinate()
     self.facing = Direction.EAST
コード例 #18
0
 def __init__(self, width: int, height: int, seed: int):
     super().__init__()
     self.env = EnvironmentSimulator()
     self.env.generate(width, height, seed)
     self.position = Coordinate(0, 0)
     self.facing = Direction.EAST