Skip to main content
Dat 1. Semester
Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Back to homepage

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

Indhold


Iteration 1: Variables

Forudsætter at du har lært om variable, operatorer, navgivning og Arrays

Krav

Erklær variable der beskriver én spilkarakter:

DataTypeEksempel
NavnString“Ragnar”
Health pointsint85
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.

Forventet output (eksempel)

=== CHARACTER SHEET ===
Name: Ragnar
Class: W
Level: 5
Health: 85/100
XP: 2300
Gold: 156.50
Alive: true

Inventory (3 items):
- Sword
- Shield
- Potion

Udfordring (valgfri)

Lav to karakterer og udskriv begge.


Iteration 2: Control Structures

Forudsætter: Kontrolstrukturer (if/else, loops)

Nye krav

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 isAlive til 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

Forventet output (eksempel)

=== 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.

Udfordring (valgfri)

Simuler flere runder af combat med et loop. Stop når karakteren dør eller har vundet (fx efter 5 runder).


Iteration 3: Methods

Forudsætter: Metoder

Nye krav

Refaktorer din kode ved at udpakke logik i metoder:

Metoder du skal lave:

MetodeReturnererBeskrivelse
printCharacterSheet()voidUdskriver alle stats
takeDamage(int amount)voidReducerer health, checker om død
heal(int amount)voidØger health (max til maxHealth)
addGold(double amount)voidTilføjer gold
removeGold(double amount)booleanFjerner gold og returnerer true hvis det lykkedes, false hvis ikke nok guld
addXP(int amount)voidTilføjer XP, checker for level up
levelUp()voidØger level, nulstiller XP, øger maxHealth
isHealthCritical()booleanReturnerer true hvis health < 25%
isAlive()booleanReturnerer true hvis health > 0
getHealthPercentage()doubleReturnerer health som procent af maxHealth
printInventory()voidUdskriver 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();
}

Forventet output (eksempel)

=== 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
...

Udfordring (valgfri)

Tilføj metoder til inventory management: addItem(String item), removeItem(String item), hasItem(String item) – hvor hasItem returnerer en boolean.


Iteration 4: Objects

Forudsætter: Klasser og objekter

Nye krav

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):

KlasseFelter
Itemname, weight, value
Weaponname, damage, durability
Armorname, defense, durability

Eksempel på brug

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();
}

Forventet output (eksempel)

=== 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

Udfordring (valgfri)

  • 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

Refleksion

Efter hver iteration, tænk over:

  1. Hvad var svært?
  2. Hvad ville du gøre anderledes hvis du startede forfra?
  3. Hvordan har den nye viden (kontrolstrukturer/metoder/objekter) gjort din kode bedre?
  4. Hvad ville du gerne tilføje til dit spil?