コード例 #1
0
ファイル: proj11.py プロジェクト: jburke11/Projects
def read_file_moves(fp):
    '''
        takes file pointer and makes csv reader
        iterates through reader and creates list of valid move instances
    '''
    moves_file = csv.reader(fp)
    move_objects = []
    next(moves_file, None)
    for line in moves_file:
        if line[2] != "1":

            pass
        elif line[9] == "1":

            pass
        elif line[4] == "" or not line[4]:

            pass
        elif line[6] == "" or not line[6]:

            pass

        else:
            move_object = Move(line[1], element_id_list[int(line[3])],
                               int(line[4]), int(line[6]), int(line[9]))
            move_objects.append(move_object)
    return move_objects
コード例 #2
0
ファイル: pkm_battle.py プロジェクト: tkwedward/pokemon
def search_move_table(name, move_table=move_table):
    """
    目的︰從 move_table 整一個 move instance

    arg:
    name: 招式的名稱
    move_table: 招式表

    return:
    Move 的 instance
    """

    row = move_table[move_table['中文名'] == name]
    # category = row['類型'].iloc[0] #這是變化、物理或特殊類形
    category = '變化'  #這是變化、物理或特殊類形
    damage = row['威力'].iloc[0]
    accuracy = row['命中'].iloc[0]
    pp = row['PP/上限'].iloc[0]
    offset = row['先制'].iloc[0]  #是否先制技
    m_type = row['type'].iloc[0]
    special = None  # 有沒有特殊效果
    return Move(name,
                category=category,
                damage=damage,
                accuracy=accuracy,
                pp=pp,
                offset=offset,
                special=special,
                m_type=m_type)
コード例 #3
0
ファイル: pokedex.py プロジェクト: usop7/Python_OOP_Projects
 async def create_move(self, data: dict) -> Move:
     """
     Create an Move object based on the given data, and return it.
     :param data: a dictionary
     :return: Pokemon object
     """
     return Move(name=data["name"],
                 move_id=data["id"],
                 generation=data["generation"]["name"],
                 accuracy=data["accuracy"],
                 pp=data["pp"],
                 power=data["power"],
                 move_type=data["type"]["name"],
                 damage_class=data["damage_class"]["name"],
                 effect_short=data["effect_entries"][0]["short_effect"])
コード例 #4
0
def read_file_moves(fp):
    csv_reader = csv.reader(fp)
    next(csv_reader)
    moves_list = []
    for move in csv_reader:
        name = move[1]
        element = element_id_list[int(move[3])]
        attack_type = int(move[9])
        power = int(move[4]) if move[4]!='' else None
        accuracy = int(move[6]) if move[6]!='' else None
        generation_id = int(move[2])
        if generation_id==1 and attack_type!=1 and power!=None and accuracy!=None:
            move_obj=Move(name,element,power,accuracy,attack_type)
            moves_list.append(move_obj)
    return moves_list
コード例 #5
0
def read_file_moves(fp):
    """
    Input:
        fp: file pointer for moves.csv
            
    Output:
        list of move objects
        
    Algorithm:
        Reads fp line by line and creates move objects. Each object that fills the 
            project criteria is added to the returned move list.
    """
    reader = csv.reader(fp)  #Attaches reader to the file pointer
    next(reader, None)  #Skip first line

    move_list = list()

    for line_list in reader:
        gen = line_list[2]
        if gen != '1':
            break

        attack_type = line_list[9]  #2 phy, #3 spe, #1 status effect
        if attack_type == '1':
            continue

        ele_idx = int(line_list[3])
        element = element_id_list[ele_idx]

        name = line_list[1].lower()

        #Power and accuracy sections
        power = line_list[4]
        if power == '':
            continue
        else:
            power = int(power)

        accuracy = line_list[6]
        if accuracy == '':
            continue
        else:
            accuracy = int(accuracy)

        move = Move(name, element, power, accuracy, attack_type)
        move_list.append(move)

    return move_list
