Beispiel #1
0
class World(object):
    def __init__(self, setting):  #世界的生成,主角初始化
        self.map = Map(setting)
        self.state = State(setting)
        self.me = Role(1, 1, '猪脚')
        self.me.setting_attr(1, 1000)
        self.me.check()
        self.map.add(self.me)
        self.should_add_time = 0
Beispiel #2
0
class World(object):
    def __init__(self, setting):  #世界的生成,主角初始化
        self.map = Map(setting)
        self.init_position(self.map, 'map/world_position.json')
        self.state = State(setting)
        self.me = Main_role(1, 1, '猪脚')
        self.me.set_attr(1, 1000)
        self.me.speed = 1.2
        self.me.set_img('resources/person/hero.png')
        #self.me.check()
        self.map.add(self.me)
        self.should_add_time = 0
        self.npc1 = NPC(15, 14, '士兵1')
        self.npc1.set_attr(1, 500)
        self.npc1.set_img('resources/person/soldier.png')
        self.npc1.set_AI(AI_type.PATROL, (8, 9), (8, 19))
        self.map.add(self.npc1)
        self.npc2 = NPC(15, 14, '士兵2')
        self.npc2.set_attr(1, 500)
        self.npc2.set_img('resources/person/soldier.png')
        self.npc2.set_AI(AI_type.PATROL, (9, 8), (19, 8))
        self.map.add(self.npc2)
        self.npc3 = NPC(15, 14, '士兵3')
        self.npc3.set_attr(1, 500)
        self.npc3.set_img('resources/person/soldier.png')
        self.npc3.set_AI(AI_type.PATROL, (9, 20), (19, 20))
        self.map.add(self.npc3)
        self.npc4 = NPC(15, 14, '士兵4')
        self.npc4.set_attr(1, 500)
        self.npc4.set_img('resources/person/soldier.png')
        self.npc4.set_AI(AI_type.PATROL, (21, 9), (21, 19))
        self.map.add(self.npc4)

    def init_position(self, map, filename):
        with open(filename, "r", encoding='utf-8') as file:
            aa = json.loads(file.read())
            file.seek(0)
            cache = json.load(file)  # 与 json.loads(f.read())
        #print(cache)
        for position in cache['positions']:
            map.add_position(position)
Beispiel #3
0
class Map_editor:
    def __init__(self, name_map):
        self.window = Window()
        self.map = Map(name_map)
        self.event_handler = EventHandlerMouse()

        self.window.draw()
        self.map.draw(self.window.screen)
        self.window.flip()

        self.running = True
        while self.running:
            line = self.event_handler.start()
            if line:
                self.map.add(line)
                self.map.draw(self.window.screen)
                self.window.flip()
            else:
                self.running = False

        if input('save?(Si/No)') == 'Si':
            self.map.save()
