Beispiel #1
0
    def create_events(self, dungeon: Dungeon):
        self.all_reset_events()

        floor_map = dungeon.floor_map
        room_size = dungeon.room_size
        player = self.__player
        height, width = floor_map.shape

        self.__enemy_map = Matrix(height, width, dtype='object')
        self.__treasure_map = Matrix(height, width, dtype='object')
        self.__create_stair(floor_map, width, height, room_size)

        for _ in range(60):
            x = random.randint(3, width - 4)
            y = random.randint(3, height - 4)
            if not self.__can_create_events(dungeon, (y, x)):
                continue
            choice = random.choice([1, 2, 2, 2, 2])
            if choice == 1:
                treasure = TreasureBox((y, x), self.__game_system,
                                       self.__game_info)
                self.__treasure_map[treasure.map_coordinate] = treasure
            else:
                enemy = Enemy((y, x), self.__game_system, self.__game_info,
                              dungeon, player, self.__enemy_map)
                self.__enemy_map[enemy.map_coordinate] = enemy
Beispiel #2
0
 def __init__(self, game_system: GameSystem, game_info: GameInfo,
              player: Player):
     self.__game_system = game_system
     self.__game_info = game_info
     self.__player = player
     self.__enemy_map = Matrix()
     self.__treasure_map = Matrix()
     self.__stair: Stairs = None
 def get_delta(self, cur_x):
     n = cur_x.size[1]
     a = MathFunction.get_jacobian_matrix(self.functions, cur_x[0])
     b = Matrix((n, 1))
     elems_b = []
     for f in self.functions:
         elems_b.append(-f(*cur_x[0]))
     b.fill(*elems_b)
     return GaussMethod(a, b).solve().transpose()
    def __solve(self, prec, left_boundary, right_boundary, log):
        points = reduce((lambda ss, cs: (s + [c] for s in ss for c in cs)),
                        zip(left_boundary, right_boundary),
                        [[]])
        lam = -1
        min_jac = None
        first_point = None
        for p in points:
            tmp = MathFunction.get_jacobian_matrix(self.functions, p).norm_inf()
            if tmp > lam:
                lam = tmp
                # first_point = p
            if min_jac is None:
                min_jac = tmp
                first_point = p
            elif tmp < min_jac:
                min_jac = tmp
                first_point = p
        lam = 1 / lam
        dpr('lambda =', lam)
        dpr('min jacobian =', min_jac)
        dpr('=> first point =', first_point)

        prev_x = Matrix((1, len(first_point)))
        prev_x.fill(*first_point)
        # jac = MathFunction.get_jacobian_matrix(self.functions, monotonicity_interval[0])
        # lam = 1 / jac.norm_inf()
        phi_list = [lambda *x, f=self.functions[i], l=lam, i=i: x[i] - l*f(*x)
                    for i in range(len(self.functions))]
        q = 0.9
        # relax_coef = 0.1
        cur_x = self.__next_x(prev_x, phi_list)
        # prev_x *= 1 - relax_coef
        # cur_x *= relax_coef
        # cur_x += prev_x
        dpr('iter 1')
        dpr('prev_x =', prev_x[0])
        dpr('cur_x =', cur_x[0])
        iter_count = 1
        while q / (1 - q) * (cur_x - prev_x).transpose().norm_inf() > prec:
            dpr('prec = ', (cur_x - prev_x).transpose().norm_inf())
            prev_x = cur_x
            cur_x = self.__next_x(prev_x, phi_list)
            iter_count += 1
            dpr('next x = ', cur_x[0])
        if log:
            pass
            # print("Number of iterations (with first point x0 = {}) = {}".format(first_point, iter_count))
        return cur_x[0]
    def __get_base_map(self) -> Matrix:
        height, width = self.__base_size
        base_map = Matrix(height, width)

        XP = [0, 1, 0, -1]
        YP = [-1, 0, 1, 0]

        FLOOR = FloorType.FLOOR
        WALL = FloorType.WALL

        for x in range(width):
            base_map[0, x] = WALL
            base_map[height - 1, x] = WALL

        for y in range(1, height - 1):
            base_map[y, 0] = WALL
            base_map[y, width - 1] = WALL

        for y in range(1, height - 1):
            for x in range(1, width - 1):
                base_map[y, x] = FLOOR

        for y in range(2, height - 2, 2):
            for x in range(2, width - 2, 2):
                base_map[y, x] = WALL

        for y in range(2, height - 2, 2):
            for x in range(2, width - 2, 2):
                d = random.randint(0, 3)
            if x > 2:
                d = random.randint(0, 2)
            base_map[y + YP[d], x + XP[d]] = WALL

        return base_map
 def __solve(self, prec, monotonicity_interval, log):
     """
      monotonicity_interval: two points in Rn
     """
     first_point = list(map(lambda x, y: (x + y) / 2, *monotonicity_interval))
     prev_x = Matrix((1, len(first_point)))
     prev_x.fill(*first_point)
     cur_x = self.get_delta(prev_x) + prev_x
     iter_count = 1
     while (cur_x - prev_x).norm_inf() > prec:
         prev_x = cur_x
         cur_x = self.get_delta(prev_x) + prev_x
         iter_count += 1
     if log:
         print("Number of iterations (with first point x0 = {}) = {}".format(first_point, iter_count))
     return cur_x[0]