コード例 #6
0
def read_file_moves(fp):
    '''
        This sorts through the move csv and gets certain stats of the move
        to ultimately calculate damage
    '''
    lst = []
    reader = csv.reader(fp)
    next(reader, None)  # skips header

    for line in reader:  # goes through each line and skips the ones with empty values
        if int(line[2]) != 1 or int(
                line[9] == 1) or not (line[4]) or not (line[6]):
            pass
        else:
            lst.append(
                Move(line[1], element_id_list[int(line[3])], int(line[4]),
                     int(line[6]), int(line[9])))
    return lst  #  returns list of moves
コード例 #7
0
ファイル: pokedex.py プロジェクト: usop7/Python_OOP_Projects
 async def create_pokemon_move_list(self, data: list) -> list:
     """
     If not an expanded mode, create a list of Move objects based on
     the given data, and return the list.
     If an expanded mode, pass a list of url parameters to the
     async tasks method, and then return the move_list.
     :param data: list of dictionaries
     :return: list of Move objects
     """
     if not self.request.expanded:
         moves = [
             Move(name=d["move"]["name"],
                  level=d["version_group_details"][0]["level_learned_at"],
                  url=d["move"]["url"]) for d in data
         ]
         return moves
     else:
         params = [d["move"]["url"] for d in data]
         await self.process_async_tasks(Mode.MOVE, params, True)
         return self.move_list
コード例 #8
0
def read_file_moves(fp):
    '''takes file pointer and returns a list of move objects'''
    moves_list = []
    reader = csv.reader(fp)
    next(reader, None)  #skip header line
    for line in reader:
        generation_id = int(line[2])
        name = line[1]
        attack_type = int(line[9])
        if (generation_id == 1) and (attack_type !=
                                     1):  #must be first gen and attack 2 or 3
            try:  #account for missing accuracy or power
                element_id = int(line[3])
                element = element_id_list[
                    element_id]  #element_id represents index
                accuracy = int(line[6])
                power = int(line[4])
                move = Move(name, element, power, accuracy, attack_type)
                #create move instance
                moves_list.append(move)
            except:
                next(reader, None)
    return moves_list