class Simulator:
    def __init__(self):
        self.resource_spawn_rate = BASE_CHANCE//20
        self.num_species = 2
        self.num_members = 3
        self.num_resources = 15
        self.user_skill = 0
        self.user_speed = 0
        self.user_strength = 0
        self.user_params()
        self.map_obj = Map(width=self.width,height=self.height)
        self.pos_set = set([(i,j)
                     for i in range(self.height) for j in range(self.width)])
        self.win = Window()
        self.init_map();

    def create_species(self):
        '''Takes in user specifications for strength/speed of species 
             they are rooting for on the board'''
        print("You will be species 0.")
        self.user_speed = float(input("Enter speed of your species (0-3): ")
                                or uniform(0,3))
        self.user_strength = float(input(
                                "Enter strength of your species (0-10): ") 
                                or uniform(0,10))

    def user_params(self):
        '''Initializes simulation data with user preferences.'''
        self.num_species = int(input(
                            "Enter number of species on board (Default: 3): ") 
                                or 3)
        self.num_members = int(input(
                        "Enter number of members per species (Default: 2): ") 
                                or 2)
        self.num_resources = int(input(
                    "Enter number of resources on the board (Default: 15) : ") 
                                or 15)
        if input("Would you like to create a species? ") == 'Y':
            self.create_species() 
        else:
            self.user_speed = uniform(0,3)
            self.user_strength = uniform(0,10)
        dimension = int(math.ceil(math.sqrt(
                    self.num_resources + self.num_species 
                    * self.num_members * 1.5)))
        self.width = 0
        self.height = 0
        print(f"Minimum Number of Spaces: {dimension**2}")
        while(self.width*self.height < dimension**2):
            self.width = int(input("Enter width of the board") or dimension)
            self.height = int(input("Enter height of the board") or dimension)
            if self.width*self.height < dimension**2:
                print("Not enough space on board for specified items!")

    def init_map(self):
        '''Creates members of each species, with 
           random attributes characteristic to each species.
            Places members and resources on the map.'''
        for i in range(self.num_members):
            #Creates members of species user is rooting for.
            skill= Skill(strength=self.user_strength, speed=self.user_speed)
            m = Member(
                draw_fn=self.draw,
                map_obj=self.map_obj,
                skill=skill,
                species_id=0,
                reproduction_chance=BASE_CHANCE//10)
            pos = choice(list(self.pos_set))
            self.pos_set.remove(pos)
            self.map_obj.add(m, pos)
        for i in range(1, self.num_species):
            for j in range(self.num_members):
                skill=Skill(strength=uniform(0,10), speed=uniform(0,3))
                m = Member(
                    draw_fn=self.draw,
                    map_obj=self.map_obj,
                    skill=skill,
                    species_id=i,
                    reproduction_chance=BASE_CHANCE//10)
                pos = choice(list(self.pos_set))
                self.pos_set.remove(pos)
                self.map_obj.add(m, pos)
        for _ in range(self.num_resources):
            r = Resource(
                strength=1+random.random(),
                speed=1+random.random())
            #Add extra types of skills to the resource at random
            if random.random() > 0.75:
                r.add_to_bag()
            pos = choice(list(self.pos_set))
            self.pos_set.remove(pos)
            self.map_obj.add(r, pos)

    def members(self):
        return [self.map_obj.at(pos) for pos in self.map_obj.members.values()]

    def _random_resource_inclusion_thread(self):
        '''Adds resources with random attributes to the board at a rate
        determined by the resource spawn rate and simulation speed'''
        while True:
            with self.map_obj.lock:
                if self.map_obj.is_game_over:
                    break
                r = Resource(
                    strength=1+random.random(),
                    speed=1+random.random())
                if random.random() > 0.75:
                    r.add_to_bag()
                pos = choice(list(self.map_obj.empty_pos))
                self.map_obj.add(r, pos)
            sleep(uniform(
                0, BASE_CHANCE/self.resource_spawn_rate)/SIM_SPEED_MULT)

    def _ctrlc_handler(self, signal_received, frame):
        '''Allows simulation to quit cleanly if interrupted before it ends'''
        with self.map_obj.lock:
            self.map_obj.game_over = True

    def print_end_state(self):
        '''Prints the winning species/ result of the simulation.
        The simulation is over if there are 1 or 0 species left on the board.'''
        counts = list(self.map_obj.species_counts.items())
        if len(counts) == 1:
            print(f'Species {counts[0][0]} wins!')
        elif len(counts) == 0:
            print(f'All species dead.')

    def draw(self):
        '''renders map object for GUI.'''
        self.win.draw(self.map_obj)

    def start(self):
        '''Starts threads for members, and resource inclusion thread. Renders
        GUI until the simulation is over.'''
        self.win.start()
        signal(SIGINT, self._ctrlc_handler)
        for m in self.members():
            m._thread.start()
        Thread(target=self._random_resource_inclusion_thread).start()
        while True:
            with self.map_obj.lock:
                if self.map_obj.is_game_over:
                    break
                self.draw()
            sleep(.2)
        self.win.stop()
        self.print_end_state()