ebSkola

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ā.

SR 2.4.18. Lieto OOP pamatus SR 2.4.15. Modulāras programmas un funkcijas SR 2.4.14. Vadības struktūras

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.

  1. Izveido failu turnirs.py.
  2. Uzraksti klasi Dalibnieks ar vards, energija un temps.
  3. Pievieno tai metodes vai_aktivs() un sanem_punktus().
  4. Izveido bērna klasi Kapteinis ar lielāku enerģiju.
  5. Izveido bērna klasi Prezentetajs ar lielāku tempu.
  6. 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.

  1. Izveido klasi Skerslis ar metodi def iedarbojas(self, dalibnieks):.
  2. Izveido bērna klasi PrinteraRinda, kas atņem enerģiju.
  3. Izveido bērna klasi WiFiPauze, kas samazina tempu.
  4. Ieliec abus šķēršļus vienā sarakstā.
  5. Izsauc ciklā katram iedarbojas() uz viena dalībnieka.
  6. Izdrukā dalībnieka stāvokli pēc katra šķēršļa.
  7. 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.

  1. Izveido sarakstu ar vismaz trim dalībniekiem.
  2. Uzraksti ciklu, kas turpinās, kamēr aktīvi vismaz divi dalībnieki.
  3. Izvēlies katrā kārtā nejaušu šķērsli ar random.choice().
  4. Piemēro to nejaušam dalībniekam un izdrukā notikumu.
  5. Izdrukā beigās uzvarētāju un kārtu skaitu.
  6. Palaid simulāciju trīs reizes un pieraksti rezultātus.
  7. 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.

  1. Izveido sarakstu zurnals pirms cikla.
  2. Pievieno tam katru notikumu kā tekstu.
  3. Izdrukā beigās visu žurnālu ar numerāciju.
  4. Saglabā žurnālu failā turnirs.txt.
  5. 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.py imports skersli.py, kas imports dalibnieki.py - sadali kopējās lietas bazes.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}")
Uzvarētājs: Anna (130 enerģija)