Je suis désolé de dire que j'ai redémarré Pokemon Go à partir de janvier de l'année dernière. Je le fais depuis un an, mais il y a eu également un gros ajout du côté de Pokemon Go. C'est un match en ligne tant attendu. Cela ne m'intéressait pas, mais quand je l'ai essayé, c'était étonnamment amusant et je voulais moi-même penser à des simulations et à des batailles efficaces. Alors, comment collectez-vous les données Pokemon et les données techniques? C'est une histoire.
C'était la première méthode que j'ai proposée. Toutes les données de statut et de compétence dans Pokemon Go, y compris les sites étrangers et les sites nationaux, sont ouvertes au public. Cependant, comme il n'est pas destiné à un usage secondaire, un procédé pour l'extraire de la bande par grattage, etc. est nécessaire.
Un référentiel qui publie des données étendues où il a démontré sa puissance de recherche, comme la recherche Google [[pokemongo-dev-contrib / pokemongo-game-master](https://github.com/pokemongo-dev-contrib/pokemongo- game-master)] a été rencontré. J'ai donc pensé qu'un cas était réglé, mais ** il y avait trop de choses supplémentaires dans les données **. En plus des Pokémon et des données techniques, il comprend également les costumes des joueurs et diverses valeurs de réglage.
À propos, ce fichier est nommé ** GAME_MASTER.json ** et contient beaucoup de données de réglage Pokemon GO telles que les données de costume, les valeurs de réglage de bataille PvP, les données Pokemon, l'énergie des compétences, etc. comme mentionné ci-dessus. Pour cette raison, c'est une grande taille de 3,4 Mo et il y a du gaspillage. Tout d'abord, nous en extrairons les données nécessaires.
Puisqu'il existe diverses données, examinez d'abord la partie données de Pokemon.
GAME_MASTER.Extrait partiel et mise en forme des données Pokemon de JSON
{
"itemTemplates": [{
"templateId": "V0001_POKEMON_BULBASAUR",
"pokemonSettings": {
"pokemonId": "BULBASAUR",
"type": "POKEMON_TYPE_GRASS",
"type2": "POKEMON_TYPE_POISON",
"stats": {
"baseStamina": 128,
"baseAttack": 118,
"baseDefense": 111
},
"quickMoves": ["VINE_WHIP_FAST", "TACKLE_FAST"],
"cinematicMoves": ["SLUDGE_BOMB", "SEED_BOMB", "POWER_WHIP"],
},
}],
C'était là. Dans la figure, seule la partie des données jugée importante cette fois-ci a été extraite, mais diverses autres données sont également incluses. Bien qu'il ne soit pas suffisant de le résumer, il peut être déduit du nom de la clé et des données comme suit.
Key | Contenu des données |
---|---|
templateId | Identifiant de données Pokémon |
pokemonId | Nom du Pokémon |
stats | Valeur de la course |
type | type |
quickMoves | Technique 1 |
cinematicMoves | Technique 2 |
De plus, ces données ne semblent pas inclure de techniques pour une durée limitée.
Je pense que vous êtes 100 fois plus détaillé que moi à ce stade, mais je publierai mon programme pour le moment. Chaque donnée est séparée par une virgule afin de pouvoir être utilisée au format csv. Je ne voulais pas utiliser les données techniques telles quelles, alors je les ai attachées de force avec :: comme délimiteur.
GAME_MASTER_pokemon_parser.py
# -*- coding: utf-8 -*-
import json
import re
#Préparez un modèle pour l'expression régulière qui correspond aux données de Pokemon
pattern = '^V0\d+_POKEMON_.+'
f = open('GAME_MASTER.json', 'r')
json_dict = json.load(f)
#En tant que clé supérieure"itemTemplates"Puisqu'il y en a, déployez-le d'abord.
for json_list in json_dict["itemTemplates"]:
templateIdData = json_list["templateId"]
result = re.match(pattern, templateIdData)
#Extraire les données nécessaires lorsqu'elles correspondent aux données Pokemon
if (result):
#Accéder aux données du dictionnaire au format get car certains Pokémon n'ont pas de données de compétences
#(Doble n'avait pas la compétence)
quickMoves = json_list["pokemonSettings"].get("quickMoves")
quickMovesStr = ""
if quickMoves is not None:
for quickMovesStrTemp in quickMoves:
quickMovesStr = quickMovesStr + quickMovesStrTemp + "::"
cinematicMoves = json_list["pokemonSettings"].get("cinematicMoves")
cinematicMovesStr = ""
if cinematicMoves is not None:
for cinematicMovesStrTemp in cinematicMoves:
cinematicMovesStr = cinematicMovesStr + cinematicMovesStrTemp + "::"
outPokemon = json_list.get("templateId") + "," + str(json_list["pokemonSettings"].get("type")) + "," + str(json_list["pokemonSettings"].get("type2")) + "," + str(json_list["pokemonSettings"]["stats"]["baseStamina"]) + "," + str(json_list["pokemonSettings"]["stats"]["baseAttack"]) + "," + str(json_list["pokemonSettings"]["stats"]["baseDefense"])+ ',' +quickMovesStr + ',' + cinematicMovesStr
print(str(outPokemon))
Lorsqu'il est exécuté, il sera émis vers la sortie standard dans le format suivant. ** Identifiant de données Pokemon, Pokemon type 1, Pokemon type 2, endurance de valeur de course, attaque de valeur de course, défense de valeur de course, technique de valeur de course 1, technique de valeur de course 2 **
Résultat d'exécution.csv (extrait partiel)
V0808_POKEMON_MELTAN,POKEMON_TYPE_STEEL,None,130,118,99,THUNDER_SHOCK_FAST::,FLASH_CANNON::THUNDERBOLT::
V0809_POKEMON_MELMETAL,POKEMON_TYPE_STEEL,None,264,226,190,THUNDER_SHOCK_FAST::,FLASH_CANNON::THUNDERBOLT::HYPER_BEAM::ROCK_SLIDE::SUPER_POWER::
Tout d'abord, j'ai pu récupérer les données Pokémon sous forme de données brutes. Cependant, ces données présentent les problèmes suivants:
(1) Non compatible avec le japonais (2) Il n'y a pas de numéro de livre d'images (3) Arora, ombre, réécriture, arrangement normal (?) (4) Les mouvements limités ne sont pas inclus
Il semble que (2) - (4) peuvent être traités mécaniquement. Concernant (1), je me demande si je peux préparer le numéro du livre d'images et les données cartographiques. Cependant, que dois-je faire des données techniques?
Lorsque j'ai pu accéder directement à l'API, elle était pleine d'articles techniques tels que la recherche, la vérification de la valeur individuelle et le modoki GO Plus. En raison de la fin du boom et des mesures prises par l'exploitant, il est tombé aussitôt ... Je suis simplement reconnaissant aux utilisateurs qui ont continué à jouer et à analyser.
Les données techniques au moment du PvP sont les suivantes. Le plus gênant est ** "durationTurns" **. Il représente le temps de rigidité [s] de la technique 1 au moment du PvP, mais il semble que le temps de rigidité [s] = 1 + duréeTurns de la technique. Et lorsque le temps de rigidité était de 1 [s], cette clé n'était pas disponible. ** VOLT_SWITCH est rigide de 4 secondes, DRAGON_BREATH est rigide de 1 seconde **
"templateId": "COMBAT_V0250_MOVE_VOLT_SWITCH_FAST",
"combatMove": {
"uniqueId": "VOLT_SWITCH_FAST",
"type": "POKEMON_TYPE_ELECTRIC",
"power": 12.0,
"vfxName": "volt_switch_fast",
"durationTurns": 3,
"energyDelta": 16
}
"templateId": "COMBAT_V0204_MOVE_DRAGON_BREATH_FAST",
"combatMove": {
"uniqueId": "DRAGON_BREATH_FAST",
"type": "POKEMON_TYPE_DRAGON",
"power": 4.0,
"vfxName": "dragon_breath_fast",
"energyDelta": 3
}
Recommended Posts