Hero Builder
Du er game designer på et fantasy RPG. Byg systemet bag kulissen: karakterer med stats, inventory, og kamp-mekanik.
Du styrer en helt på en farlig rejse gennem en verden fyldt med monstre og skatte. Start som en uerfaren eventyrer og bliv en legendarisk helt gennem kamp og strategi.
Kernekoncepter:
- Health holder dig i live – når den rammer nul, er spillet slut
- Level låser op for stærkere evner og sværere udfordringer
- Guld bruges til våben, rustning og helende drikke
- Inventory er de genstande du bærer med dig på din rejse
- Iteration 1: Variables
- Iteration 2: Control Structures
- Iteration 3: Methods
- Iteration 4: Objects
- Refleksion
Forudsætter at du har lært om variable, operatorer, navgivning og Arrays
Erklær variable der beskriver én spilkarakter:
| Data | Type | Eksempel |
|---|---|---|
| Navn | String | “Ragnar” |
| Health points | int | 85 |
| Max health | ? | 100 |
| Level | ? | 5 |
| Experience points | ? | 2300 |
| Gold | ? | 156.50 |
| Er i live | ? | true |
| Klasse/type | ? | ‘W’ (Warrior), ‘M’ (Mage), ‘R’ (Rogue) |
Erklær også et array med 3-5 items i karakterens inventory (String[]).
Udskriv alle karakterens stats i et læsbart format.
=== CHARACTER SHEET ===
Name: Ragnar
Class: W
Level: 5
Health: 85/100
XP: 2300
Gold: 156.50
Alive: true
Inventory (3 items):
- Sword
- Shield
- Potion
Lav to karakterer og udskriv begge.
Forudsætter: Kontrolstrukturer (if/else, loops)
Tilføj logik til din Hero Builder:
Status checks:
- Hvis health er under 25% af max health, udskriv “WARNING: Health critical!”
- Hvis karakteren har 0 eller mindre health, sæt
isAlivetil false - Udskriv forskellige beskeder baseret på klasse (‘W’, ‘M’, ‘R’)
Level system:
- Hvis XP er over en threshold (fx 1000 * current level), udskriv “Ready to level up!”
Inventory:
- Brug et loop til at udskrive alle items i inventory
- Tæl hvor mange items der er i inventory
Simpel “combat” simulation:
- Erklær en variabel for “incoming damage” (fx 30)
- Træk damage fra health
- Check om karakteren stadig er i live
=== CHARACTER SHEET ===
Name: Ragnar
Class: W (Warrior)
Level: 5
Health: 85/100
XP: 2300
Gold: 156.50
Alive: true
Inventory (3 items):
- Sword
- Shield
- Potion
=== STATUS ===
Ready to level up!
=== COMBAT ===
Ragnar takes 30 damage!
Health: 85 -> 55
Ragnar is still alive.
Simuler flere runder af combat med et loop. Stop når karakteren dør eller har vundet (fx efter 5 runder).
Forudsætter: Metoder
Refaktorer din kode ved at udpakke logik i metoder:
Metoder du skal lave:
| Metode | Returnerer | Beskrivelse |
|---|---|---|
printCharacterSheet() | void | Udskriver alle stats |
takeDamage(int amount) | void | Reducerer health, checker om død |
heal(int amount) | void | Øger health (max til maxHealth) |
addGold(double amount) | void | Tilføjer gold |
removeGold(double amount) | boolean | Fjerner gold og returnerer true hvis det lykkedes, false hvis ikke nok guld |
addXP(int amount) | void | Tilføjer XP, checker for level up |
levelUp() | void | Øger level, nulstiller XP, øger maxHealth |
isHealthCritical() | boolean | Returnerer true hvis health < 25% |
isAlive() | boolean | Returnerer true hvis health > 0 |
getHealthPercentage() | double | Returnerer health som procent af maxHealth |
printInventory() | void | Udskriver alle items |
Din main metode skal nu være kort og læsbar:
public static void main(String[] args) {
// Setup character...
printCharacterSheet();
takeDamage(30);
heal(20);
addXP(500);
if (removeGold(100.0)) {
System.out.println("Bought a potion!");
} else {
System.out.println("Not enough gold!");
}
System.out.println("Health: " + getHealthPercentage() + "%");
if (isHealthCritical()) {
System.out.println("WARNING: Find a healer!");
}
printCharacterSheet();
}
=== CHARACTER SHEET ===
Name: Ragnar
Class: W (Warrior)
Level: 5
Health: 85/100
...
Ragnar takes 30 damage! Health: 85 -> 55
Ragnar heals 20 HP! Health: 55 -> 75
Ragnar gains 500 XP! Total: 2800
Not enough gold!
Health: 75.0%
=== CHARACTER SHEET ===
Name: Ragnar
Class: W (Warrior)
Level: 5
Health: 75/100
...
Tilføj metoder til inventory management: addItem(String item), removeItem(String item), hasItem(String item) – hvor hasItem returnerer en boolean.
Forudsætter: Klasser og objekter
Omstrukturer dit projekt til at bruge klasser:
Character klasse:
- Alle character variabler bliver instance fields
- Alle dine metoder flytter ind i klassen
- Constructor der tager navn og klasse som parametre
Ny funktionalitet med objekter:
- Opret mindst 2 forskellige karakterer
- Lad dem “kæmpe” mod hinanden
Ekstra klasser (valgfri men anbefalet):
| Klasse | Felter |
|---|---|
| Item | name, weight, value |
| Weapon | name, damage, durability |
| Armor | name, defense, durability |
public static void main(String[] args) {
Character hero = new Character("Ragnar", 'W');
Character enemy = new Character("Goblin", 'R');
hero.printCharacterSheet();
enemy.printCharacterSheet();
// Combat!
hero.attack(enemy);
enemy.attack(hero);
hero.printCharacterSheet();
enemy.printCharacterSheet();
}
=== RAGNAR (Warrior) ===
Level: 1 | Health: 100/100 | Gold: 0.0
=== GOBLIN (Rogue) ===
Level: 1 | Health: 100/100 | Gold: 0.0
Ragnar attacks Goblin for 15 damage!
Goblin attacks Ragnar for 12 damage!
=== RAGNAR (Warrior) ===
Level: 1 | Health: 88/100 | Gold: 0.0
=== GOBLIN (Rogue) ===
Level: 1 | Health: 85/100 | Gold: 0.0
- Tilføj et inventory system hvor Character har Item objekter (has-a relation)
- Lav en Item klasse med felter som name, weight og value
- Erstat dit String[] inventory med et Item[] inventory
- Lav metoder til at tilføje og fjerne Item objekter fra inventory
- Lav en simpel “dungeon” hvor karakteren møder flere fjender
Efter hver iteration, tænk over:
- Hvad var svært?
- Hvad ville du gøre anderledes hvis du startede forfra?
- Hvordan har den nye viden (kontrolstrukturer/metoder/objekter) gjort din kode bedre?
- Hvad ville du gerne tilføje til dit spil?