Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 39 additions & 0 deletions homework-java-ironbattle/.gitignore
Original file line number Diff line number Diff line change
@@ -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
10 changes: 10 additions & 0 deletions homework-java-ironbattle/.idea/.gitignore

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

7 changes: 7 additions & 0 deletions homework-java-ironbattle/.idea/encodings.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

14 changes: 14 additions & 0 deletions homework-java-ironbattle/.idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions homework-java-ironbattle/.idea/vcs.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions homework-java-ironbattle/characters.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Warrior,Grommash,150,40,8
Wizard,Gandalf,80,45,35
17 changes: 17 additions & 0 deletions homework-java-ironbattle/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>org.example</groupId>
<artifactId>homework-java-ironbattle</artifactId>
<version>1.0-SNAPSHOT</version>

<properties>
<maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

</project>
3 changes: 3 additions & 0 deletions homework-java-ironbattle/src/main/java/Attacker.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
public interface Attacker {
void attack(Character target);
}
42 changes: 42 additions & 0 deletions homework-java-ironbattle/src/main/java/BattleEngine.java
Original file line number Diff line number Diff line change
@@ -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;
}
}
}
}
40 changes: 40 additions & 0 deletions homework-java-ironbattle/src/main/java/Character.java
Original file line number Diff line number Diff line change
@@ -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;
}
}
174 changes: 174 additions & 0 deletions homework-java-ironbattle/src/main/java/Main.java
Original file line number Diff line number Diff line change
@@ -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);
}
}
Loading