Beispiel #7
0
    def draw(self,
             game_system: GameSystem,
             center: (int, int),
             floor_map: Matrix
             ):

        center_y, center_x = center

        min_y = -4
        max_y = 6
        min_x = -5
        max_x = 6

        self.__stair.draw()

        for around_y in range(min_y, max_y):
            for around_x in range(min_x, max_x):
                map_y = center_y + around_y
                map_x = center_x + around_x
                if not floor_map.is_in((map_y, map_x)):
                    continue

                treasure = self.__treasure_map[map_y, map_x]
                if treasure is not None:
                    treasure.draw()

                enemy = self.__enemy_map[map_y, map_x]
                if enemy is not None:
                    enemy.draw()
 def __update_L_mtrx(self, prev_a_mtrx, k):
     mk = Matrix.identity(self.__mtrx.size)
     for i in range(k+1, mk.size[0]):
         mu = self.__get_mu(prev_a_mtrx, i, k)
         mk[i][k] = -mu
         self.__L[i][k] = mu
     return mk
 def get_inverse_matrix(mtrx, log=False):
     gm = GaussMethod(mtrx)
     gm.log(log)
     inv_mtrx = Matrix([mtrx.size[0], 0])
     b = Matrix([mtrx.size[0], 1])
     for i in range(mtrx.size[0]):
         b[i-1][0] = 0
         b[i][0] = 1
         gm.set_vector(b)
         inv_mtrx.append_col(gm.solve())
     if log:
         print("Check the correctness of the answer: ")
         print("A * A^(-1) = ")
         print(mtrx * inv_mtrx)
         print()
     return inv_mtrx