コード例 #9
0
ファイル: base_agent.py プロジェクト: jchen1352/pokemon-rl
 def process_args(self, args, kwargs):
     if args[1] == 'player' and args[3] == self.player_name:
         #args[2] will be 'p1' or 'p2'
         self.player_num = args[2][1]
     if args[1] == 'request' and args[2] != '':
         #Read team data
         data = json.loads(args[2])
         if self.game_data.team == None:
             #Initialize team
             pokemon = list(map(Pokemon.from_data, data['side']['pokemon']))
             self.game_data.team = pokemon
             self.game_data.active = pokemon[0]
         else:
             #Update data
             for x in data['side']['pokemon']:
                 name, _, _ = Pokemon.get_details(x['details'])
                 for p in self.game_data.team:
                     if p.name == name:
                         h, m, s = Pokemon.get_condition(x['condition'])
                         p.health = h
                         p.max_health = m
                         p.status = s
                         p.stats = x['stats']
                         p.update_ability(x['ability'])
                         p.item = x['item']
                         break
         if 'wait' in data:
             self.wait_game = True
         else:
             if 'forceSwitch' in data:
                 self.wait_game = False
                 self.force_switch = True
             elif 'teamPreview' in data:
                 self.wait_game = False
                 self.choose_start = True
             else:
                 self.wait_game = False
                 self.force_switch = False
                 #Read active pokemon moves
                 moves = list(
                     map(Move.from_data, data['active'][0]['moves']))
                 active = data['side']['pokemon'][0]
                 name, _, _ = Pokemon.get_details(active['details'])
                 for p in self.game_data.team:
                     if p.name == name:
                         p.moves = moves
     if args[1] == 'turn':
         #Do stuff with turn number?
         pass
     if args[1] == 'teamsize' and args[2] != 'p' + self.player_num:
         #Initialize opponent team with None for unknown pokemon
         num = int(args[3])
         self.game_data.opp_team = [None for i in range(num)]
     if args[1] == 'move':
         player, _ = parse_pokemon(args[2])
         if player != self.player_num:
             name = clean_name(args[3])
             #Check if zmove
             if name not in movedex:
                 #z status move
                 m = re.match('z(.*)', name)
                 name = m.group(1)
                 move_type = movedex[name]['type']
                 #Find corresponding zcrystal
                 for item in itemdex.values():
                     if 'zMoveType' in item and item[
                             'zMoveType'] == move_type:
                         self.game_data.opp_active.item = item['id']
             elif 'isZ' in movedex[name]:
                 zcrystal = movedex[name]['isZ']
                 if 'zMoveFrom' in itemdex[zcrystal]:
                     #Signature zmove
                     name = clean_name(itemdex[zcrystal]['zMoveFrom'])
                 else:
                     #Don't know original move
                     name = None
                 self.game_data.opp_active.item = zcrystal
             if name:
                 #Update opponent moves
                 opp_moves = self.game_data.opp_active.moves
                 for i in range(len(opp_moves)):
                     if opp_moves[i] == None:
                         opp_moves[i] = Move(name)
                         opp_moves[i].pp -= 1
                         break
                     if opp_moves[i].name == name:
                         opp_moves[i].pp -= 1
                         break
     if args[1] == 'switch' or args[1] == 'drag':
         player, nickname = parse_pokemon(args[2])
         if player == self.player_num:
             self.clear_boosts(self.player_num)
             self.clear_poke_effects(self.player_num)
             self.game_data.active.transformed = False
             #Update active pokemon and team positions
             name, _, _ = Pokemon.get_details(args[3])
             team = self.game_data.team
             if team:
                 for i in range(len(team)):
                     if team[i].name == name:
                         self.game_data.active = team[i]
                         team[0], team[i] = team[i], team[0]
                         break
         else:
             if self.game_data.opp_active:
                 self.game_data.opp_active.switch_out()
             self.clear_boosts(self.other_player())
             self.clear_poke_effects(self.other_player())
             #Update opponent active pokemon and team
             name, _, _ = Pokemon.get_details(args[3])
             for i in range(len(self.game_data.opp_team)):
                 opp = self.game_data.opp_team[i]
                 if opp == None:
                     #New pokemon
                     p = Pokemon.from_details(args[3], nickname, args[4])
                     self.game_data.opp_active = p
                     self.game_data.opp_team[i] = p
                     break
                 if name == opp.name:
                     #Existing pokemon
                     self.game_data.opp_active = opp
                     break
     if args[1] == 'detailschange' or args[1] == '-formechange':
         player, _ = parse_pokemon(args[2])
         if player != self.player_num:
             name, _, _ = Pokemon.get_details(args[3])
             self.game_data.opp_active.change_form(name)
     if args[1] == 'replace':
         #TODO: implement this
         pass
     if args[1] == 'faint':
         player, _ = parse_pokemon(args[2])
         if player != self.player_num:
             self.game_data.opp_active.status = 'fnt'
     if args[1] == '-damage' or args[1] == '-heal':
         player, _ = parse_pokemon(args[2])
         if player != self.player_num:
             health, max_health, status = Pokemon.get_condition(args[3])
             p = self.game_data.opp_active
             p.health = health
             p.max_health = max_health
             p.status = status
             self.check_item_ability(player, kwargs)
     if args[1] == '-sethp':
         player, _ = parse_pokemon(args[2])
         health1, _, _ = Pokemon.get_condition(args[3])
         health2, _, _ = Pokemon.get_condition(args[5])
         if player == self.player_num:
             self.game_data.opp_active.health = health2
         else:
             self.game_data.opp_active.health = health1
     if args[1] == '-status':
         player, _ = parse_pokemon(args[2])
         if player != self.player_num:
             self.game_data.opp_active.status = args[3]
             self.check_item_ability(player, kwargs)
     if args[1] == '-curestatus':
         m = re.match('p(1|2): (.*)', args[2])
         if m:
             #Cured pokemon is not active
             if m.group(1) != self.player_num:
                 team = self.game_data.opp_team
                 for p in team:
                     if p.nickname == m.group(2):
                         p.status = None
                         break
         else:
             #Cured pokemon is active
             player, _ = parse_pokemon(args[2])
             if player != self.player_num:
                 self.game_data.opp_active.status = None
                 self.check_item_ability(player, kwargs)
     if args[1] == '-boost':
         player, _ = parse_pokemon(args[2])
         b = self.get_boosts(player)
         b[args[3]] += int(args[4])
         self.check_item_ability(player, kwargs)
     if args[1] == '-unboost':
         player, _ = parse_pokemon(args[2])
         b = self.get_boosts(player)
         b[args[3]] -= int(args[4])
         if player != self.player_num:
             self.check_item_ability(player, kwargs)
     if args[1] == '-setboost':
         player, _ = parse_pokemon(args[2])
         amount = int(args[4])
         #For some reason, anger point sends -setboost 12 instead of 6
         if amount > 6:
             amount = 6
         b = self.get_boosts(player)
         b[args[3]] = amount
         if player != self.player_num:
             self.check_item_ability(player, kwargs)
     if args[1] == '-swapboost':
         b = self.game_data.boosts
         opp_b = self.game_data.opp_boosts
         swap = list(b)
         if len(args) > 4:
             swap = args[4].split(', ')
         for stat in swap:
             b[stat], opp_b[stat] = opp_b[stat], b[stat]
     if args[1] == '-clearpositiveboost' or args[1] == '-clearnegativeboost':
         player, _ = parse_pokemon(args[2])
         b = self.get_boosts(player)
         for stat in b:
             if args[1] == '-clearpositiveboost' and b[stat] > 0:
                 b[stat] = 0
             elif args[1] == '-clearnegativeboost' and b[stat] < 0:
                 b[stat] = 0
         if player != self.player_num:
             self.check_item_ability(player, kwargs)
     if args[1] == '-copyboost':
         b_to = self.game_data.boosts
         b_from = self.game_data.opp_boosts
         player, _ = parse_pokemon(args[2])
         if player != self.player_num:
             b_to, b_from = b_from, b_to
         swap = list(b_to)
         if len(args) > 4:
             swap = args[4].split(', ')
         for stat in b_to:
             b_to[stat] = b_from[stat]
     if args[1] == '-clearboost':
         player, _ = parse_pokemon(args[2])
         self.clear_boosts(player)
         if player != self.player_num:
             self.check_item_ability(player, kwargs)
     if args[1] == '-invertboost':
         player, _ = parse_pokemon(args[2])
         b = self.get_boosts(player)
         for stat in b:
             b[stat] = -b[stat]
         if player != self.player_num:
             self.check_item_ability(player, kwargs)
     if args[1] == '-clearallboost':
         self.clear_boosts(self.player_num)
         self.clear_boosts(self.other_player())
     if args[1] == '-item':
         player, _ = parse_pokemon(args[2])
         if player != self.player_num:
             self.game_data.opp_active.item = clean_name(args[3])
     if args[1] == '-enditem':
         player, _ = parse_pokemon(args[2])
         if player != self.player_num:
             self.game_data.opp_active.item = ''
     if args[1] == '-ability':
         player, _ = parse_pokemon(args[2])
         if player != self.player_num:
             ability = clean_name(args[3])
             self.game_data.opp_active.set_ability(ability)
     if args[1] == '-endability':
         player, _ = parse_pokemon(args[2])
         if player != self.player_num:
             opp = self.game_data.opp_active
             if len(args) <= 3:
                 opp.update_ability('')
             #Only remove ability if currently has ability
             #Needed because -endability is sent after using transform
             if len(args) > 3 and opp.ability == clean_name(args[3]):
                 opp.update_ability('')
     if args[1] == '-transform':
         player, _ = parse_pokemon(args[2])
         p = self.game_data.active
         opp = self.game_data.opp_active
         if player == self.player_num:
             self.game_data.boosts = self.game_data.opp_boosts.copy()
             #Update opponent data before transforming because
             #p.transform copies opponent data
             opp.set_ability(p.ability)
             opp.moves = []
             for move in p.moves:
                 opp.moves.append(Move(move.name))
             p.transform(opp)
         else:
             self.check_item_ability(player, kwargs)
             opp.transform(p)
             self.game_data.opp_boosts = self.game_data.boosts.copy()
     if args[1] == '-zpower':
         player, _ = parse_pokemon(args[2])
         if player == self.player_num:
             self.game_data.zmove = True
         else:
             self.game_data.opp_zmove = True
     if args[1] == '-mega':
         player, _ = parse_pokemon(args[2])
         if player == self.player_num:
             self.game_data.mega = True
         else:
             self.game_data.opp_mega = True
             self.game_data.opp_active.item = clean_name(args[4])
     if args[1] == '-start':
         player, _ = parse_pokemon(args[2])
         p = self.get_active(player)
         effects = self.get_poke_effects(player)
         m = re.match('(move: )?(.*)', args[3])
         eff = clean_name(m.group(2))
         if eff == 'typechange':
             if 'from' in kwargs:
                 arg = kwargs['from']
                 if arg == 'move: Reflect Type':
                     player2, _ = parse_pokemon(kwargs['of'])
                     p2 = self.get_active(player2)
                     p.types = p2.types.copy()
                 else:
                     if arg == 'Protean' or arg == 'Color Change':
                         p.set_ability(clean_name(arg))
                     new_type = clean_name(args[4])
                     p.types = [new_type]
             else:
                 new_type = clean_name(args[4])
                 p.types = [new_type]
         elif eff == 'typeadd':
             new_type = clean_name(args[4])
             p.types.append(new_type)
         elif eff in effects:
             effects[eff] = True
         else:
             self.logger.info('Unknown effect: %s', eff)
     if args[1] == '-end':
         player, _ = parse_pokemon(args[2])
         effects = self.get_poke_effects(player)
         m = re.match('(move: )?(.*)', args[3])
         eff = clean_name(m.group(2))
         if eff in effects:
             effects[eff] = False
         else:
             self.logger.info('Unknown effect: %s', eff)
     if args[1] == '-activate':
         player, _ = parse_pokemon(args[2])
         p = self.get_active(player)
         m = re.match('(?:(move|ability|item): )?(.*)', args[3])
         eff = clean_name(m.group(2))
         if m.group(1) == 'ability':
             p.set_ability(eff)
         elif m.group(1) == 'item':
             p.item = eff
         #Handle some special activations
         if eff == 'mummy':
             ofpoke = kwargs['of']
             ofplayer, _ = parse_pokemon(ofpoke)
             p2 = self.get_active(ofplayer)
             old_ability = clean_name(args[4])
             p2.set_ability(old_ability)
             p2.update_ability('mummy')
         elif eff == 'forewarn':
             name = clean_name(args[4])
             ofpoke = kwargs['of']
             ofplayer, _ = parse_pokemon(ofpoke)
             if ofplayer != self.player_num:
                 #Update opponent moves
                 opp_moves = self.game_data.opp_active.moves
                 for i in range(len(opp_moves)):
                     if opp_moves[i] == None:
                         opp_moves[i] = Move(name)
                         break
                     if opp_moves[i].name == name:
                         break
         elif eff == 'skillswap':
             ability1 = clean_name(args[4])
             ability2 = clean_name(args[5])
             ofpoke = kwargs['of']
             ofplayer, _ = parse_pokemon(ofpoke)
             p2 = self.get_active(ofplayer)
             p.set_ability(ability2)
             p.update_ability(ability1)
             p2.set_ability(ability1)
             p2.update_ability(ability2)
     if args[1] == '-sidestart':
         m = re.match('p(1|2): ', args[2])
         player = m.group(1)
         effects = self.get_side_effects(player)
         m = re.match('(move: )?(.*)', args[3])
         eff = clean_name(m.group(2))
         if eff == 'spikes' or eff == 'toxicspikes':
             effects[eff] += 1
         else:
             if eff in effects:
                 effects[eff] = True
     if args[1] == '-sideend':
         m = re.match('p(1|2): ', args[2])
         player = m.group(1)
         effects = self.get_side_effects(player)
         m = re.match('(move: )?(.*)', args[3])
         eff = clean_name(m.group(2))
         if eff == 'spikes' or eff == 'toxicspikes':
             effects[eff] = 0
         else:
             if eff in effects:
                 effects[eff] = False
     if args[1] == '-weather':
         weather = clean_name(args[2])
         if weather == 'none':
             self.game_data.weather = None
         else:
             self.game_data.weather = weather
             self.check_item_ability(self.player_num, kwargs)
     if args[1] == '-fieldstart':
         m = re.match('(move: )?(.*)', args[2])
         eff = clean_name(m.group(2))
         if eff.endswith('terrain'):
             self.game_data.terrain = eff
         else:
             if eff in self.game_data.field_effects:
                 self.game_data.field_effects[eff] = True
         self.check_item_ability(self.player_num, kwargs)
     if args[1] == '-fieldend':
         m = re.match('(move: )?(.*)', args[2])
         eff = clean_name(m.group(2))
         if eff.endswith('terrain'):
             self.game_data.terrain = None
         else:
             if eff in self.game_data.field_effects:
                 self.game_data.field_effects[eff] = False
