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.
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)
Darba uzdevuma gaita
1. solis: Datu ielāde no JSON (1. līmenis)
- Failā
jautajumi.jsonizveido vismaz 10 jautājumus formātā:[ {"jautajums": "Cik ir 2+2?", "varianti": ["3","4","5"], "pareiza": 1}, ... ] - Failā
data.pyizveido funkcijuielade_jautajumus(), kas atver JSON arwith open()un atgriež sarakstu. - Pārbaudi, ka
print(ielade_jautajumus())izdrukā jautājumus.
2. solis: Spēles cikls (2. līmenis)
- Failā
spele.pyizveido funkcijuspele_quiz(jautajumi, vards). - Ar
random.sample(jautajumi, 5)izvēlies 5 nejaušus jautājumus. - Ar
forciklu rādi katru jautājumu, ievāc atbildi un palielini punktus, ja atbilde pareiza. - Funkcija atgriež iegūtos punktus.
3. solis: Highscore saglabāšana CSV (3. līmenis)
- Failā
highscore.pyizveidosaglaba(vards, punkti), kas pievieno rindu CSV failam (mode"a"). - Izveido
paradi_top(), kas nolasa CSV, sakārto pēc punktiem dilstošā secībā un izvada TOP 5. - Failā
main.pysavieno visu: ielādē jautājumus, palaiž spēli, saglabā rezultātu, parāda TOP 5. - Pievieno
README.mdar palaišanas instrukciju un JSON formāta aprakstu. - 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ā.
- Izveido failu
jautajumi.jsonar sarakstu no 5 vārdnīcām. - Ieraksti katrā vārdnīcā atslēgas
teksts,variantiunpareizais. - Uzraksti funkciju
def ielade_jautajumus(fails="jautajumi.json"):. - Atgriez tajā
json.load(f)rezultātu. - Izsauc funkciju un izdrukā
len(jautajumi). - 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.
- Nolasi spēlētāja vārdu ar
input(). - Izvēlies 5 nejaušus jautājumus ar
random.sample(jautajumi, 5). - Uzraksti ciklu, kas izdrukā jautājuma tekstu un numurētus variantus.
- Nolasi atbildi un salīdzini to ar atslēgu
pareizais. - Palielini punktus par vienu pēc katras pareizas atbildes.
- Izdrukā beigās kopējos punktus ar f-string.
- 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.
- Pievieno rezultātu ar
fails.write(f"{vards},{punkti}\n")režīmā"a". - Palaid spēli trīs reizes ar dažādiem vārdiem.
- Atver
highscore.csvun pārbaudi, ka ir trīs rindas. - Nolasi failu atpakaļ un sadali katru rindu ar
rinda.strip().split(","). - Sakārto rezultātus pēc punktiem dilstoši.
- Izdrukā TOP 5 ar numerāciju.
- 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.
- Pievieno katram jautājumam atslēgu
kategorija. - Izdrukā spēles sākumā pieejamās kategorijas.
- Nolasi spēlētāja izvēli.
- Atlasi tikai tos jautājumus, kas atbilst izvēlei.
- 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)
- CSV katru reizi pārrakstās: rezultātu saglabāšanai izmanto režīmu
"a", nevis"w". - JSON nelasās: pārbaudi komatus starp ierakstiem un pēdiņas ap tekstiem.
- TOP 5 kārto nepareizi: pārvērt punktus par
int, pirms salīdzini. - Jautājumi ir cietkodēti: pārvieto tos uz
jautajumi.json, lai kods un dati būtu atdalīti.
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
- Programma startē, palaižot tikai
main.py. - Jautājumi tiek ielādēti no
jautajumi.jsonfaila, nevis cietkodēti. - Pēc spēles rezultāts tiek pievienots
highscore.csv(nevis pārrakstīts). - TOP 5 saraksts tiek izvadīts pareizā sakārtotā secībā.
- Programma neavarē, ja CSV vai JSON fails ir tukšs.
- GitHub vēsturē ir vismaz 4 saturīgi commit ar skaidriem ziņojumiem.
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.")