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
- Iteration 1: Variables
- Iteration 2: Control Structures
- Iteration 3: Methods
- Iteration 4: Objects
- Refleksion
Forudsætter at du har lært om variable, operatorer, navngivning og Arrays
Erklær variable der beskriver ét band:
| Data | Type | Eksempel |
|---|---|---|
| Bandnavn | String | “The Static Waves” |
| Fans | int | 8500 |
| 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.
=== 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
Lav to bands (dit band og et rival-band) og udskriv begge.
Forudsætter: Kontrolstrukturer (if/else, loops)
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
isActivetil 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”
=== 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
Simuler en hel “tour” med et loop – fx 5 koncerter i træk med varierende attendance. Udskriv en tour-summary til sidst.
Forudsætter: Metoder
Refaktorer din kode ved at udpakke logik i metoder:
Metoder du skal lave:
| Metode | Returnerer | Beskrivelse |
|---|---|---|
printBandProfile() | void | Udskriver alle stats |
playGig(int venueCapacity, int attendance) | void | Simulerer en koncert, tilføjer fans og penge |
gainFans(int amount) | void | Tilføjer fans (max til maxFans) |
loseFans(int amount) | void | Fjerner fans, checker om bandet opløses |
earnMoney(double amount) | void | Tilføjer penge |
spendMoney(double amount) | boolean | Fjerner penge, returnerer true hvis det lykkedes |
addXP(int amount) | void | Tilføjer XP, checker for level up |
levelUp() | void | Øger fame level, nulstiller XP, øger maxFans |
isLosingRelevance() | boolean | Returnerer true hvis fans < 25% af max |
isActive() | boolean | Returnerer true hvis fans > 0 |
getFanPercentage() | double | Returnerer fans som procent af maxFans |
printRepertoire() | void | Udskriver alle sange |
getStatusTitle() | String | Returnerer 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();
}
=== 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
...
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.
Forudsætter: Klasser og objekter
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):
| Klasse | Felter |
|---|---|
| Song | title, durationSeconds, streams |
| Venue | name, capacity, payoutAmount |
| Event | type, description, fanImpact, moneyImpact |
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();
}
=== 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
- 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
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?
| Level | Titel | Max Fans | Beskrivelse |
|---|---|---|---|
| 1 | Unknown | 5,000 | Øvelokaler og gadeoptræden |
| 2 | Local Hero | 15,000 | Barer og små klubber |
| 3 | Rising Star | 50,000 | Koncertsale og festivaler |
| 4 | Mainstream | 200,000 | Arenaer og TV-optrædener |
| 5 | Superstar | 1,000,000 | Stadions og world tours |
| 6 | Legend | ∞ | Hall of Fame |