コード例 #10
0
ファイル: teams.py プロジェクト: resonancellc/pkmn-ai
from pokemon import Team


def growl_effect(move, atk_pkmn, def_pkmn):
    def_pkmn.stat_mod['atk'] -= 1
    return (atk_pkmn, def_pkmn)


def tail_whip_effect(move, atk_pkmn, def_pkmn):
    def_pkmn.stat_mod['defn'] -= 1
    return (atk_pkmn, def_pkmn)


ally_team = Team(
    Pokemon('Charmander', Type.FIRE, None, 'Blaze', 'Male', 5, 20, 11, 10, 12,
            11, 13, Move('Scratch', Type.NORMAL, 40, 35, False),
            Move('Growl', Type.NORMAL, 0, 40, False, 100, 0, growl_effect)),
    Pokemon('Charmander', Type.FIRE, None, 'Blaze', 'Male', 5, 20, 11, 10, 12,
            11, 13, Move('Scratch', Type.NORMAL, 40, 35, False),
            Move('Growl', Type.NORMAL, 0, 40, False, 100, 0, growl_effect)),
)

enemy_team = Team(
    Pokemon(
        'Squirtle', Type.WATER, None, 'Torrent', 'Male', 5, 20, 11, 13, 11, 12,
        10, Move('Tackle', Type.NORMAL, 35, 35, False, 95),
        Move('Tail Whip', Type.NORMAL, 0, 40, False, 100, 0,
             tail_whip_effect)),
    Pokemon(
        'Squirtle', Type.WATER, None, 'Torrent', 'Male', 5, 20, 11, 13, 11, 12,
        10, Move('Tackle', Type.NORMAL, 35, 35, False, 95),
コード例 #11
0
#    CT attack method
##############################################################################
from pokemon import Move, Pokemon
from random import seed
seed(2)
m_L = [
    Move('rock-throw', 'rock', 50, 90, 2),
    Move('hyper-fang', 'normal', 80, 90, 2),
    Move('comet-punch', 'normal', 18, 85, 2),
    Move('pay-day', 'normal', 40, 100, 2)
]
p2 = Pokemon('pidgeot', 'normal', 'flying', m_L, 83, 80, 75, 70, 70)
m_L2 = [
    Move('slam', 'normal', 80, 75, 2),
    Move('thunder-punch', 'electric', 75, 100, 2),
    Move('thunderbolt', 'electric', 90, 100, 3),
    Move('thunder', 'electric', 110, 70, 3)
]
p1 = Pokemon('pikachu', 'electric', '', m_L2, 35, 55, 40, 50, 50)
print(p1)
print(p2)
print("Attack #1")
print("{} hp before:{}".format(p2.get_name(), p2.get_hp()))
p1.attack(Move('thunderbolt', 'electric', 90, 100, 3), p2)
print("{} hp after:{}".format(p2.get_name(), p2.get_hp()))
assert p2.get_hp() == 0
print('-' * 20)
m_L3 = [
    Move('bubble', 'water', 40, 100, 3),
    Move('rock-throw', 'rock', 50, 90, 2),
    Move('bone-club', 'ground', 65, 85, 2),