homework commit

This commit is contained in:
Edoardo Vergerio
2026-08-24 13:49:19 +02:00
parent b223b69563
commit 5100d055be
5552 changed files with 5014 additions and 0 deletions
Binary file not shown.
Binary file not shown.
+215
View File
@@ -0,0 +1,215 @@
import random
import math
import game_data as gd
import copy
class Pokemon:
def __init__(self, national_pokedex_number, name, level = 1, types = [], baseStats = {}, moves = [], curr_hp = 0):
self.national_pokedex_number = national_pokedex_number
self.name = name
self.level = level
self.types = types
self.baseStats = baseStats
self.moves_dict = {}
if len(self.moves_dict) > 4:
raise ValueError("A Pokemon can only have 4 moves.")
else:
for move in moves:
if move not in gd.available_moves:
raise ValueError(f"{move} is not an available move.")
else:
self.moves_dict[move] = copy.deepcopy(gd.available_moves[move])
print(gd.available_moves[move]['PP'])
print("TYPE", type(gd.available_moves[move]))
self.curr_hp = self.baseStats['hp']
def _get_baseStats(self):
return self.baseStats
def get_current_hp(self):
return self.curr_hp
def can_battle(self):
condition1 = self.curr_hp > 0
condition2 = False
for move in self.moves_dict:
move_usage_avail = self.moves_dict[move]['PP'] > 0
if move_usage_avail:
condition2 = True
break
else:
condition2 = False
return condition1 and condition2
def learnMove(self, move):
if len(self.moves_dict) >= 4:
raise ValueError("A Pokemon can only have 4 moves.")
else:
self.moves_dict[move] = gd.available_moves[move]
def _useMove(self, move, opponent):
if move['PP'] > 0:
if random.random() < move['accuracy']:
if move['category'] == 'physical':
attack = self.baseStats['attack']
defense = opponent.baseStats['defense']
else:
attack = self.baseStats['special']
defense = opponent.baseStats['special']
stability = 1.5 if move['type'] in self.types else 1
effect = 1
critical = 2 if random.random() < self.baseStats['speed']/512 else 1
luck = random.uniform(0.85, 1.0)
modifier = stability * effect * critical * luck
damage = math.floor((( 2 * self.level + 10) / 250 * (attack / defense) * move['power'] + 2) * modifier)
opponent.curr_hp -= damage
if opponent.curr_hp < 0:
opponent.curr_hp = 0
print(f"{self.name} used {move['name']} and dealt {damage} damage to {opponent.name}!")
move['PP'] = move['PP'] - 1
else:
print(f"{self.name}'s attack missed!")
move['PP'] = move['PP'] - 1
else:
print(f"{self.name} has no PP left for {move['name']}!")
pass
def useMove(self, move_name, opponent):
if move_name not in self.moves_dict:
raise ValueError(f"{self.name} does not know the move {move_name}.")
else:
self._useMove(self.moves_dict[move_name], opponent)
def print_move(self,move):
print(f"Move: {self.moves_dict[move]['name']}")
print(f"Type: {self.moves_dict[move]['type']}")
print(f"Category: {self.moves_dict[move]['category']}")
print(f"Power: {self.moves_dict[move]['power']}")
print(f"Accuracy: {self.moves_dict[move]['accuracy']}")
print(f"PP: {self.moves_dict[move]['PP']}")
def get_moves(self):
return list(self.moves_dict.keys())
def checkout_move(self, move_name):
if move_name not in self.moves_dict:
raise ValueError(f"{self.name} does not know the move {move_name}.")
else:
self.print_move(move_name)
def _status(self):
print(f"Pokemon: {self.name}")
print(f"Level: {self.level}")
print(f"Types: {self.types}")
print(f"Base Stats: {self.baseStats}")
print(f"Current HP: {self.curr_hp}")
print(f"Moves: {self.moves_dict}")
def print_pokemon_info(self):
self._status()
class Trainer:
def __init__(self, name, starter_name, items = {"potions": 0, "pokeball": 0}, is_CPU = False):
self.name = name
if is_CPU:
if starter_name not in gd.available_wild_pokemons:
raise ValueError(f"{starter_name} is not an available wild Pokemon.")
else:
self.starter = starter_name
self.active_pokemon = Pokemon(**gd.available_wild_pokemons[starter_name])
self.pokemon_list = []
self.add_pokemon(self.active_pokemon)
else:
if starter_name not in gd.available_starters:
raise ValueError(f"{starter_name} is not an available starter Pokemon.")
else:
self.starter = starter_name
self.active_pokemon = Pokemon(**gd.available_starters[starter_name])
self.pokemon_list = []
self.add_pokemon(self.active_pokemon)
self.items = items
self.is_CPU = is_CPU
def add_pokemon(self, pokemon):
if len(self.pokemon_list) >= 6:
raise ValueError("A trainer can only have 6 Pokemon.")
else:
self.pokemon_list.append(pokemon)
def get_pokemon_list(self):
return [pok.name for pok in self.pokemon_list]
def get_pokemon(self, name):
for pokemon in self.pokemon_list:
if pokemon.name == name:
return pokemon
raise ValueError(f"{name} is not in the trainer's Pokemon list.")
def can_battle(self):
for pokemon in self.pokemon_list:
if pokemon.can_battle():
return True
return False
def active_pokemon_can_battle(self):
return self.active_pokemon.can_battle()
def _change_active_pokemon(self,new_pokemon):
self.active_pokemon = new_pokemon
def get_active_pokemon(self):
return self.active_pokemon
def change_active_pokemon(self,pokemon_name):
try:
new_pokemon = self.get_pokemon(pokemon_name)
self._change_active_pokemon(new_pokemon)
print("Pokemon change successfull!")
except ValueError as e:
raise e
def print_items(self):
print(f"1) Potions: {self.items['potions']}")
print(f"2) Pokeballs: {self.items['pokeball']}")
def use_item(self, item_name):
if item_name not in self.items:
raise ValueError(f"{item_name} is not an available item.")
else:
if self.items[item_name] > 0:
self.items[item_name] -= 1 #use the item
print(f"Used {item_name}. Remaining: {self.items[item_name]}")
if item_name == "potions":
self.active_pokemon.curr_hp += 20
if self.active_pokemon.curr_hp > self.active_pokemon.baseStats['hp']:
self.active_pokemon.curr_hp = self.active_pokemon.baseStats['hp']
print(f"{self.active_pokemon.name} has been healed by 20 HP!")
return False
elif item_name == "pokeball":
return True
else:
raise ValueError(f"You have no {item_name} left.")
def update_pokemon_list(self, pokemon):
pass
def _status(self):
print('='*30)
print(f"Trainer name: {self.name}")
print(f"Starter Pokemon: {self.starter}")
print(f"Pokemon List: {[pok.name for pok in self.pokemon_list]}")
print("Active Pokemon info:")
self.active_pokemon.print_pokemon_info()
print("Detailed info of Pokemons in your list:")
print("-"*30)
for pokemon in self.pokemon_list:
pokemon.print_pokemon_info()
print("-"*30)
print(f"Items: {self.items}")
print('='*30)
def print_trainer_info(self):
self._status()
+120
View File
@@ -0,0 +1,120 @@
##########################
#known moves
##########################
tackle = {
'name': 'tackle',
'type': 'normal',
'category': 'physical',
'power': 35,
'accuracy': 0.95,
'PP': 35
}
razor_leaf = {
'name': 'razor leaf',
'type': 'grass',
'category': 'physical',
'power': 55,
'accuracy': 0.95,
'PP': 25
}
ember = {
'name': 'ember',
'type': 'fire',
'category': 'special',
'power': 40,
'accuracy': 1.0,
'PP': 25
}
water_gun = {
'name': 'water gun',
'type': 'water',
'category': 'special',
'power': 40,
'accuracy': 1.0,
'PP': 25
}
peck = {
"name": "peck",
"type": "flying",
"category": "physical",
"power": 35,
"accuracy": 1.0,
"PP": 35
}
twineedle = {
"name": "twineedle",
"type": "bug",
"category": "physical",
"power": 25,
"accuracy": 1.0,
"PP": 20
}
available_moves = {'tackle': tackle, 'razor leaf': razor_leaf, 'ember': ember, 'water gun': water_gun, 'peck': peck, 'twineedle': twineedle}
###########################
#starter pokemon
###########################
bulbasaur = {
'national_pokedex_number': 1,
'name': "bulbasaur",
'types': ["grass", "poison"],
'baseStats': {"hp": 45, "attack": 49, "defense": 49, "speed": 45, "special": 65},
'moves': ["tackle", "razor leaf"]
}
charmender = {
'national_pokedex_number': 4,
'name': "charmander",
'types': ["fire"],
'baseStats': {"hp": 39, "attack": 52, "defense": 43, "speed": 65, "special": 50},
'moves': ["tackle", "ember"]
}
squirtle = {
'national_pokedex_number': 7,
'name': "squirtle",
'types': ["water"],
'baseStats': {"hp": 44, "attack": 48, "defense": 65, "speed": 43, "special": 50},
'moves': ["tackle", "water gun"]
}
available_starters = {'bulbasaur': bulbasaur, 'charmander': charmender, 'squirtle': squirtle}
available_starter_names = list(available_starters.keys())
############################
############################
#wild pokemons
############################
caterpie = {
"national_pokedex_number": 10,
"name": "caterpie",
"types": ["bug"],
"baseStats": {"hp": 45, "attack": 30, "defense": 35, "speed": 45, "special": 20},
"moves" : ["twineedle"]
}
pidgey = {
"national_pokedex_number": 16,
"name": "pidgey",
"types": ["normal", "flying"],
"baseStats": {"hp": 40, "attack": 45, "defense": 40, "speed": 56, "special": 35},
"moves" : ["tackle", "peck"]
}
rattata = {
"national_pokedex_number": 19,
"name": "rattata",
"types": ["normal"],
"baseStats": {"hp": 30, "attack": 56, "defense": 35, "speed": 72, "special": 25},
"moves" : ["tackle"]
}
available_wild_pokemons = {'caterpie':caterpie, 'pidgey':pidgey, 'rattata':rattata}
available_wild_pokemon_names = list(available_wild_pokemons.keys())
+71
View File
@@ -0,0 +1,71 @@
import random
import math
import game_data as gd
from core import Trainer
def Main():
setup_complete = False
trainer_name = input("Enter your trainer name: ")
while not setup_complete:
try:
print("Available starter Pokemon: ", gd.available_starter_names)
starter_name = input("Choose your starter Pokemon: ")
trainer = Trainer(name=trainer_name, starter_name=starter_name)
print(f"{trainer.name} has chosen {trainer.get_active_pokemon().name} as their starter Pokemon!")
setup_complete = True
except ValueError as e:
print(e)
print("Please try again...")
continue
trainer.print_trainer_info()
cpu_trainer = Trainer(name="CPU", starter_name=random.choice(gd.available_starter_names))
print(f"CPU has chosen {cpu_trainer.get_active_pokemon().name} as their starter Pokemon!")
cpu_trainer.print_trainer_info()
continue_playing = True
while continue_playing:
selected_pokemon_combat_flag = False
while not selected_pokemon_combat_flag:
print("Choose a Pokemon from your list to battle with:\n", trainer.get_pokemon_list())
player_pokemon = input("Choose:")
try:
player_pokemon = trainer.get_pokemon(player_pokemon)
selected_pokemon_combat_flag = True
except ValueError as e:
print(e)
print("Please try again...")
selected_combat_move_flag = False
while not selected_combat_move_flag:
print(f"Choose a move for {player_pokemon.name} to use against {cpu_trainer.get_active_pokemon().name}:\n", player_pokemon.get_moves())
player_move_name = input("Choose:")
try:
#print the move selected by the player
print("Your selected move: ")
player_pokemon.checkout_move(player_move_name)
selected_combat_move_flag = True
except ValueError as e:
print(e)
print("Please try again...")
#make a combat
print('='*30)
print("BATTLE RESULTS:")
print("Your move:")
player_pokemon.useMove(player_move_name, cpu_trainer.get_active_pokemon())
player_pokemon.checkout_move(player_move_name)
print('-'*30)
print("CPU's pokemon")
cpu_trainer.get_active_pokemon().print_pokemon_info()
print('='*30)
print("Continue playing? (yes/no)")
response = input().strip().lower()
if response != "yes":
continue_playing = False
if __name__ == "__main__":
Main()