Milstolpe: Brawl

Du har nu variabler, villkor, listor och loopar. Det räcker för att bygga ett program som fattar beslut, håller tillstånd och pågår tills något avgörs. Det räcker för ett fightingspel.

Uppdraget

Bygg ett textbaserat fightingspel där en spelare möter en datorstyrd motståndare. Varje tur attackerar båda, skadan är slumpad. Spelet pågår tills en av dem når noll i hälsopoäng. Programmet avgör då vem som vann och skriver ut resultatet.

Det är inte ett avancerat spel. Det är ett korrekt spel, ett program med ett tydligt tillstånd, en tydlig loop och ett tydligt slut. Fokus ligger på strukturen, inte på berättelsen. Textäventyret kombinerade att spara och att välja. Brawl lägger till den tredje förmågan, att upprepa, och är det första programmet där hela triaden arbetar tillsammans.

Det här är en inlämningsuppgift som bedöms, men vi arbetar som på riktigt: du planerar, bygger, committar och levererar.

Krav

Spelet Programmet frågar efter spelarens namn i början. Spelare och motståndare har varsin HP-variabel med startvärdena synliga. Spelet körs i en loop som fortsätter så länge båda har mer än noll HP. Programmet avgör och meddelar vinnaren när loopen avslutas.

Varje tur Spelaren attackerar motståndaren med slumpad skada inom ett definierat intervall. Motståndaren attackerar tillbaka med slumpad skada inom ett annat intervall (behöver inte vara samma). Båda parters nuvarande HP visas efter varje tur.

Utskrift Skadeutskrifterna ska vara tydliga: vem som attackerade, hur mycket skada som gjordes och vilket HP som återstår. Spelarens och motståndarens handlingar ska gå att skilja åt direkt i utskriften.

Kod Alla variabler följer snake_case. Koden innehåller kommentarer som förklarar programmets struktur. Programmet överlever att någon skriver fel: en bokstav där ett tal förväntas ska ge en ny fråga, inte en krasch.

GitHub Koden ligger i mappen brawl/ i ditt kursrepository med filnamnet main.py. Det finns minst en commit per steg i bygglistan längre ner, med meddelanden som visar vad som tillkom i just det steget.

Planera innan du kodar

Kraven ovan är en beställning i löptext. Ditt första jobb är att göra om dem till en plan, precis det arbetsflöde du lärde dig i Kartan ritas: problem, flödesschema, pseudokod, kod.

Rita kampen som ett flödesschema, eller skriv den som pseudokod, på papper. Var börjar programmet? Vad händer inuti ett varv? Vad avgör om det blir ett varv till? Vad händer efter sista varvet?

Gå sedan igenom Mönsterkortet med din plan framför dig och skriv ned vilka mönster planen behöver. Du kommer att känna igen dem, temat har lärt ut allihop. De namnen är det du redovisar i din README, så gör det här steget ordentligt.

Uppdraget, steg för steg

Skapa mappen brawl/ med filen main.py. Bygg i den här ordningen och kör programmet efter varje steg. Fungerar steget, committa, sedan nästa. Då växer programmet fram i din Git-historik i stället för att dyka upp färdigt.

  1. Starttillståndet. Fråga efter spelarens namn, skapa en HP-variabel för spelaren och en för motståndaren, och skriv ut vem som möter vem och med vilka HP. Kör. Nu har programmet ett tillstånd, även om ingenting händer med det än.
import random

spelare_hp = 100
fiende_hp = 80

# Steg 1: fråga efter namn och skriv ut vem som möter vem.
  1. Ett enda angrepp. Låt spelaren träffa motståndaren för en skada du hårdkodar, till exempel 10. Dra av den från motståndarens HP och skriv ut vem som slog, hur hårt och vad som återstår. Ingen loop än. Kör och kontrollera i huvudet att siffran stämmer.

  2. Slumpad skada. Byt ut den hårdkodade siffran mot random.randint() med ett minsta och ett största värde som du väljer. Kör programmet fem gånger. Skadan ska variera, och motståndarens HP med den.

  3. Turen upprepas. Lägg en loop runt turen så att den fortsätter så länge båda har mer än noll HP. Kör. Motståndaren kommer att hamna långt under noll, och det är väntat, du löser det i nästa steg.

  4. Motattacken och avgörandet. Låt motståndaren slå tillbaka i samma varv, med ett eget skadeintervall. Avgör efter loopen vem som vann och skriv ut resultatet.

  5. Turräknaren. Räkna varven och skriv ut hur många turer matchen tog.

Uppgift: Brawl

Detta ska lämnas in

Mappen brawl/ i ditt kursrepository med main.py och en README.md. Kopiera mallen nedan och fyll i den:

# Brawl

## Vad programmet gör

(Beskriv i två meningar.)

## Mönster jag använde

(Vilka mönster från Mönsterkortet finns i din kod, och var sitter de?
Ett mönster per rad, med raden eller variabeln du menar.)

## Det som var svårast

(Vilket steg tog längst tid, och hur löste du det?)

## Om jag hade mer tid

(Minst en sak du skulle vilja förbättra.)

Stagea och pusha via Source Control-panelen i VS Code, kontrollera att allt syns på GitHub.

Motivera & reflektera

Motivera i din README varför kampen behöver en while-loop och inte en for i in range(n):. Vad är det i problemet, inte i koden, som avgör valet?

Bedömning

Läraren tittar på fyra saker: att programmet uppfyller kraven ovan, att README:n namnger mönstren du faktiskt använt och var de sitter, att Git-historiken visar ett progressivt arbetsflöde och att koden är läsbar med tydliga variabelnamn och kommentarer.

Bedömningssamtalet fokuserar på ett val du gjort i koden, inte vad du visste, utan varför du valde som du gjorde. Koden visar vad du byggde, samtalet visar att du förstod varför, och båda påverkar bedömningen.

Nästa nivå

Klar och vill ha mer? Ta ett steg i taget och committa mellan varje.

Spelarval varje tur. Ge spelaren valet att attackera eller försvara sig. Försvar minskar inkommande skada med hälften den turen. Du behöver ett input() och ett villkor inuti loopen.

En meny som inte går att sabba. Bygg in Valideraren i turvalet: while True: runt try/except med break när svaret duger. Skriver spelaren “katt” mitt i striden ska programmet fråga om, inte dö. Nu har du använt allt temat lärt ut i ett och samma program.

Fler ronder. Låt spelaren möta en ny, starkare fiende varje gång den förra besegrats, med en räknare som höjer fiendens hälsopoäng för varje rond. Hur många ronder klarar du?

Kritiska träffar. Med en sannolikhet på 20% gör spelaren dubbel skada. random.random() returnerar ett tal mellan 0 och 1, hur kan du använda det?

Poängsystem. Ge spelaren poäng baserat på hur många turer de klarade sig och hur mycket HP som återstår. Ackumuleringsmönstret.

Hälsopotion. Ge spelaren ett begränsat antal hälsopotioner som kan användas en gång per tur. Du behöver en Räknare och ett val.