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

Band Sim

Du bygger en musik-karriere-simulator til et tekstbaseret spil. Byg systemet bag kulissen: bands med stats, repertoire, og koncert-mekanik.

Du styrer et band på vej mod stjernerne. Start som et ukendt band i øvelokalet og arbejd dig op til at fylde stadions og blive legendariske.

Kernekoncepter:

  • Fans er din vigtigste ressource – de afgør hvilke venues du kan spille
  • Fame Level låser op for større muligheder
  • Penge bruges til udstyr, promotion og at overleve hårde tider
  • Repertoire er de sange dit band kan spille live

Indhold


Iteration 1: Variables

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

Krav

Erklær variable der beskriver ét band:

DataTypeEksempel
BandnavnString“The Static Waves”
Fansint8500
Max fans (nuværende niveau)?15000
Fame level?2
Experience points?3200
Penge?4750.50
Er aktive?true
Genre?‘R’ (Rock), ‘E’ (Electronic), ‘H’ (HipHop), ‘P’ (Pop)

Erklær også et array med 3-5 sange i bandets repertoire (String[]).

Udskriv alle bandets stats i et læsbart format.

Forventet output (eksempel)

=== BAND PROFILE ===
Name: The Static Waves
Genre: R
Fame Level: 2
Fans: 8500/15000
XP: 3200
Money: $4750.50
Active: true

Repertoire (4 songs):
- Electric Dreams
- Midnight Run
- Broken Strings
- Neon Lights

Udfordring (valgfri)

Lav to bands (dit band og et rival-band) og udskriv begge.


Iteration 2: Control Structures

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

Nye krav

Tilføj logik til dit band-system:

Status checks:

  • Hvis fans er under 25% af max fans, udskriv “WARNING: Losing relevance! Consider a comeback strategy.”
  • Hvis bandet har 0 eller færre fans, sæt isActive til false og udskriv “The band has broken up…”
  • Udskriv forskellige beskeder baseret på genre (‘R’, ‘E’, ‘H’, ‘P’)

Fame system:

  • Hvis XP er over en threshold (fx 2000 * current fame level), udskriv “Ready to level up!”
  • Udskriv bandets nuværende status baseret på fame level:
    • Level 1: “Unknown - Playing in garages”
    • Level 2: “Local Hero - Small venues await”
    • Level 3: “Rising Star - Festival invitations coming in”
    • Level 4: “Mainstream - Arena tours possible”
    • Level 5: “Superstar - Stadium glory!”

Repertoire:

  • Brug et loop til at udskrive alle sange i repertoiret
  • Tæl hvor mange sange bandet har

Simpel “gig” simulation:

  • Erklær en variabel for “venue capacity” (fx 500)
  • Erklær en variabel for “attendance” (fx 420)
  • Beregn hvor fyldt koncerten var (procent)
  • Giv fans baseret på performance: hvis over 80% fyldt, +200 fans. Ellers +50 fans.
  • Tilføj penge for koncerten (fx $1500)

Random event:

  • Erklær en variabel eventType (int fra 1-3)
  • Brug if/else til at simulere forskellige events:
    • 1: “Great review! +500 fans”
    • 2: “Quiet week. Nothing happens.”
    • 3: “Scandal! -300 fans”

Forventet output (eksempel)

=== BAND PROFILE ===
Name: The Static Waves
Genre: R (Rock)
Fame Level: 2
Fans: 8500/15000
XP: 3200
Money: $4750.50
Active: true
Status: Local Hero - Small venues await

Repertoire (4 songs):
- Electric Dreams
- Midnight Run
- Broken Strings
- Neon Lights

=== STATUS CHECK ===
Ready to level up!

=== GIG NIGHT ===
Playing at venue (capacity: 500)
Attendance: 420 (84%)
Great turnout!
Fans: 8500 -> 8700
Money: $4750.50 -> $6250.50

=== RANDOM EVENT ===
Great review in local music blog!
Fans: 8700 -> 9200

Udfordring (valgfri)

Simuler en hel “tour” med et loop – fx 5 koncerter i træk med varierende attendance. Udskriv en tour-summary til sidst.


Iteration 3: Methods

Forudsætter: Metoder

Nye krav

Refaktorer din kode ved at udpakke logik i metoder:

Metoder du skal lave:

MetodeReturnererBeskrivelse
printBandProfile()voidUdskriver alle stats
playGig(int venueCapacity, int attendance)voidSimulerer en koncert, tilføjer fans og penge
gainFans(int amount)voidTilføjer fans (max til maxFans)
loseFans(int amount)voidFjerner fans, checker om bandet opløses
earnMoney(double amount)voidTilføjer penge
spendMoney(double amount)booleanFjerner penge, returnerer true hvis det lykkedes
addXP(int amount)voidTilføjer XP, checker for level up
levelUp()voidØger fame level, nulstiller XP, øger maxFans
isLosingRelevance()booleanReturnerer true hvis fans < 25% af max
isActive()booleanReturnerer true hvis fans > 0
getFanPercentage()doubleReturnerer fans som procent af maxFans
printRepertoire()voidUdskriver alle sange
getStatusTitle()StringReturnerer status baseret på fame level

