Releasing version one.

This commit is contained in:
2026-05-13 13:21:41 +03:30
parent 78d4bedb08
commit 2ec3641f00
40 changed files with 562 additions and 62 deletions
+176 -6
View File
@@ -1,15 +1,185 @@
package org.project;
import org.project.entity.enemies.*;
import org.project.entity.players.Assassin;
import org.project.entity.players.Knight;
import org.project.entity.players.Player;
import org.project.entity.players.Wizard;
import org.project.item.armors.Armor;
import org.project.item.armors.KnightArmor;
import org.project.item.weapons.Sword;
import org.project.item.weapons.Weapon;
import org.project.location.Location;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO: ADD LOCATIONS TO YOUR GAME
List<Location> locations = new ArrayList<>();
// TODO: IMPLEMENT GAMEPLAY
public static void printBorder() {
for (int i = 0; i < 40; i++)
System.out.print("-");
System.out.println();
}
public static void printBorder(int x) {
for (int i = 0; i < 15; i++)
System.out.println();
for (int i = 0; i < x; i++)
System.out.print("-");
System.out.println();
}
public static int moveSelector() {
System.out.println("Choose your move:");
System.out.println("1. Light attack (Mana: 0) | 2. Normal attack (mana: 2) | 3. Heavy attack (mana: 3)");
System.out.println("4. Heal (5 mana) | 5. Skip");
Scanner in = new Scanner(System.in);
while (true) {
int answer = in.nextInt();
if (answer == 1 || answer == 2 || answer == 3 || answer == 4 || answer == 5)
return answer;
System.out.println("Invalid input try again.");
}
}
private static void fightEnemy(Player player, Location location, String enemyName, String locationDesc) {
String RED = "\u001B[31m";
String YELLOW = "\u001B[33m";
String RESET = "\u001B[0m";
System.out.printf("You're in the %s fighting a %s%s%s!\n", locationDesc, RED, enemyName, RESET);
while (player.isAlive() && location.getEnemy().getHP() > 0) {
// Player's turn: up to 5 actions
for (int i = 0; i < 5; i++) {
System.out.printf("%s | %sHP%s: %d, %sMP%s: %d\n",
player.getName(), RED, RESET, player.getHP(), YELLOW, RESET, player.getMP());
printBorder();
System.out.printf("%s | %sHP%s: %d, %sMP%s: %d\n",
enemyName, RED, RESET, location.getEnemy().getHP(), YELLOW, RESET, location.getEnemy().getMP());
System.out.println();
switch (moveSelector()) {
case 1: // Base Attack
location.getEnemy().takeDamage(player.getBaseDamage());
break;
case 2: // Normal Attack (2 mana)
if (player.useMana(2)) {
player.attack(location.getEnemy());
} else {
System.out.println("Not enough mana for Normal Attack!");
i--;
}
break;
case 3: // Heavy Attack (3 mana)
if (player.useMana(3)) {
player.heavyAttack(location.getEnemy());
} else {
System.out.println("Not enough mana for Heavy Attack!");
i--;
}
break;
case 4: // Heal (5 mana)
if (player.useMana(5)) {
player.heal(20);
} else {
System.out.println("Not enough mana to Heal!");
i--;
}
break;
}
printBorder();
// If enemy died or player died, end the player's turn early
if (location.getEnemy().getHP() <= 0 || !player.isAlive()) {
location.getEnemy().getKilled();
i = 5;
}
}
// Enemy's turn
if (location.getEnemy().getHP() > 0) {
for (int i = 0; i < 5; i++) {
location.getEnemy().attack(player);
printBorder();
if (!player.isAlive())
break;
}
}
// Restore mana after each full round
player.fillMana(6);
}
}
public static void main(String[] args) {
String RED = "\u001B[31m";
String YELLOW = "\u001B[33m";
String RESET = "\u001B[0m";
String GREEN = "\u001B[32m";
printBorder();
Scanner input = new Scanner(System.in);
System.out.println("Enter your name:");
String name = input.next();
printBorder();
Weapon sword = new Sword();
Armor armor = new KnightArmor();
Player player = null;
while (true) {
System.out.println("Chose your character:");
System.out.printf("1. Knight | %sHP%s: 100, %sMP%s: 10\n", RED, RESET, YELLOW, RESET);
System.out.printf("2. Wizard | %sHP%s: 150, %sMP%s: 10\n", RED, RESET, YELLOW, RESET);
System.out.printf("3. Assassin | %sHP%s: 80 , %sMP%s: 20\n", RED, RESET, YELLOW, RESET);
player = switch (input.nextInt()) {
case 1 -> new Knight(name, sword, armor);
case 2 -> new Wizard(name, sword, armor);
case 3 -> new Assassin(name, sword, armor);
default -> null;
};
if (player == null) {
System.out.println("Invalid input try again.");
} else
break;
}
Location overworld = new Location("Overworld", new Vampire(sword));
Location village = new Location("Village", new Goblin(sword));
Location nether = new Location("Nether", new Skeleton(sword));
Location end = new Location("End", new Dragon());
// Fight each enemy
fightEnemy(player, overworld, "Vampire", "Overworld");
if (!player.isAlive()) {
System.out.println("You lost!");
return;
}
fightEnemy(player, village, "Goblin", "Village");
if (!player.isAlive()) {
System.out.println("You lost!");
return;
}
fightEnemy(player, nether, "Skeleton", "Nether");
if (!player.isAlive()) {
System.out.println("You lost!");
return;
}
fightEnemy(player, end, "Dragon","End");
if (!player.isAlive()) {
System.out.println("You lost!");
return;
}
printBorder();
System.out.println(GREEN + " " + RESET);
System.out.println(RED + " VICTORY! " + RESET);
System.out.println(GREEN + " You have conquered all enemies! " + RESET);
System.out.println(GREEN + " The realm is safe, brave warrior. " + RESET);
System.out.println();
printBorder();
}
}
@@ -1,9 +1,8 @@
package org.project.entity;
public interface Entity {
void attack(Entity target);
void defend();
void attack(Entity target);
void heal(int health);
@@ -14,8 +13,4 @@ public interface Entity {
int getMaxHP();
int getMaxMP();
/*
TODO: ADD OTHER REQUIRED AND BONUS METHODS
*/
}
@@ -0,0 +1,60 @@
package org.project.entity.enemies;
import org.project.entity.Entity;
import org.project.item.weapons.DragonBreath;
import org.project.item.weapons.Weapon;
public class Dragon extends Enemy{
public Dragon() {
int baseDamage = 2;
int hp = 500;
int mp = 1000;
Weapon weapon1 = new DragonBreath();
super(hp, mp, weapon1, baseDamage);
}
@Override
public void takeDamage(int damage) {
super.takeDamage(damage);
if(!isAlive)
getKilled();
}
@Override
public void getKilled() {
isAlive = false;
}
@Override
public void attack(Entity target) {
target.takeDamage((weapon.getDamage() + getBaseDamage()));
System.out.println("\u001B[31mDragon breathes a raging fire!\u001B[0m");
System.out.printf("\u001B[31mYou took %d damage.\u001B[0m\n", weapon.getDamage() + getBaseDamage());
}
@Override
public void heal(int health) {
if (getHP() + health > getMaxHP())
setHP(getMaxHP());
else
setHP(getHP()+ health);
}
@Override
public void fillMana(int mana) {
if (getMP() + mana > getMaxMP())
setMP(getMaxMP());
else
setMP(getMP()+ mana);
}
@Override
public int getMaxHP() {
return 500;
}
@Override
public int getMaxMP() {
return 1000;
}
}
@@ -1,34 +1,58 @@
package org.project.entity.enemies;
import org.project.entity.Entity;
import org.project.item.weapons.Weapon;
// TODO: UPDATE IMPLEMENTATION
public abstract class Enemy {
public abstract class Enemy implements Entity {
Weapon weapon;
boolean isAlive;
private int hp;
private int mp;
private int baseDamage;
public Enemy(int hp, int mp, Weapon weapon) {
public Enemy(int hp, int mp, Weapon weapon, int baseDamage) {
this.baseDamage = baseDamage;
isAlive = true;
this.hp = hp;
this.mp = mp;
this.weapon = weapon;
}
public void setHP(int hp) {
this.hp = hp;
}
public void setMP(int mp) {
this.mp = mp;
}
@Override
public void takeDamage(int damage) {
if (0 >= (hp - damage)) {
isAlive = false;
hp = 0;
System.out.println("\u001B[32myou killed your enemy\u001B[0m");
return;
}
hp -= damage;
System.out.printf("\u001B[31mEnemy took %d damage.\u001B[0m\n", damage);
}
public int getHp() {
public abstract void getKilled();
public int getHP() {
return hp;
}
public int getMp() {
public int getMP() {
return mp;
}
public int getBaseDamage() {
return baseDamage;
}
public Weapon getWeapon() {
return weapon;
}
}
}
@@ -0,0 +1,57 @@
package org.project.entity.enemies;
import org.project.entity.Entity;
import org.project.item.weapons.Weapon;
import java.util.Random;
public class Goblin extends Enemy {
public Goblin(Weapon weapon) {
int hp = 30;
int mp = 50;
super(hp, mp, weapon, 10);
}
@Override
public void getKilled() {
isAlive = false;
}
@Override
public void attack(Entity target) {
Random rand = new Random();
if (rand.nextBoolean()) {
target.takeDamage((weapon.getDamage() + getBaseDamage()) * 2);
System.out.println("\u001B[33mGoblin did critical Hit!!!!!\u001B[0m");
System.out.printf("\u001B[31mYou took %d damage.\u001B[0m\n", (weapon.getDamage() + getBaseDamage()) * 2);
} else {
target.takeDamage(weapon.getDamage() + getBaseDamage());
System.out.printf("\u001B[31mYou took %d damage.\u001B[0m\n", weapon.getDamage() + getBaseDamage());
}
}
@Override
public void heal(int health) {
if (getHP() + health > getMaxHP())
setHP(getMaxHP());
else
setHP(getHP() + health);
}
@Override
public void fillMana(int mana) {
if (getMP() + mana > getMaxMP())
setMP(getMaxMP());
else
setMP(getMP() + mana);
}
@Override
public int getMaxHP() {
return 30;
}
@Override
public int getMaxMP() {
return 50;
}
}
@@ -1,6 +1,65 @@
package org.project.entity.enemies;
// TODO: UPDATE IMPLEMENTATION
public class Skeleton {
// TODO: DESIGN ENEMY AND IMPLEMENT THE CONSTRUCTOR
}
import org.project.entity.Entity;
import org.project.item.weapons.Weapon;
public class Skeleton extends Enemy {
int timesDied;
public Skeleton(Weapon weapon) {
int hp = 50;
int mp = 50;
timesDied = 0;
super(hp, mp, weapon, 10);
}
@Override
public void takeDamage(int damage) {
super.takeDamage(damage);
if (!isAlive)
getKilled();
}
@Override
public void getKilled() {
if (timesDied == 0) {
timesDied += 1;
setHP(getMaxHP() / 2);
System.out.println("\u001B[33myour enemy revived itself!!!\u001B[0m");
return;
}
isAlive = false;
}
@Override
public void attack(Entity target) {
target.takeDamage((weapon.getDamage() + getBaseDamage()));
System.out.printf("\u001B[31mYou took %d damage.\u001B[0m\n", weapon.getDamage() + getBaseDamage());
}
@Override
public void heal(int health) {
if (getHP() + health > getMaxHP())
setHP(getMaxHP());
else
setHP(getHP() + health);
}
@Override
public void fillMana(int mana) {
if (getMP() + mana > getMaxMP())
setMP(getMaxMP());
else
setMP(getMP() + mana);
}
@Override
public int getMaxHP() {
return 50;
}
@Override
public int getMaxMP() {
return 50;
}
}
@@ -0,0 +1,52 @@
package org.project.entity.enemies;
import org.project.entity.Entity;
import org.project.item.weapons.Weapon;
public class Vampire extends Enemy {
public Vampire(Weapon weapon) {
int maxHP = 50;
int maxMP = 50;
super(maxHP, maxMP, weapon, 8);
}
@Override
public void getKilled() {
isAlive = false;
}
@Override
public void attack(Entity target) {
target.takeDamage((weapon.getDamage() + getBaseDamage()));
System.out.println("\u001B[35mVampire stole your HP\u001B[0m");
System.out.printf("\u001B[32mVampire: +%d hp\u001B[0m\n", (int) ((weapon.getDamage() + getBaseDamage()) * 0.5));
this.heal((int) ((weapon.getDamage() + getBaseDamage()) * 0.5));
System.out.printf("\u001B[31mYou took %d damage.\u001B[0m\n", (int) (weapon.getDamage() + getBaseDamage()));
}
@Override
public void heal(int health) {
if (getHP() + health > getMaxHP())
setHP(getMaxHP());
else
setHP(getHP() + health);
}
@Override
public void fillMana(int mana) {
if (getMP() + mana > getMaxMP())
setMP(getMaxMP());
else
setMP(getMP() + mana);
}
@Override
public int getMaxHP() {
return 50;
}
@Override
public int getMaxMP() {
return 50;
}
}
@@ -0,0 +1,14 @@
package org.project.entity.players;
import org.project.item.armors.Armor;
import org.project.item.weapons.Weapon;
public class Assassin extends Player{
public Assassin(String name, Weapon weapon, Armor armor) {
int hp = 80;
int mp = 20;
int baseDamage = 5;
super(name, hp, mp, baseDamage, weapon, armor);
}
}
@@ -1,6 +1,14 @@
package org.project.entity.players;
// TODO: UPDATE IMPLEMENTATION
public class Knight {
// TODO: DESIGN KNIGHT'S WEAPON AND ARMOR AND IMPLEMENT THE CONSTRUCTOR
import org.project.item.armors.Armor;
import org.project.item.weapons.Weapon;
public class Knight extends Player {
public Knight(String name, Weapon weapon, Armor armor) {
int hp = 100;
int mp = 10;
int baseDamage = 10;
super(name, hp, mp, baseDamage, weapon, armor);
}
}
@@ -4,8 +4,7 @@ import org.project.entity.Entity;
import org.project.item.armors.Armor;
import org.project.item.weapons.Weapon;
// TODO: UPDATE IMPLEMENTATION
public abstract class Player {
public abstract class Player implements Entity {
protected String name;
Weapon weapon;
Armor armor;
@@ -13,30 +12,42 @@ public abstract class Player {
private int maxHP;
private int mp;
private int maxMP;
private int baseDamage;
private boolean isAlive;
public Player(String name, int hp, int mp, Weapon weapon, Armor armor) {
public int getBaseDamage() {
return baseDamage;
}
public Player(String name, int hp, int mp, int baseDamage, Weapon weapon, Armor armor) {
this.name = name;
this.hp = hp;
this.mp = mp;
this.maxHP = hp;
this.maxMP = mp;
this.baseDamage = baseDamage;
this.weapon = weapon;
this.armor = armor;
this.isAlive = true;
}
@Override
public void attack(Entity target) {
target.takeDamage(weapon.getDamage());
target.takeDamage(weapon.getDamage() + this.baseDamage);
}
@Override
public void defend() {
// TODO
public void heavyAttack(Entity target) {
target.takeDamage(weapon.getDamage() + this.baseDamage + 7);
}
@Override
public void takeDamage(int damage) {
hp -= damage - armor.getDefense();
if (damage - armor.getDefense() > 0) {
hp -= damage - armor.getDefense();
if (hp <= 0) {
getKilled();
}
}
}
@Override
@@ -45,6 +56,7 @@ public abstract class Player {
if (hp > maxHP) {
hp = maxHP;
}
System.out.println("\u001B[32myou Healed yourself!\u001B[0m");
}
@Override
@@ -52,15 +64,16 @@ public abstract class Player {
mp += mana;
if (mp > maxMP) {
mp = maxMP;
}
System.out.println("\u001B[33myour Mana got spilled.\u001B[0m");
} else
System.out.printf("\u001B[36m+%d Mana\u001B[0m\n", mana);
}
public String getName() {
return name;
}
public int getHp() {
public int getHP() {
return hp;
}
@@ -69,7 +82,7 @@ public abstract class Player {
return maxHP;
}
public int getMp() {
public int getMP() {
return mp;
}
@@ -86,4 +99,21 @@ public abstract class Player {
return armor;
}
}
public boolean isAlive() {
return isAlive;
}
public void getKilled() {
isAlive = false;
System.out.println("\u001B[31mYou died!\u001B[0m");
}
public boolean useMana(int mana) {
if (mp - mana < 0)
return false;
else {
mp -= mana;
return true;
}
}
}
@@ -0,0 +1,13 @@
package org.project.entity.players;
import org.project.item.armors.Armor;
import org.project.item.weapons.Weapon;
public class Wizard extends Player{
public Wizard(String name, Weapon weapon, Armor armor) {
int hp = 150;
int mp = 10;
int baseDamage = 4;
super(name, hp, mp, baseDamage, weapon, armor);
}
}
@@ -1,6 +1,9 @@
package org.project.item.armors;
// TODO: UPDATE IMPLEMENTATION
public class KnightArmor {
// TODO: DESIGN ARMOR'S ATTRIBUTES IMPLEMENT THE CONSTRUCTOR
public class KnightArmor extends Armor{
public KnightArmor() {
int defense = 6;
int durability = 20;
super(defense, durability);
}
}
@@ -1,7 +1,9 @@
package org.project.item.consumables;
import org.project.item.Item;
// TODO: UPDATE IMPLEMENTATION
public abstract class Consumable {
public abstract class Consumable implements Item {
/*
TODO: ADD OTHER REQUIRED AND BONUS METHODS
*/
@@ -3,7 +3,7 @@ package org.project.item.consumables;
import org.project.entity.Entity;
// TODO: UPDATE IMPLEMENTATION
public class Flask {
public class Flask extends Consumable{
/*
THIS IS AN EXAMPLE OF A CONSUMABLE DESIGN.
*/
@@ -0,0 +1,7 @@
package org.project.item.weapons;
public class DragonBreath extends Weapon{
public DragonBreath() {
super(8, 0);
}
}
@@ -5,7 +5,7 @@ import org.project.entity.Entity;
import java.util.ArrayList;
// TODO: UPDATE IMPLEMENTATION
public class Sword {
public class Sword extends Weapon{
/*
THIS IS AN EXAMPLE OF A WEAPON DESIGN.
*/
@@ -13,7 +13,9 @@ public class Sword {
int abilityCharge;
public Sword() {
// TODO: DESIGN SWORD'S ATTRIBUTES IMPLEMENT THE CONSTRUCTOR
int damage = 2;
int manaCost = 10;
super(damage, manaCost);
}
// TODO: (BONUS) UPDATE THE UNIQUE ABILITY
@@ -1,9 +1,10 @@
package org.project.item.weapons;
import org.project.entity.Entity;
import org.project.item.Item;
// TODO: UPDATE IMPLEMENTATION
public abstract class Weapon {
public abstract class Weapon implements Item {
private int damage;
private int manaCost;
@@ -2,27 +2,20 @@ package org.project.location;
import org.project.entity.enemies.Enemy;
import java.util.ArrayList;
public class Location {
private String name;
private Enemy enemiy;
private ArrayList<Enemy> enemies;
public Location(ArrayList<Location> locations, ArrayList<Enemy> enemies) {
this.locations = locations;
this.enemies = enemies;
public Location(String name,Enemy enemiy) {
this.enemiy = enemiy;
this.name = name;
}
public String getName() {
return name;
}
public ArrayList<Location> getLocations() {
return locations;
}
public ArrayList<Enemy> getEnemies() {
return enemies;
public Enemy getEnemy() {
return enemiy;
}
}