diff --git a/homework-java-ironbattle/.gitignore b/homework-java-ironbattle/.gitignore new file mode 100644 index 0000000..480bdf5 --- /dev/null +++ b/homework-java-ironbattle/.gitignore @@ -0,0 +1,39 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ +.kotlin + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/homework-java-ironbattle/.idea/.gitignore b/homework-java-ironbattle/.idea/.gitignore new file mode 100644 index 0000000..ab1f416 --- /dev/null +++ b/homework-java-ironbattle/.idea/.gitignore @@ -0,0 +1,10 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Ignored default folder with query files +/queries/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml +# Editor-based HTTP Client requests +/httpRequests/ diff --git a/homework-java-ironbattle/.idea/encodings.xml b/homework-java-ironbattle/.idea/encodings.xml new file mode 100644 index 0000000..aa00ffa --- /dev/null +++ b/homework-java-ironbattle/.idea/encodings.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/homework-java-ironbattle/.idea/misc.xml b/homework-java-ironbattle/.idea/misc.xml new file mode 100644 index 0000000..fdc35ea --- /dev/null +++ b/homework-java-ironbattle/.idea/misc.xml @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git a/homework-java-ironbattle/.idea/vcs.xml b/homework-java-ironbattle/.idea/vcs.xml new file mode 100644 index 0000000..6c0b863 --- /dev/null +++ b/homework-java-ironbattle/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/homework-java-ironbattle/characters.csv b/homework-java-ironbattle/characters.csv new file mode 100644 index 0000000..0f91811 --- /dev/null +++ b/homework-java-ironbattle/characters.csv @@ -0,0 +1,2 @@ +Warrior,Grommash,150,40,8 +Wizard,Gandalf,80,45,35 \ No newline at end of file diff --git a/homework-java-ironbattle/pom.xml b/homework-java-ironbattle/pom.xml new file mode 100644 index 0000000..e54df62 --- /dev/null +++ b/homework-java-ironbattle/pom.xml @@ -0,0 +1,17 @@ + + + 4.0.0 + + org.example + homework-java-ironbattle + 1.0-SNAPSHOT + + + 21 + 21 + UTF-8 + + + \ No newline at end of file diff --git a/homework-java-ironbattle/src/main/java/Attacker.java b/homework-java-ironbattle/src/main/java/Attacker.java new file mode 100644 index 0000000..c94f447 --- /dev/null +++ b/homework-java-ironbattle/src/main/java/Attacker.java @@ -0,0 +1,3 @@ +public interface Attacker { + void attack(Character target); +} \ No newline at end of file diff --git a/homework-java-ironbattle/src/main/java/BattleEngine.java b/homework-java-ironbattle/src/main/java/BattleEngine.java new file mode 100644 index 0000000..c033dd7 --- /dev/null +++ b/homework-java-ironbattle/src/main/java/BattleEngine.java @@ -0,0 +1,42 @@ +public class BattleEngine { + + public void startBattle(Character player1, Character player2) { + if (player1 == null || player2 == null) { + System.out.println("\n[!] You must create both characters first!"); + return; + } + + boolean finished = false; + + while (!finished) { + System.out.println("\n===== BATTLE STARTS ====="); + int round = 1; + + while (player1.isAlive() && player2.isAlive()) { + System.out.println("\n----- Round " + round + " -----"); + + player1.attack(player2); + player2.attack(player1); + + System.out.println("-> " + player1.getName() + " HP: " + player1.getHp()); + System.out.println("-> " + player2.getName() + " HP: " + player2.getHp()); + + round++; + } + + if (!player1.isAlive() && !player2.isAlive()) { + System.out.println("\n[!] It's a tie! Both combatants died. Restarting battle..."); + player1.reset(); + player2.reset(); + } + else if (player1.isAlive()) { + System.out.println("\n*** Winner is: " + player1.getName() + " ***"); + finished = true; + } + else { + System.out.println("\n*** Winner is: " + player2.getName() + " ***"); + finished = true; + } + } + } +} \ No newline at end of file diff --git a/homework-java-ironbattle/src/main/java/Character.java b/homework-java-ironbattle/src/main/java/Character.java new file mode 100644 index 0000000..5d890e4 --- /dev/null +++ b/homework-java-ironbattle/src/main/java/Character.java @@ -0,0 +1,40 @@ +import java.util.UUID; + +public abstract class Character implements Attacker { + + private String id; + private String name; + private int hp; + private int maxHp; + private boolean isAlive = true; + + public Character(String name, int hp) { + this.id = UUID.randomUUID().toString(); + this.name = name; + this.hp = hp; + this.maxHp = hp; + } + + public String getId() { return id; } + public String getName() { return name; } + public int getHp() { return hp; } + public boolean isAlive() { return isAlive; } + + public void setId(String id) { this.id = id; } + public void setName(String name) { this.name = name; } + public void setAlive(boolean alive) { isAlive = alive; } + + public void setHp(int hp) { + this.hp = hp; + if (this.hp <= 0) { + this.hp = 0; + this.isAlive = false; + } + } + + + public void reset() { + this.hp = maxHp; + this.isAlive = true; + } +} \ No newline at end of file diff --git a/homework-java-ironbattle/src/main/java/Main.java b/homework-java-ironbattle/src/main/java/Main.java new file mode 100644 index 0000000..9dc40da --- /dev/null +++ b/homework-java-ironbattle/src/main/java/Main.java @@ -0,0 +1,174 @@ +import java.io.BufferedReader; +import java.io.FileReader; +import java.util.Random; +import java.util.Scanner; + +public class Main { + static Scanner scanner = new Scanner(System.in); + + static Character player1; + static Character player2; + + static BattleEngine engine = new BattleEngine(); + + public static void main(String[] args) { + boolean running = true; + + while (running) { + System.out.println("\n===== BATTLE SIMULATOR ====="); + System.out.println("1. Create Warrior"); + System.out.println("2. Create Wizard"); + System.out.println("3. Start Battle"); + System.out.println("4. Random Simulation"); + System.out.println("5. Import from CSV"); + System.out.println("6. Exit"); + System.out.print("Choose option: "); + + int choice = -1; + try { + choice = scanner.nextInt(); + scanner.nextLine(); + } catch (Exception e) { + System.out.println("[!] Invalid input! Please enter a number."); + scanner.nextLine(); + continue; + } + + switch (choice) { + case 1 -> createCharacter("Warrior"); + case 2 -> createCharacter("Wizard"); + case 3 -> { + if (player1 == null || player2 == null) { + System.out.println("\n[!] You must create both characters first!"); + } else { + engine.startBattle(player1, player2); + } + } + case 4 -> randomSimulation(); + case 5 -> importFromCSV(); + case 6 -> { + System.out.println("Exiting... Goodbye!"); + running = false; + } + default -> System.out.println("[!] Invalid option!"); + } + } + } + + private static void importFromCSV() { + System.out.print("Enter the name of the CSV file (e.g., characters.csv): "); + String fileName = scanner.nextLine(); + + try (BufferedReader br = new BufferedReader(new FileReader(fileName))) { + String line; + int count = 0; + + while ((line = br.readLine()) != null) { + if (line.trim().isEmpty()) continue; + + String[] data = line.split(","); + + if (data.length < 5) { + System.out.println("[!] Skipping invalid line: " + line); + continue; + } + + String type = data[0].trim(); + String name = data[1].trim(); + int stat1 = Integer.parseInt(data[2].trim()); + int stat2 = Integer.parseInt(data[3].trim()); + int stat3 = Integer.parseInt(data[4].trim()); + + if (type.equalsIgnoreCase("Warrior")) { + assignCharacter(new Warrior(name, stat1, stat2, stat3)); + count++; + } else if (type.equalsIgnoreCase("Wizard")) { + assignCharacter(new Wizard(name, stat1, stat2, stat3)); + count++; + } else { + System.out.println("[!] Unknown character type: " + type); + } + + if (count == 2) { + System.out.println("Two characters imported. Stopping read process."); + break; + } + } + + System.out.println("\n*** Import finished successfully! ***"); + + } catch (Exception e) { + System.out.println("[!] Error reading file: " + e.getMessage()); + System.out.println("Make sure the file exists and is in the correct directory."); + } + } + + private static int getValidInput(String prompt, int min, int max) { + int value; + while (true) { + System.out.print(prompt + " (" + min + "-" + max + "): "); + try { + value = scanner.nextInt(); + if (value >= min && value <= max) { + break; + } else { + System.out.println("[!] Error: Value must be between " + min + " and " + max + "!"); + } + } catch (Exception e) { + System.out.println("[!] Error: Please enter a valid number!"); + scanner.nextLine(); + } + } + return value; + } + + private static void createCharacter(String type) { + System.out.print("Enter name for " + type + ": "); + String name = scanner.nextLine(); + + if (type.equals("Warrior")) { + int hp = getValidInput("Enter HP", 100, 200); + int stamina = getValidInput("Enter Stamina", 10, 50); + int strength = getValidInput("Enter Strength", 1, 10); + assignCharacter(new Warrior(name, hp, stamina, strength)); + } else if (type.equals("Wizard")) { + int hp = getValidInput("Enter HP", 50, 100); + int mana = getValidInput("Enter Mana", 10, 50); + int intelligence = getValidInput("Enter Intelligence", 1, 50); + assignCharacter(new Wizard(name, hp, mana, intelligence)); + } + + scanner.nextLine(); + System.out.println("\n*** " + type + " created successfully! ***"); + } + + private static void assignCharacter(Character c) { + if (player1 == null) { + player1 = c; + System.out.println("[Player 1 set to " + c.getName() + " (" + c.getClass().getSimpleName() + ")]"); + } else if (player2 == null) { + player2 = c; + System.out.println("[Player 2 set to " + c.getName() + " (" + c.getClass().getSimpleName() + ")]"); + } else { + System.out.println("[Both slots full! Overwriting Player 1...]"); + player1 = c; + } + } + + public static void randomSimulation() { + Random random = new Random(); + + player1 = new Warrior("RandomWarrior", + 100 + random.nextInt(101), + 10 + random.nextInt(41), + 1 + random.nextInt(10)); + + player2 = new Wizard("RandomWizard", + 50 + random.nextInt(51), + 10 + random.nextInt(41), + 1 + random.nextInt(50)); + + System.out.println("\n[!] Random characters created!"); + engine.startBattle(player1, player2); + } +} \ No newline at end of file diff --git a/homework-java-ironbattle/src/main/java/Warrior.java b/homework-java-ironbattle/src/main/java/Warrior.java new file mode 100644 index 0000000..7825ef8 --- /dev/null +++ b/homework-java-ironbattle/src/main/java/Warrior.java @@ -0,0 +1,47 @@ +import java.util.Random; + +public class Warrior extends Character { + + private int stamina; + private int maxStamina; + private int strength; + private Random random = new Random(); + + public Warrior(String name, int hp, int stamina, int strength) { + super(name, hp); + this.stamina = stamina; + this.maxStamina = stamina; + this.strength = strength; + } + + public int getStamina() { return stamina; } + public void setStamina(int stamina) { this.stamina = stamina; } + public int getStrength() { return strength; } + public void setStrength(int strength) { this.strength = strength; } + + @Override + public void attack(Character target) { + boolean isHeavyAttack = random.nextBoolean(); + + if (isHeavyAttack && stamina >= 5) { + int damage = strength; + target.setHp(target.getHp() - damage); + stamina -= 5; + System.out.println(getName() + " used Heavy Attack! Damage: " + damage + " | Stamina left: " + stamina); + } else if (stamina >= 1) { + int damage = strength / 2; + target.setHp(target.getHp() - damage); + stamina += 1; + System.out.println(getName() + " used Weak Attack! Damage: " + damage + " | Stamina: " + stamina); + } else { + stamina += 2; + System.out.println(getName() + " had no stamina and recovered! Stamina: " + stamina); + } + } + + @Override + public void reset() { + super.reset(); + this.stamina = maxStamina; + } +} \ No newline at end of file diff --git a/homework-java-ironbattle/src/main/java/Wizard.java b/homework-java-ironbattle/src/main/java/Wizard.java new file mode 100644 index 0000000..b527974 --- /dev/null +++ b/homework-java-ironbattle/src/main/java/Wizard.java @@ -0,0 +1,51 @@ +import java.util.Random; + +public class Wizard extends Character { + + private int mana; + private final int maxMana; + private int intelligence; + private Random random = new Random(); + + public Wizard(String name, int hp, int mana, int intelligence) { + super(name, hp); + this.mana = mana; + this.maxMana = mana; + this.intelligence = intelligence; + } + + + public int getMana() { return mana; } + + public void setMana(int mana) { this.mana = mana; } + + public int getIntelligence() { return intelligence; } + + public void setIntelligence(int intelligence) { this.intelligence = intelligence; } + + @Override + public void attack(Character target) { + boolean castFireball = random.nextBoolean(); + + if (castFireball && mana >= 5) { + int damage = intelligence; + target.setHp(target.getHp() - damage); + mana -= 5; + System.out.println(getName() + " cast Fireball! Damage: " + damage + " | Mana left: " + mana); + } else if (mana >= 1) { + int damage = 2; + target.setHp(target.getHp() - damage); + mana += 1; + System.out.println(getName() + " used Staff Hit! Damage: " + damage + " | Mana: " + mana); + } else { + mana += 2; + System.out.println(getName() + " had no mana and recovered! Mana: " + mana); + } + } + + @Override + public void reset() { + super.reset(); + this.mana = maxMana; + } +} \ No newline at end of file