Executando verificação de segurança...
5

Pokémon Versão Texto: Episódio 1

POKÉMON EM TEXTO: EPISÓDIO 1

meu primeiro post aqui :) tive a ideia de um projeto de fazer um "jogo" de pokémon com todos os pokémon da primeira geração, só que uma versão em texto, sem nenhum gráfico. Então eu decidi que vou documentar todo o processo de fazer isso aqui, então lá vamos nós >:D.
Esse é meu primeiro projeto pessoal que tem realmente um objetivo, então por favor, me ajudem onde eu posso melhorar :)
Eu to estudando python como primeira linguagem, então obviamente eu vou usar ela (afinal eu não sei fazer nada com outras linguagens 😅)


EP 1: "MALDITA ARRAY TODA BUGADA!!" (╯°□°)╯︵ ┻━┻!

SIMBORA!!

A primeira coisa que eu fiz foi procurar na internet se tinha alguma coisa parecida para eu me inspirar, acabei não achando muita coisa, a única coisa que eu encontrei foi uma array em JavaScript com o nome dos pokémon e os status deles (nota: depois tenho que ver se os status são os mesmos que estão na wiki)
Depois de encontrar isso, eu fiquei pensando "como que eu vou transformar esse array GIGANTE numa lista em python sem ficar 20 anos fazendo? 🤔" Então eu pedi para meu amigo ChatGPT, assim, ele converteu aquela array gigante em uma lista gigante em python, prontinha para ser usada ;)

