ebSkola

6.4 Rezultātu tabulas

Stundas uzdevums: Izveidot "Slavas zāli", kas atceras visus spēlētājus. Apgūsi, kā Read-Modify-Write ciklu: nolasīt esošos rezultātus no JSON faila, pievienot jaunu ierakstu, sakārtot tos pēc punktiem un saglabāt TOP 5 labākos rezultātus.

SR 2.4.14. (Datu struktūru kārtošana un JSON)

70 min plāns: Teorija un paraugs (~10 min) · 1. uzdevums (~15 min) - nolasi JSON un apstrādā trūkstošu failu · 2. uzdevums (~25 min) - pievieno jaunu rezultātu un saglabā · 3. uzdevums (~20 min) - sakārto un parādi TOP 5. Papildu uzdevumu sāc tikai tad, ja pārējie trīs ir gatavi.

Pirms sāc: atver VS Code un izveido failu rezultati.py. Faila scores.json sākumā nebūs - tavai programmai jāprot ar to tikt galā.

Teorija: JSON apstrādes cikls

JSON faili nav kā parasts teksta dokuments, kuram var vienkārši "pierakstīt klāt" rindas beigās. Tie ir vienoti datu objekti (parasti liels saraksts ar vārdnīcām). Lai tos pareizi papildinātu, jāievēro trīs soļi:

  1. LASĪT (Read): Ielādē visu faila saturu Python sarakstā. Ja fails neeksistē (pirmā spēles reize), izveido tukšu sarakstu [].
  2. MAINĪT (Modify): Pievieno sarakstam jaunā spēlētāja datus (kā vārdnīcu) un sakārto to.
  3. RAKSTĪT (Write): Pārraksti visu failu ar jauno, papildināto sarakstu, izmantojot "w" režīmu.

Kārtošana ar Lambda

Kad sarakstā atrodas vārdnīcas, Python nezina, pēc kura "stabiņa" (atslēgas) veikt kārtošanu. Mums ir jādod instrukcija:

$$key=lambda\ x:\ x['punkti']$$

Tas pasaka: "Apskati katru elementu (x) un kārtošanai izmanto tā vērtību pie atslēgas 'punkti'."

Praktiskie uzdevumi

1. uzdevums -

Nolasi JSON un apstrādā trūkstošu failu

Beigās programma nesabruks arī pirmajā palaišanas reizē.

  1. Ieraksti import json.
  2. Uzraksti with open("scores.json", "r", encoding="utf-8") as f: un top = json.load(f).
  3. Palaid un pieraksti kļūdas nosaukumu, jo faila vēl nav.
  4. Ieliec šo kodu try blokā.
  5. Pievieno except FileNotFoundError: un tajā top = [].
  6. Palaid vēlreiz un izdrukā top.

Gatavs, kad: pirmajā palaišanā programma izdrukā tukšu sarakstu, nevis FileNotFoundError.

2. uzdevums -

Pievieno jaunu rezultātu un saglabā

Beigās katra spēle pievienos vienu ierakstu, nedzēšot vecos.

  1. Izveido vārdnīcu jauns = {"vards": "Drosmīgais", "punkti": 120}.
  2. Pievieno to sarakstam ar top.append(jauns).
  3. Saglabā visu sarakstu ar json.dump(top, f, indent=4) režīmā "w".
  4. Palaid trīs reizes pēc kārtas.
  5. Atver scores.json un saskaiti ierakstus.
  6. Pieraksti, kāpēc te lieto režīmu "w", nevis "a".

Gatavs, kad: failā ir trīs ieraksti, un JSON joprojām ir derīgs - sākas ar [ un beidzas ar ].

3. uzdevums -

Sakārto un parādi TOP 5

Beigās labākie rezultāti būs augšā.

  1. Sakārto sarakstu ar top.sort(key=lambda x: x["punkti"], reverse=True).
  2. Izdrukā pirmos piecus ar for ieraksts in top[:5]:.
  3. Pievieno numerāciju ar enumerate.
  4. Palaid ar dažādiem punktu skaitiem un pārbaudi secību.
  5. Nomaini reverse=True uz False un palaid vēlreiz.
  6. Ieliec True atpakaļ.
  7. Pieraksti vienu secinājumu: ko dara [:5], ja ierakstu ir tikai trīs.

Gatavs, kad: saraksts sākas ar lielāko punktu skaitu, un ar trim ierakstiem [:5] neizraisa kļūdu.

Papildu uzdevums - Neļauj dublētiem vārdiem

Ja pamatdarbs ir gatavs, atjaunini esošo ierakstu, nevis pievieno jaunu.

  1. Uzraksti ciklu, kas meklē, vai vārds jau ir sarakstā.
  2. Atjaunini punktus, ja jaunais rezultāts ir labāks.
  3. Pievieno jaunu ierakstu tikai tad, ja vārds nav atrasts.
  4. Palaid divas reizes ar to pašu vārdu un dažādiem punktiem.
  5. Pārbaudi, ka failā ir tikai viens ieraksts ar šo vārdu.

Gatavs, kad: viens spēlētājs sarakstā parādās tikai vienu reizi, ar savu labāko rezultātu.

Biežākās kļūdas:

1. Datu pārrakstīšana: Ja Tu aizmirsti vispirms nolasīt esošos datus (1. solis), katrs jauns spēlētājs izdzēsīs visus iepriekšējos, atstājot failā tikai vienu ierakstu.
2. Kārtošana kā tekstam: Ja punktus saglabāsi kā tekstu (piem., "9"), kārtojot tas tiks uzskatīts par "lielāku" nekā "100" (jo 9 ir lielāks par 1 alfabētā). Vienmēr lieto int()!
3. Neērti lasāms JSON: Saglabājot failu, vienmēr lieto json.dump(dati, f, indent=4), lai fails būtu strukturēts un viegli pārbaudāms.

Koda piemērs

import json

# 1. Mēģinām nolasīt datus
try:
    with open("scores.json", "r", encoding="utf-8") as f:
        top_saraksts = json.load(f)
except FileNotFoundError:
    top_saraksts = [] # Ja faila nav, sākam ar tukšu lapu

# 2. Pievienojam jaunu rezultātu
jauns = {"vards": "Drosmīgais", "punkti": 150}
top_saraksts.append(jauns)

# 3. Sakārtojam un atstājam tikai TOP 5
top_saraksts.sort(key=lambda x: x['punkti'], reverse=True)
top_saraksts = top_saraksts[:5]

# Saglabājam atpakaļ failā
with open("scores.json", "w", encoding="utf-8") as f:
    json.dump(top_saraksts, f, indent=4)
Dati sakārtoti un saglabāti!
TOP 1: Drosmīgais (150 punkti)