Din main metode skal nu være kort og læsbar:

public static void main(String[] args) {
    // Setup band...
    
    printBandProfile();
    
    playGig(500, 420);
    addXP(300);
    
    if (spendMoney(2000.0)) {
        System.out.println("Bought new equipment!");
    } else {
        System.out.println("Not enough money!");
    }
    
    System.out.println("Fan base: " + getFanPercentage() + "% of venue capacity");
    
    if (isLosingRelevance()) {
        System.out.println("WARNING: Plan a comeback!");
    }
    
    printBandProfile();
}

Forventet output (eksempel)

=== BAND PROFILE ===
Name: The Static Waves
Genre: R (Rock)
Fame Level: 2
Fans: 8500/15000
...

The Static Waves plays to 420 people!
Venue was 84% full - Great show!
Fans: 8500 -> 8700
Money: $4750.50 -> $6250.50

The Static Waves gains 300 XP! Total: 3500
Bought new equipment!
Fan base: 58.0% of max capacity

=== BAND PROFILE ===
Name: The Static Waves
Genre: R (Rock)
Fame Level: 2
Fans: 8700/15000
...

Udfordring (valgfri)

Tilføj metoder til repertoire management: addSong(String song), removeSong(String song), hasSong(String song) – hvor hasSong returnerer en boolean.

Tilføj også en releaseSingle() metode der koster penge men giver XP og fans.


Iteration 4: Objects

Forudsætter: Klasser og objekter

Nye krav

Omstrukturer dit projekt til at bruge klasser:

Band klasse:

  • Alle band-variabler bliver instance fields
  • Alle dine metoder flytter ind i klassen
  • Constructor der tager navn og genre som parametre

Ny funktionalitet med objekter:

  • Opret mindst 2 forskellige bands
  • Lad dem “konkurrere” – sammenlign fans, spil på samme festival

Ekstra klasser (valgfri men anbefalet):

KlasseFelter
Songtitle, durationSeconds, streams
Venuename, capacity, payoutAmount
Eventtype, description, fanImpact, moneyImpact

Eksempel på brug

public static void main(String[] args) {
    Band myBand = new Band("The Static Waves", 'R');
    Band rival = new Band("Neon Disaster", 'E');
    
    myBand.printBandProfile();
    rival.printBandProfile();
    
    // Both play at a festival!
    System.out.println("=== SUMMER FESTIVAL ===");
    myBand.playGig(2000, 1800);
    rival.playGig(2000, 1650);
    
    // Who's winning?
    if (myBand.getFans() > rival.getFans()) {
        System.out.println(myBand.getName() + " is dominating the scene!");
    } else {
        System.out.println(rival.getName() + " is the crowd favorite!");
    }
    
    myBand.printBandProfile();
    rival.printBandProfile();
}

Forventet output (eksempel)

=== THE STATIC WAVES (Rock) ===
Fame Level: 1 | Fans: 1000/5000 | Money: $500.00

=== NEON DISASTER (Electronic) ===
Fame Level: 1 | Fans: 1000/5000 | Money: $500.00

=== SUMMER FESTIVAL ===
The Static Waves plays to 1800 people! (90% full)
Fans: 1000 -> 1450
Money: $500.00 -> $3500.00

Neon Disaster plays to 1650 people! (82% full)
Fans: 1000 -> 1330
Money: $500.00 -> $3500.00

The Static Waves is dominating the scene!

=== THE STATIC WAVES (Rock) ===
Fame Level: 1 | Fans: 1450/5000 | Money: $3500.00

=== NEON DISASTER (Electronic) ===
Fame Level: 1 | Fans: 1330/5000 | Money: $3500.00

Udfordring (valgfri)

  • Tilføj et repertoire-system hvor Band har Song objekter (has-a relation)
  • Lav en Song klasse med felter som title, durationSeconds og streams
  • Erstat dit String[] repertoire med et Song[] repertoire
  • Lav metoder til at tilføje og fjerne Song objekter
  • Lav en Venue klasse og simuler en tour gennem flere venues
  • Implementer et simpelt “battle of the bands” hvor to bands konkurrerer over flere runder

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?

Fame Level Reference

LevelTitelMax FansBeskrivelse
1Unknown5,000Øvelokaler og gadeoptræden
2Local Hero15,000Barer og små klubber
3Rising Star50,000Koncertsale og festivaler
4Mainstream200,000Arenaer og TV-optrædener
5Superstar1,000,000Stadions og world tours
6LegendHall of Fame