11.6 Noslēguma projekts: Klases turnīra simulators
Stundas uzdevums: Apvienot visas OOP prasmes - klases, mantošanu un polimorfismu - pilnvērtīgā klases turnīra simulatorā.
70 min plāns: Ievads un kritēriju pārruna (~10 min) · 1. uzdevums (~15 min) - uzbūvē bāzes klasi un divas lomas · 2. uzdevums (~25 min) - pievieno šķēršļus un polimorfismu · 3. uzdevums (~20 min) - palaid turnīra ciklu un statistiku. Papildu uzdevumu sāc tikai tad, ja pārējie trīs ir gatavi.
Pirms sāc: šis ir 11. tēmas noslēguma projekts. Izmanto visu apgūto OOP: klases, __init__, mantošanu, super() un polimorfismu.
Teorija: Simulatora apraksts un arhitektūra
Tavs klases turnīra simulators izmantos visas OOP iespējas:
- Bāzes klase
Dalibnieks- kopīga visiem (enerģija, vards, sanem_punktus, vai_aktivs). - Bērnu klases:
Kapteinis(stabilitāte),Prezentetajs(idejas),LaikaSargs(precīzs temps). - Šķēršļi:
PrinteraRinda,WiFiPauze,PazudusaisMarkieris- katrs ar savu stilu. - Polimorfisms: visiem ir
gajiens(), bet darbība atšķiras. - Turnīra cikls: nejauši klases izaicinājumi, rundām balstīti gājieni.
Failu struktūra:
klases_turnirs/
├── main.py # turnīra cikls
├── dalibnieki.py # Kapteinis, Prezentetajs, LaikaSargs
├── skersli.py # PrinteraRinda, WiFiPauze, PazudusaisMarkieris
├── bazes.py # Dalibnieks (bāzes klase)
└── riki.py # Markieris, Taimeris, PrezentacijasPults
Praktiskie uzdevumi
1. uzdevums -
Uzbūvē bāzes klasi un divas lomas
Beigās tev būs strādājoša dalībnieku hierarhija.
- Izveido failu
turnirs.py. - Uzraksti klasi
Dalibnieksarvards,energijauntemps. - Pievieno tai metodes
vai_aktivs()unsanem_punktus(). - Izveido bērna klasi
Kapteinisar lielāku enerģiju. - Izveido bērna klasi
Prezentetajsar lielāku tempu. - Izveido pa vienam objektam un izdrukā to sākuma vērtības.
Gatavs, kad: abas lomas mantojušas kopīgās metodes, bet to sākuma vērtības atšķiras.
2. uzdevums -
Pievieno šķēršļus un polimorfismu
Beigās katram šķērslim būs sava iedarbība.
- Izveido klasi
Skerslisar metodidef iedarbojas(self, dalibnieks):. - Izveido bērna klasi
PrinteraRinda, kas atņem enerģiju. - Izveido bērna klasi
WiFiPauze, kas samazina tempu. - Ieliec abus šķēršļus vienā sarakstā.
- Izsauc ciklā katram
iedarbojas()uz viena dalībnieka. - Izdrukā dalībnieka stāvokli pēc katra šķēršļa.
- Pārbaudi, ka cikls nezina, kurš šķērslis tieši ir.
Gatavs, kad: viens cikls apstrādā abus šķēršļus, un katrs iedarbojas atšķirīgi.
3. uzdevums -
Palaid turnīra ciklu un statistiku
Beigās simulators noskaidros turnīra uzvarētāju.
- Izveido sarakstu ar vismaz trim dalībniekiem.
- Uzraksti ciklu, kas turpinās, kamēr aktīvi vismaz divi dalībnieki.
- Izvēlies katrā kārtā nejaušu šķērsli ar
random.choice(). - Piemēro to nejaušam dalībniekam un izdrukā notikumu.
- Izdrukā beigās uzvarētāju un kārtu skaitu.
- Palaid simulāciju trīs reizes un pieraksti rezultātus.
- Veic commit, push un iesniedz krātuves saiti.
Gatavs, kad: trīs palaišanas reizēs uzvar dažādi dalībnieki, un cikls vienmēr beidzas.
Papildu uzdevums - Pievieno turnīra žurnālu
Ja pamatdarbs ir gatavs, saglabā visu notikumu vēsturi.
- Izveido sarakstu
zurnalspirms cikla. - Pievieno tam katru notikumu kā tekstu.
- Izdrukā beigās visu žurnālu ar numerāciju.
- Saglabā žurnālu failā
turnirs.txt. - Pārbaudi, ka fails satur visas kārtas.
Gatavs, kad: failā turnirs.txt ir tikpat rindu, cik turnīrā bija kārtu.
Biežākās kļūdas
- Cirkulārs imports:
dalibnieki.pyimportsskersli.py, kas importsdalibnieki.py- sadali kopējās lietasbazes.py. - Bezgalīgs cikls turnīrā: Aizmirsts atjaunināt enerģiju vai pārbaudīt
vai_aktivs(). - Klases atribūts list:
self.punktu_vesture = []konstruktorā - NEKAD klases līmenī (visi dalītu vienu sarakstu).
Koda piemērs
import random
class Dalibnieks:
def __init__(self, vards, energija, temps):
self.vards = vards
self.energija = energija
self.temps = temps
def vai_aktivs(self): return self.energija > 0
def sanem_punktus(self, b): self.energija = max(0, self.energija - b)
def __str__(self): return f"{self.vards} ({self.energija} enerģija)"
class Kapteinis(Dalibnieks):
def __init__(self, vards):
super().__init__(vards, energija=150, temps=15)
self.stabilitate = 5
def sanem_punktus(self, b): super().sanem_punktus(max(0, b - self.stabilitate))
class PrinteraRinda(Dalibnieks):
def __init__(self):
super().__init__("PrinteraRinda", energija=40, temps=8)
anna = Kapteinis("Anna")
printeris = PrinteraRinda()
while anna.vai_aktivs() and printeris.vai_aktivs():
printeris.sanem_punktus(anna.temps)
if printeris.vai_aktivs(): anna.sanem_punktus(printeris.temps)
uzvaretajs = anna if anna.vai_aktivs() else printeris
print(f"Uzvarētājs: {uzvaretajs}")