Gå till innehållet

Projekt - frågespelet (Python CLI)

Skapa ett litet spel eller en interaktiv berättelse i terminalen.

Mål

  • Träna input()/print()
  • Använda if/elif/else för val

Krav

  • Minst 2 val längs vägen
  • Minst 3 olika slut
  • Validera svar (tillåt bara giltiga alternativ)

Börja med ett flödesschema

Rita ett enkelt beslutsträd: Start → Val 1 (A/B) → Val 2 → Slut 1/2/3.

Börja med ett flödesschema

Rita ett enkelt beslutsträd: Start → Val 1 (A/B) → Val 2 → Slut 1/2/3.

Startmall (utan funktioner)

Byt text och val till din egen berättelse.

Vanliga misstag

Förslag på förbättringar

  • Spara poäng eller liv i en variabel
  • Lägg till ett “inventarie” (lista) som ändras efter val
  • Slumpa händelser (import random) – kommer i kapitel 6

Hitta felen! (5 fel)

Koden ska fråga ett A/B/C-val och validera, sedan ge ett resultat. Rätta fem fel.

Python
val = input("Välj (A/B/C): ").strip()
while val not in ["A", "B", "C"]:
    print("Svara A, B eller C")
    val = input("Välj (A/B/C): ")

if val == "a":
    print("Du valde A!")
elif val == "B":
    print("Du valde B!")
elif val == "C":
    print("Du valde C!")
else:
    print("Oväntat val")

print(sluttext)

Facit

Python
# Fix 1: Normalisera inmatningen i ett och samma format (t.ex. versalt)
val = input("Välj (A/B/C): ").strip().upper()

# Fix 2: Validera konsekvent mot samma format och strippa varje gång i loopen
while val not in {"A", "B", "C"}:
    print("Svara A, B eller C")
    val = input("Välj (A/B/C): ").strip().upper()

# Fix 3: Jämför mot samma fall som du normaliserat till
if val == "A":
    sluttext = "Du valde A!"
elif val == "B":
    sluttext = "Du valde B!"
elif val == "C":
    sluttext = "Du valde C!"

# Fix 4: else-grenen behövs inte längre – alla andra fall stoppas av valideringen

# Fix 5: Definiera variabeln innan du skriver ut den
print(sluttext)

Steg för steg – bygg upp spelet

Steg 1: Enkelt skelett

En loop för att spela om, en funktion för att fråga och validera svar.

Python
def fråga(prompt, giltiga):
    s = ""
    while s not in giltiga:
        s = input(prompt).lower().strip()
    return s

def spela():
    print("Välkommen till Grottan!")
    poäng = 0

    val1 = fråga("Väljer du vänster eller höger? (v/h): ", {"v", "h"})
    if val1 == "v":
        print("Du hittar en skattkista.")
        val = fråga("Öppna den? (j/n): ", {"j", "n"})
        if val == "j":
            print("SLUT: Du blir rik!")
            poäng += 1
        else:
            print("SLUT: Du går därifrån, fattig men trygg.")
    else:
        print("En drake blockerar vägen!")
        val = fråga("Smyg förbi eller spring? (s/r): ", {"s", "r"})
        if val == "s":
            print("SLUT: Du smyger förbi draken – vilken ninja!")
            poäng += 1
        else:
            print("SLUT: Draken ser dig… Game over.")

    return poäng

while True:
    p = spela()
    print(f"Du fick {p} poäng.\n")
    igen = input("Spela igen? (j/n): ").lower().strip()
    if igen != "j":
        break

Steg 2: Inventarie (lista)

Lägg till en ryggsäck. Vissa val ger föremål – som kan användas senare.

Python
1
2
3
4
ryggsäck = []
ryggsäck.append("nyckel")
if "nyckel" in ryggsäck:
    print("Du låser upp dörren!")

Steg 3: Hälsa/liv

Håll reda på spelarens liv. Vissa val drar liv.

Python
1
2
3
4
liv = 3
liv -= 1  # skada
if liv <= 0:
    print("SLUT: Du svimmade – försök igen!")

Steg 4: Fler rum utan spagetti

Använd små funktioner per rum/scen och returnera nästa scen som ett namn.

Python
1
2
3
4
5
6
7
def scen_start():
    # ...
    return "scen_drake"

def scen_drake():
    # ...
    return None  # slut

Kör en enkel “scenmotor”:

Python
1
2
3
4
scener = {"start": scen_start, "scen_drake": scen_drake}
nästa = "start"
while nästa:
    nästa = scener[nästa]()

Steg 5: Slumpa händelser

Gör vissa saker överraskande (kräver import random).

Python
1
2
3
import random
if random.random() < 0.3:
    print("En gömd fälla! Du förlorar 1 liv.")

Utmaningar

  • Poäng för snabba beslut (mät antal steg/val).
  • “Svårighetsgrad”: fler/ färre liv.
  • Highscore: spara bästa poäng i en fil (fördjupning).
Python
print("Välkommen till Grottan!")

val1 = input("Väljer du vänster eller höger? (v/h): ").lower().strip()
while val1 not in ("v", "h"):
    print("Skriv v eller h.")
    val1 = input("Väljer du vänster eller höger? (v/h): ").lower().strip()

if val1 == "v":
    print("Du hittar en skattkista.")
    val = input("Öppna den? (j/n): ").lower().strip()
    while val not in ("j", "n"):
        print("Skriv j eller n.")
        val = input("Öppna den? (j/n): ").lower().strip()
    if val == "j":
        print("SLUT: Du blir rik!")
    else:
        print("SLUT: Du går därifrån, fattig men trygg.")
else:
    print("En drake blockerar vägen!")
    val = input("Smyg förbi eller spring? (s/r): ").lower().strip()
    while val not in ("s", "r"):
        print("Skriv s eller r.")
        val = input("Smyg förbi eller spring? (s/r): ").lower().strip()
    if val == "s":
        print("SLUT: Du smyger förbi draken – vilken ninja!")
    else:
        print("SLUT: Draken ser dig… Game over.")

Byt text och val till din egen berättelse.

Vanliga misstag

  • Ingen validering: spelet kraschar på oväntat svar.
  • Dubblerad kod: använd funktioner för återanvändning.
  • Otydlig text: var tydlig med vilka svar som gäller (t.ex. “(j/n)”).

Förslag på förbättringar

  • Spara poäng eller liv i en variabel
  • Lägg till ett “inventarie” (lista) som ändras efter val
  • Slumpa händelser (import random) – kommer i kapitel 6