ebSkola

6.6 Noslēguma projekts: Quiz spēle ar Highscore

Stundas uzdevums: Apvienot 6. tēmā apgūto failu lasīšanu, rakstīšanu, JSON un CSV apstrādi vienkāršā Quiz spēlē ar saglabātiem labākajiem rezultātiem.

SR 2.4.17. Darbs ar failiem un ārējām datu krātuvēm SR 2.4.4. Iegūst, atlasa un apstrādā datus SR 2.4.5. Datu analīze un vizualizācija

70 min plāns: Ievads un kritēriju pārruna (~10 min) · 1. uzdevums (~15 min) - ielādē jautājumus no JSON · 2. uzdevums (~25 min) - uzraksti spēles ciklu ar punktiem · 3. uzdevums (~20 min) - saglabā rezultātu CSV un parādi TOP 5. Papildu uzdevumu sāc tikai tad, ja pārējie trīs ir gatavi.

Pirms sāc: šis ir 6. tēmas noslēguma projekts. Sagatavo failu jautajumi.json ar vismaz 5 jautājumiem, pirms sāc rakstīt spēles kodu.

Teorija: dati atrodas ārpus koda

Programma sākumā nolasa jautājumus no jautajumi.json faila - katrā ierakstā ir jautājuma teksts, atbilžu varianti un pareizās atbildes indekss. Spēlētājs ievada savu vārdu un atbild uz 5 nejauši izvēlētiem jautājumiem. Pēc spēles rezultāts (vārds, punkti) tiek pievienots highscore.csv failam. Visbeidzot tiek izvadīts TOP 5 spēlētāju saraksts.

with open("highscore.csv", "a", encoding="utf-8") as fails:
    fails.write(f"{vards},{punkti}\n")

with open("jautajumi.json", "r", encoding="utf-8") as fails:
    jautajumi = json.load(fails)
Iepriekš apgūts: failu režīmi, with open, JSON un CSV rindas.

Darba uzdevuma gaita

1. solis: Datu ielāde no JSON (1. līmenis)

  1. Failā jautajumi.json izveido vismaz 10 jautājumus formātā:
    [
      {"jautajums": "Cik ir 2+2?", "varianti": ["3","4","5"], "pareiza": 1},
      ...
    ]
  2. Failā data.py izveido funkciju ielade_jautajumus(), kas atver JSON ar with open() un atgriež sarakstu.
  3. Pārbaudi, ka print(ielade_jautajumus()) izdrukā jautājumus.

2. solis: Spēles cikls (2. līmenis)

  1. Failā spele.py izveido funkciju spele_quiz(jautajumi, vards).
  2. Ar random.sample(jautajumi, 5) izvēlies 5 nejaušus jautājumus.
  3. Ar for ciklu rādi katru jautājumu, ievāc atbildi un palielini punktus, ja atbilde pareiza.
  4. Funkcija atgriež iegūtos punktus.

3. solis: Highscore saglabāšana CSV (3. līmenis)

  1. Failā highscore.py izveido saglaba(vards, punkti), kas pievieno rindu CSV failam (mode "a").
  2. Izveido paradi_top(), kas nolasa CSV, sakārto pēc punktiem dilstošā secībā un izvada TOP 5.
  3. Failā main.py savieno visu: ielādē jautājumus, palaiž spēli, saglabā rezultātu, parāda TOP 5.
  4. Pievieno README.md ar palaišanas instrukciju un JSON formāta aprakstu.
  5. GitHub vēsturē ir vismaz 4 saturīgi commit.

Praktiskie uzdevumi

1. uzdevums -

Ielādē jautājumus no JSON

Beigās tavi jautājumi dzīvos ārpus koda, atsevišķā failā.

  1. Izveido failu jautajumi.json ar sarakstu no 5 vārdnīcām.
  2. Ieraksti katrā vārdnīcā atslēgas teksts, varianti un pareizais.
  3. Uzraksti funkciju def ielade_jautajumus(fails="jautajumi.json"):.
  4. Atgriez tajā json.load(f) rezultātu.
  5. Izsauc funkciju un izdrukā len(jautajumi).
  6. Palaid un pārbaudi, ka izdrukājas skaitlis 5.