pokedex = [
    {
        "name": "Bulbasaur",
        "base": {
            "Attack": 49,
            "Defense": 49,
            "HP": 45,
            "Speed": 45
        }
    },
    {
        "name": "Ivysaur",
        "base": {
            "Attack": 62,
            "Defense": 63,
            "HP": 60,
            "Speed": 60
        }
    },
    {
        "name": "Venusaur",
        "base": {
            "Attack": 82,
            "Defense": 83,
            "HP": 80,
            "Speed": 80
        }

E assim por diante...

Só que a lista tava meio esquisita, por exemplo se eu quisesse pegar os dados de um pokémon específico, por exemplo o Onix, eu teria que saber o Índice do Onix na lista da pokedex, o que ia deixar o código bem confuso e difícil de escrever, então eu queria simplificar a lista, como fazer isso? Poderia mudar um pouco a lista.
em vez de ser {'name': 'nome do pokémon'}, {'base': status do pokémon} ser: nome_do_pokemon: {status_do_pokemon}

Então eu fiz um código que ia resolver isso pra mim, o código era um for, que para cada pokémon, escrevia {nome: {status}}

Ele ficou mais ou menos assim(eu nao me lembro direito)

for pokemon in pokedex:
    pokedex_nova.append({pokemon ["name"]: pokemon["base"]})

A lista ficou assim

[{'Bulbasaur': {'Attack': 49, 'Defense': 49, 'HP': 45, 'Speed': 45}}, 
{'Ivysaur': {'Attack': 62, 'Defense': 63, 'HP': 60, 'Speed': 60}},
{'Venusaur': {'Attack': 82, 'Defense': 83, 'HP': 80, 'Speed': 80}}

E assim por diante...

MAS... esse código gerava varios problemas, meu objetivo era conseguir pegar um valor apenas digitando pokedex["Onix"], por exemplo, mas isso não acontecia... pedi ajuda novamente pro meu amigo ChatGPT e acontece que, em vez de eu criar UM grande dicionário, eu criei UMA LISTA de dicionários, então o problema inicial continua, para resolver isso, é bem fácil, só preciso tirar esses primeiros colchetes, então a lista ficaria assim:

pokedex = 'Bulbasaur': {'Attack': 49, 'Defense': 49, 'HP': 45, 'Speed': 45}, 
'Ivysaur': {'Attack': 62, 'Defense': 63, 'HP': 60, 'Speed': 60},
'Venusaur': {'Attack': 82, 'Defense': 83, 'HP': 80, 'Speed': 80}

mas como eu vou fazer um código que faz isso pros 151 itens dessa lista? passei o resto do dia quebrando a cabeça pra ver se eu conseguia pensar em alguma coisa que faria isso, novamente recorri ao ChatGPT e eleme passou um código todo cheio de erros, eu modifiquei e ele ficou assim:

for pokemon in pokedex:
    for atributo, valor in pokemon.items():
        print(f"{atributo}:  {valor}")

(não entendi muito bem como funciona esse código, porque o for tem duas variaveis? Alguém pode me explicar por favor?)

depois foi só dar Ctrl+C e Ctrl+V e a lista está 100% pronta para a ação, eu posso só procurar o valor do Onix fazendo pokedex["Onix"]["HP"], por exemplo.

enfim, esse foi o fim da primeira semana mechendo nisso aí, no próximo episódio eu vou tentar:

  • criar um repostório no GitHub com esse projeto (sou uniciante no GitHub também)
  • começar o sistema de Batalhas
    E também alguns objetivos extras:
  • sistema de tipos
  • itens de cura
  • sistma de nível
  • colocar alguma coisa parecida com um sistema de história/escolhas

muito obrigado por acompanhar essa jornada até aqui (っ◔◡◔)っ...

se quiser pode deixar sugestões ou dias nos comentários e ATÉ O PRÓXIMO EPISÓDIO!! :D

Carregando publicação patrocinada...
4

O for que você disse que tem dois valores está apenas desestruturando o retorno de pokemon.items(), que é basicamente um objeto retornando chave e valor em uma tupla, que pode ser iterada no loop for, por exemplo:

pokemon = {
    "Taurus": {
        "Attack": 45,
        "Defense": 45,
        "HP": 60,
        "Speed": 40,
    }
}

Pra cada pokemon ele vai pegar chave e valor e retornar um array com varias tuplas.

pokemon = {
    "Taurus": [
        ("Attack", 45),
        ("Defense", 45),
        ("HP", 60),
        ("Speed", 40)
    ]
}

Seria esse o retorno, quando voce declara um for com duas variáveis, você tá basicamente dizendo que atributo = "Attack", valor = 45.

Mas é meio inútil você simplesmente jogar um print, porque você não tá salvando esses dados em nenhum lugar, eu faria um pouco diferente.

class Pokemon:
    def __init__(self, name, attibutes):
        self.name = name
        self.attributes = attributes
        
pokedex = [
    (1, Pokemon(
    "Bulbasaur", {
        "Attack": 49,
        "Defense": 49,
        "HP": 45,
        "Speed": 45
    })),
    (2, Pokemon(
    "Ivysaur", {
        "Attack": 49,
        "Defense": 49,
        "HP": 45,
        "Speed": 45
    })),
]

Daria pra ser mais eficiente e puxar a pokedex toda de dentro de um JSON e criar uma classe pokedex com métodos para filtrar e encontrar os pokémons a qualquer momento. Mas seguindo esse exemplo acredito que você possa escalar melhor seu código.

1

ah, eu acho que entendi o for, eu usei print porque não queria que o codigo refizesse isso toda vez que iniciasse o programa, mas só queria automatizar minha tarefa de fazer só uma lista com os 151 em vez de uma lista de listas

1

Entendi que oque você quis fazer era apenas transformar em outra estrutura de dados, a opção que eu dei fo apenas pra facilitar sua criação de funções e conseguir manipular os atributos de uma forma melhor. Como por exemplo criar funções de atacar, sofrer dano, etc.

No final do arquivo seria interessante acionar um script que salvasse os dados atuais dos pokémon em um arquivo JSON, para não perder os dados ao parar o programa. Creio que não vá precisar disso agora, mas seria essencial mais pra frente.

Inclusive sua ideia me inspirou a tentar fazer algo parecido com isso, sempre joguei muito pokémon desde criança kkkkkk. Mas acho que vou focar em algo mais parecido com o pokémon showdown. Enfim, boa sorte com o código, abçs!

1

Já que acabaste por criar uma classe para criar os pokémons, em vez de armazerar os dados em atributes criaria um atributo para cada dado para ser guardado:

class Pokemon:
    def __init__(self, name, atk, defense, hp, speed):
    self.name = name
    self.Attack = atk
    self.Defense = defense
    self.HP = hp
    self.Speed = speed
    
pokemon = Pokemon(Bulbasaur, 49, 49, 45, 45)

Assim para acessar os dados passamos depokemon.atributes["Attack"] parapokemon.Attack.

Só uma sugestão, na mesma um bom trabalho e espero que aprendas bastante com este projeto.

1

Com certeza, a única coisa que poderia ser diferente na sua sugestão é que, ao invés de passar cada atributo como prop, apenas desestruturar no init:

class Pokemon:
    def __init__(self, name, attibutes):
        self.name = name
        
        for attr_key, attr_value in attributes.items():
            # Example: self.HP = attributes["HP"]
            self.__dict__[attr_key] = attr_value

Desse jeito não ficaria tão verboso e facilitaria na hora de implementar novos atributos.

1
1

Cara, só uma ideia que talvez va te ajudar no futuro, ou talvez agora se for bem persistente...
Tu poderia mudar a estrutura de como organiza os pokemons pra uma estrutura de arvore pra facilitar a busca depois. Ainda não pensei muito bem em como estruturar nem se da pra implementar, mas adicionaria um desafio a mais e por experiencia propria acho que a sensação de entender como uma arvore binaria funciona é muito boa.

1

Entendo oque quer dizer, se fosse um projeto meu com certeza faria diferente. Deixei dessa maneira mais intuitiva pois queria que o OP conseguisse entender. Deixer muito complexo apenas criaria mais confusão, ainda mais pra quem tá iniciando.

Mas bom olhar crítico o seu!

1