Tavs šīs stundas izaicinājums: Izveidot "Slavas zāli", kas atceras visus spēlētājus. Tu iemācīsies 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)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:
[]."w" režīmu.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'."
rezultati.py un importē json.visi_rezultati = [].dati = {"vards": vards, "punkti": int(punkti)} (svarīgi: punkti ir jākonvertē uz skaitli!).leaderboard.json.Iemācīties nolasīt esošos rezultātus, pirms pievienot jaunu, lai dati netiktu pārrakstīti.
leaderboard.json ar json.load().try...except FileNotFoundError: blokā. Ja fails neeksistē, definē visi_rezultati = [].Iemācīties sakārtot sarakstu un saglabāt tikai labākos rezultātus.
visi_rezultati.sort(key=lambda x: x['punkti'], reverse=True)top_5 = visi_rezultati[:5].paradit_top(), kas ar for ciklu izvada rezultātus glītā, numurētā sarakstā.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 lietoint()!
3. Neērti lasāms JSON: Saglabājot failu, vienmēr lietojson.dump(dati, f, indent=4), lai fails būtu strukturēts un viegli pārbaudāms.
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)