Gatavs, kad: programma izdrukā Ielādēti 5 jautājumi. un neizmet kļūdu par formātu.

2. uzdevums -

Uzraksti spēles ciklu ar punktiem

Beigās spēlētājs atbildēs uz jautājumiem un redzēs savu rezultātu.

  1. Nolasi spēlētāja vārdu ar input().
  2. Izvēlies 5 nejaušus jautājumus ar random.sample(jautajumi, 5).
  3. Uzraksti ciklu, kas izdrukā jautājuma tekstu un numurētus variantus.
  4. Nolasi atbildi un salīdzini to ar atslēgu pareizais.
  5. Palielini punktus par vienu pēc katras pareizas atbildes.
  6. Izdrukā beigās kopējos punktus ar f-string.
  7. Palaid un izspēlē vienu pilnu spēli.

Gatavs, kad: spēle uzdod 5 jautājumus un beigās parāda punktus no 0 līdz 5.

3. uzdevums -

Saglabā rezultātu CSV un parādi TOP 5

Beigās rezultāti saglabāsies starp spēlēm.

  1. Pievieno rezultātu ar fails.write(f"{vards},{punkti}\n") režīmā "a".
  2. Palaid spēli trīs reizes ar dažādiem vārdiem.
  3. Atver highscore.csv un pārbaudi, ka ir trīs rindas.
  4. Nolasi failu atpakaļ un sadali katru rindu ar rinda.strip().split(",").
  5. Sakārto rezultātus pēc punktiem dilstoši.
  6. Izdrukā TOP 5 ar numerāciju.
  7. Veic commit ar ziņu Pievieno quiz speli, push un iesniedz saiti.

Gatavs, kad: pēc trim spēlēm CSV ir trīs rindas, un TOP saraksts sākas ar labāko rezultātu.

Papildu uzdevums - Pievieno kategorijas

Ja pamatdarbs ir gatavs, ļauj spēlētājam izvēlēties jautājumu tēmu.

  1. Pievieno katram jautājumam atslēgu kategorija.
  2. Izdrukā spēles sākumā pieejamās kategorijas.
  3. Nolasi spēlētāja izvēli.
  4. Atlasi tikai tos jautājumus, kas atbilst izvēlei.
  5. Pārbaudi, ka spēle strādā arī tad, ja kategorijā ir mazāk par 5 jautājumiem.

Gatavs, kad: spēle uzdod tikai izvēlētās kategorijas jautājumus un neavarē, ja to ir maz.

Biežākās kļūdas (un kā tās labot)

Vērtēšanas kritēriji

Kritērijs Sācis (1-3) Turpina (4-6) Apguvis (7-8) Padziļināti (9-10)
JSON ielāde Jautājumi ievietoti tieši kodā. JSON tiek nolasīts, bet bez kļūdu pārbaudes. Lieto with open() un kods darbojas ar dažādiem JSON failiem. Pievienota validācija (try/except), ja JSON formāts kļūdains.
Spēles cikls Cikls neizpildās vai izraisa kļūdu. Cikls strādā, bet punktu skaitīšanā ir kļūda. Cikls korekti rāda jautājumus un skaita punktus. Pievienots laika ierobežojums vai bonusa punkti.
CSV pastāvība Rezultāts netiek saglabāts. Rezultāts tiek pārrakstīts katru reizi. Rezultāts tiek pievienots, TOP 5 tiek pareizi sakārtots. Veikta papildu analīze (vidējais punktu skaits, statistika).
Modularitāte un Git Viens fails, viens commit. Vairāki faili, bet imports nepilnīgs. Sadalīts 3+ moduļos, PEP 8, 4+ commit. Profesionāls README, type hints, izvērsta Git vēsture.

Pašpārbaudes saraksts

Koda piemērs: JSON ielāde

import json

def ielade_jautajumus(fails="jautajumi.json"):
    """Nolasa jautājumus no JSON faila un atgriež sarakstu."""
    with open(fails, "r", encoding="utf-8") as f:
        return json.load(f)

jautajumi = ielade_jautajumus()
print(f"Ielādēti {len(jautajumi)} jautājumi.")
Ielādēti 10 jautājumi.