Beispiel #10
0
 def __init__(self,
              game_info: GameInfo,
              base_size: (int, int),
              room_size: int):
     self.__game_info = game_info
     self.__base_size = base_size
     self.__room_size = room_size
     self.__floor_map = Matrix()
    def create_floor_map(self):

        base_size = self.__base_size
        room_size = self.__room_size
        base_map = self.__get_base_map()

        base_height, base_width = base_size
        height = base_height * room_size
        width = base_width * room_size

        floor_map = Matrix(height, width)

        FLOOR = FloorType.FLOOR
        WALL = FloorType.WALL

        for y in range(height):
            for x in range(width):
                floor_map[y, x] = WALL

        for y in range(1, base_height - 1):
            for x in range(1, base_width - 1):
                dx = x * room_size + 1
                dy = y * room_size + 1
                if base_map[y, x] == FLOOR:
                    if random.randint(0, 99) < 20:
                        for ry in range(-1, room_size - 1):
                            for rx in range(-1, room_size - 1):
                                floor_map[dy + ry, dx + rx] = FLOOR
                    else:
                        floor_map[dy, dx] = FLOOR
                        road_size = math.floor(room_size / 2) + 1
                        if base_map[y - 1, x] == FLOOR:
                            for ry in range(1, road_size):
                                floor_map[dy - ry, dx] = FLOOR
                        if base_map[y + 1, x] == FLOOR:
                            for ry in range(1, road_size):
                                floor_map[dy + ry, dx] = FLOOR
                        if base_map[y, x - 1] == FLOOR:
                            for rx in range(1, road_size):
                                floor_map[dy, dx - rx] = FLOOR
                        if base_map[y, x + 1] == FLOOR:
                            for rx in range(1, road_size):
                                floor_map[dy, dx + rx] = FLOOR

        self.__floor_map = floor_map
Beispiel #12
0
 def all_reset_events(self):
     self.__enemy_map = Matrix()
     self.__treasure_map = Matrix()
Beispiel #13
0
class EventManager:
    @property
    def enemys(self) -> []:
        return self.__enemy_map.get_not_empty_values()

    @property
    def enemy_map(self) -> Matrix:
        return self.__enemy_map

    @property
    def treasure_map(self) -> Matrix:
        return self.__treasure_map

    def __init__(self, game_system: GameSystem, game_info: GameInfo,
                 player: Player):
        self.__game_system = game_system
        self.__game_info = game_info
        self.__player = player
        self.__enemy_map = Matrix()
        self.__treasure_map = Matrix()
        self.__stair: Stairs = None

    def remove_enemy(self, event: Event):
        self.__enemy_map[event.map_coordinate] = None

    def remove_treasure(self, treasure_box: TreasureBox):
        self.__treasure_map[treasure_box.map_coordinate] = None

    def all_reset_events(self):
        self.__enemy_map = Matrix()
        self.__treasure_map = Matrix()

    def ready_move_enemys(self):
        for enemy in self.__enemy_map.get_not_empty_values():
            if not enemy.ready_move():
                continue
            self.__enemy_map[enemy.next_position] = enemy
            self.__enemy_map[enemy.map_coordinate] = None

    def move_enemys(self):
        for enemy in self.__enemy_map.get_not_empty_values():
            enemy.move()

    def get_enemy(self, position: (int, int)) -> Optional[Enemy]:
        return self.__enemy_map[position]

    def get_treasure_box(self, position: (int, int)) -> Optional[TreasureBox]:
        return self.__treasure_map[position]

    def is_floor_clear(self) -> bool:
        return self.__player.map_coordinate == self.__stair.map_coordinate

    def __create_stair(self, floor_map: Matrix, width: int, height: int,
                       room_size: int):
        while True:
            x = random.randint(3, width - 4)
            y = random.randint(3, height - 4)
            if floor_map[y, x] == FloorType.WALL:
                continue
            area_size = math.floor(room_size / 2) + 1
            for ry in range(-area_size, area_size):
                for rx in range(-area_size, area_size):
                    floor_map[y + ry, x + rx] = FloorType.FLOOR
            self.__stair = Stairs((y, x), self.__game_system, self.__game_info)
            break

    def __can_create_events(self, dungeon: Dungeon,
                            position: (int, int)) -> bool:
        y, x = position

        if dungeon.floor_map[y, x] == FloorType.WALL:
            return False
        if self.__enemy_map[y, x] is not None:
            return False
        if self.__treasure_map[y, x] is not None:
            return False
        if self.__stair.y == y and self.__stair.x == x:
            return False
        return True

    def create_events(self, dungeon: Dungeon):
        self.all_reset_events()

        floor_map = dungeon.floor_map
        room_size = dungeon.room_size
        player = self.__player
        height, width = floor_map.shape

        self.__enemy_map = Matrix(height, width, dtype='object')
        self.__treasure_map = Matrix(height, width, dtype='object')
        self.__create_stair(floor_map, width, height, room_size)

        for _ in range(60):
            x = random.randint(3, width - 4)
            y = random.randint(3, height - 4)
            if not self.__can_create_events(dungeon, (y, x)):
                continue
            choice = random.choice([1, 2, 2, 2, 2])
            if choice == 1:
                treasure = TreasureBox((y, x), self.__game_system,
                                       self.__game_info)
                self.__treasure_map[treasure.map_coordinate] = treasure
            else:
                enemy = Enemy((y, x), self.__game_system, self.__game_info,
                              dungeon, player, self.__enemy_map)
                self.__enemy_map[enemy.map_coordinate] = enemy

    def draw(self, game_system: GameSystem, center: (int, int),
             floor_map: Matrix):
        center_y, center_x = center
        min_y = -4
        max_y = 6
        min_x = -5
        max_x = 6
        self.__stair.draw()

        for around_y in range(min_y, max_y):
            for around_x in range(min_x, max_x):
                map_y = center_y + around_y
                map_x = center_x + around_x
                if not floor_map.is_in((map_y, map_x)):
                    continue

                treasure = self.__treasure_map[map_y, map_x]
                if treasure is not None:
                    treasure.draw()

                enemy = self.__enemy_map[map_y, map_x]
                if enemy is not None:
                    enemy.draw()
