diff --git a/Pokemon/main.cpp b/Pokemon/main.cpp index b15829ec..c4b24bd7 100644 --- a/Pokemon/main.cpp +++ b/Pokemon/main.cpp @@ -1,73 +1,187 @@ #include +#include using namespace std; +// Define an enum for Pokemon choices enum class PokemonChoice { - Charmander, - Bulbasaur, - Squirtle, - InvalidChoice + CHARMANDER = 1, + BULBASAUR, + SQUIRTLE, + PIKACHU // Default choice }; -int main() { +// Define an enum for Pokemon types +enum class PokemonType { + FIRE, + GRASS, + WATER, + ELECTRIC, + NORMAL // Added for the default constructor +}; + +// Pokemon class definition +class Pokemon { +public: + // Attributes + string name; + PokemonType type; + int health; + + // Default constructor + Pokemon() { + name = "Unknown"; + type = PokemonType::NORMAL; + health = 50; + cout << "A new Pokemon has been created with the default constructor!\n"; + } + + // Parameterized constructor + Pokemon(string p_name, PokemonType p_type, int p_health) { + name = p_name; + type = p_type; + health = p_health; + cout << "A new Pokemon named " << name << " has been created!\n"; + } + + // Copy constructor + Pokemon(const Pokemon& other) { + name = other.name; + type = other.type; + health = other.health; + cout << "A new Pokemon has been copied from " << other.name << "!\n"; + } - PokemonChoice chosen_pokemon = PokemonChoice::InvalidChoice; + // Destructor + ~Pokemon() { + cout << name << " has been released.\n"; + } + // Method to simulate attacking (just for demonstration) + void attack() { + cout << name << " attacks with a powerful move!\n"; + } +}; + +// Player class definition +class Player { +public: + // Attributes string name; + Pokemon chosenPokemon; + + // Default constructor + Player() { + name = "Trainer"; + chosenPokemon = Pokemon(); // Using the default Pokemon constructor + cout << "A new player named " << name << " has been created!\n"; + } - int choice; - - cout << "Professor Oak: Hello there! Welcome to the world of Pokemon!\n"; - cout << "Professor Oak: My name is Oak. People call me the Pokemon Professor!\n"; - - cout << "Professor Oak: But enough about me. Let's talk about you!\n"; - - cout << "Professor Oak: First, tell me, what’s your name?\n"; - cin >> name; - cout << "Professor Oak: Ah, " << name<< "! What a fantastic name!\n"; - cout << "Professor Oak: You must be eager to start your adventure. But first, you will need a Pokemon of your own!\n"; - - cout << "Professor Oak: I have three Pokemon here with me. They are all quite feisty!\n"; - cout << "Professor Oak: Choose wisely...\n"; - cout << "1. Charmander - The fire type. A real hothead!\n"; - cout << "2. Bulbasaur - The grass type. Calm and collected!\n"; - cout << "3. Squirtle - The water type. Cool as a cucumber!\n"; - - cin >> choice; - - switch (choice) { - case 1: - chosen_pokemon = PokemonChoice::Charmander; - break; - case 2: - chosen_pokemon = PokemonChoice::Bulbasaur; - break; - case 3: - chosen_pokemon = PokemonChoice::Squirtle; - break; - default: - chosen_pokemon = PokemonChoice::InvalidChoice; - break; + // Parameterized constructor + Player(std::string p_name, Pokemon p_chosenPokemon) { + name = p_name; + chosenPokemon = p_chosenPokemon; + cout << "Player " << name << " has been created!\n"; } - switch (chosen_pokemon) { - case PokemonChoice::Charmander: - cout << "Professor Oak: A fiery choice! Charmander is yours!\n"; - break; - case PokemonChoice::Bulbasaur: - cout << "Professor Oak: A fine choice! Bulbasaur is always ready to grow on you!\n"; - break; - case PokemonChoice::Squirtle: - cout << "Professor Oak: Splendid! Squirtle will keep you cool under pressure!\n"; - break; - default: - cout << "Professor Oak: Hmm, that doesn't seem right. Let me choose for you...\n"; - chosen_pokemon = PokemonChoice::Charmander; - cout << "Professor Oak: Just kidding! Let's go with Charmander, the fiery dragon in the making!\n"; - break; + // Method to choose a Pokemon + void choosePokemon(int choice) { + switch ((PokemonChoice)choice) { + + case PokemonChoice::CHARMANDER: + chosenPokemon = Pokemon("Charmander", PokemonType::FIRE, 100); + break; + case PokemonChoice::BULBASAUR: + chosenPokemon = Pokemon("Bulbasaur", PokemonType::GRASS, 100); + break; + case PokemonChoice::SQUIRTLE: + chosenPokemon = Pokemon("Squirtle", PokemonType::WATER, 100); + break; + default: + chosenPokemon = Pokemon("Pikachu", PokemonType::ELECTRIC, 100); + break; + } + + cout << "Player " << name << " chose " << chosenPokemon.name << "!\n"; } +}; + +// ProfessorOak class definition +class ProfessorOak { +public: + // Attributes + string name; + + // Parameterized constructor + ProfessorOak(string p_name) { + name = p_name; + } + + // Method to greet the player + void greetPlayer(Player& player) { + cout << name << ": Hello there! Welcome to the world of Pokemon!\n"; + cout << name << ": My name is Oak. People call me the Pokemon Professor!\n"; + cout << name << ": But enough about me. Let's talk about you!\n"; + } + + // Method to ask the player to choose a Pokemon + void offerPokemonChoices(Player& player) { + cout << name << ": First, tell me, what’s your name?\n"; + getline(std::cin, player.name); + cout << name << ": Ah, " << player.name << "! What a fantastic name!\n"; + cout << name << ": You must be eager to start your adventure. But first, you’ll need a Pokemon of your own!\n"; + + // Presenting Pokemon choices + cout << name << ": I have three Pokemon here with me. They’re all quite feisty!\n"; + cout << name << ": Choose wisely...\n"; + cout << "1. Charmander - The fire type. A real hothead!\n"; + cout << "2. Bulbasaur - The grass type. Calm and collected!\n"; + cout << "3. Squirtle - The water type. Cool as a cucumber!\n"; + + int choice; + cout << name << ": So, which one will it be? Enter the number of your choice: "; + cin >> choice; + + player.choosePokemon(choice); + } +}; + +int main() { + // Task 1: Test default and parameterized constructors + Pokemon defaultPokemon; // Using default constructor + Pokemon charmander("Charmander", PokemonType::FIRE, 100); // Using parameterized constructor + + cout << "Pokemon Details:\n"; + cout << "Name: " << defaultPokemon.name << "\nType: " << (int)defaultPokemon.type << "\nHealth: " << defaultPokemon.health << "\n"; + cout << "Name: " << charmander.name << "\nType: " << (int)charmander.type << "\nHealth: " << charmander.health << "\n"; + + // Task 2: Test the copy constructor + Pokemon bulbasaur("Bulbasaur", PokemonType::GRASS, 100); // Create a Pokemon + Pokemon bulbasaurCopy = bulbasaur; // Copy the Pokemon + cout << "Original Pokemon Health: " << bulbasaur.health << "\n"; + cout << "Copied Pokemon Health: " << bulbasaurCopy.health << "\n"; + + // Modify the copy + bulbasaurCopy.health = 80; + cout << "After Modification:\n"; + cout << "Original Pokemon Health: " << bulbasaur.health << "\n"; + cout << "Copied Pokemon Health: " << bulbasaurCopy.health << "\n"; + + // Task 3: Test the destructor + { + Pokemon squirtle("Squirtle", PokemonType::WATER, 100); // Pokemon will be destroyed at the end of this scope + } // Destructor will be called here + + // Continue with the main flow of the game + ProfessorOak professor("Professor Oak"); + Player player("Ash", charmander); + + // Greet the player and offer Pokemon choices + professor.greetPlayer(player); + professor.offerPokemonChoices(player); - cout << "Professor Oak: " << (chosen_pokemon == PokemonChoice::Charmander ? "Charmander" : chosen_pokemon == PokemonChoice::Bulbasaur ? "Bulbasaur" : "Squirtle") << " and you, " << name << ", are going to be the best of friends!\n"; + // Conclude the first chapter + cout << "Professor Oak: " << player.chosenPokemon.name << " and you, " << player.name << ", are going to be the best of friends!\n"; cout << "Professor Oak: Your journey begins now! Get ready to explore the vast world of Pokemon!\n"; return 0; -} +} \ No newline at end of file