Beispiel #14
0
    def __LU_decomposition(self):
        self.__L = Matrix.identity(self.__mtrx.size)
        ak_mtrx = self.__mtrx.copy()
        if self.need_logging:
            print("A0 = ")
            print(ak_mtrx)

        k = GaussMethod.__max_row_in_col(ak_mtrx, 0, 0)
        if k != 0:
            self.__permutations.append((0, k))
            ak_mtrx.exchange_rows(0, k)
            if self.need_logging:
                print("In A{} exchange {} and {} rows\n".format(0, 0, k))

        if self.need_logging:
            print("PA{} = ".format(0))
            print(ak_mtrx)
            print("L{} = ".format(0))
            print(self.__L)

        ak_mtrx = self.__update_L_mtrx(ak_mtrx, 0) * ak_mtrx

        if self.need_logging:
            print("A{} = ".format(1))
            print(ak_mtrx)
            print("L{} = ".format(1))
            print(self.__L)

        for i in range(1, self.__mtrx.size[0]-1):
            k = GaussMethod.__max_row_in_col(ak_mtrx, i, i)
            if i != k:
                self.__permutations.append((i, k))
                ak_mtrx.exchange_rows(i, k)
                self.__L.exchange_rows(i, k)
                self.__L.exchange_cols(i, k)
                if self.need_logging:
                    print("In A{} exchange {} and {} rows".format(i, i, k))
                    print("In L{} exchange {} and {} rows".format(i, i, k))
                    print("In L{} exchange {} and {} columns\n".format(i, i, k))

            if self.need_logging:
                print("PA{} = ".format(i))
                print(ak_mtrx)
                print("L{} = ".format(i))
                print(self.__L)

            ak_mtrx = self.__update_L_mtrx(ak_mtrx, i) * ak_mtrx

            if self.need_logging:
                print("A{} = ".format(i+1))
                print(ak_mtrx)
                print("L{} = ".format(i+1))
                print(self.__L)

        if self.need_logging:
            print("U = A{}\n".format(self.__mtrx.size[0]-1))

        self.__U = ak_mtrx

        if self.need_logging:
            print("L * U = ")
            print(self.__L * self.__U)
            pa = self.__mtrx.copy()
            for i in self.__permutations:
                pa.exchange_rows(i[0], i[1])
            print("PA = ")
            print(pa)