11.6 Noslēguma projekts: RPG cīņas spēle

Tavs šīs stundas izaicinājums: Apvienot visas OOP prasmes — klases, mantošanu un polimorfismu — pilnvērtīgā RPG cīņas spēlē.

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

Teorija: Spēles apraksts un arhitektūra

Tava RPG cīņas spēle izmantos visas OOP iespējas:

Failu struktūra:

rpg/
├── main.py          # spēles cikls
├── varoni.py        # Bruninieks, Burvis, Strelnieks
├── ienaidnieki.py   # Goblins, Pukis, Skelets
├── bazes.py         # Tels (bāzes klase)
└── ieroci.py        # Zobens, Loks, Burvjugrāmata

1. uzdevums: Klašu hierarhija (1. līmenis)

Izveido pilnu klašu sistēmu.

Izpildes soļi:

  1. Failā bazes.py: class Tels ar __init__(self, vards, hp), cizt, vai_dzivs, __str__.
  2. Failā varoni.py: Bruninieks (bruņas), Burvis (mana + burvojumi), Strelnieks (kritisks sitiens).
  3. Failā ienaidnieki.py: 3 ienaidnieku tipi ar dažādiem HP/speks.
  4. Galvenajā main.py importē un izveido katra tipa objektu, izvada to.

2. uzdevums: Cīņas mehānika (2. līmenis)

Implementē rundām balstītu cīņu.

Izpildes soļi:

  1. Funkcija cinas_runda(varonis, ienaidnieks): viens uzbrukums no katras puses.
  2. Pievieno nejaušumu: 20% iespēja "netrāpīt" (random.random() < 0.2).
  3. Pievieno kritisko sitienu: 10% iespēja 2× bojājums.
  4. Funkcija cina(varonis, ienaidnieks): while cikls līdz viens nokrīt; izvada notikumus.
  5. Galvenā funkcija spelet(): izveido varoni, ģenerē 5 nejaušus ienaidniekus, cīnās ar katru.

3. uzdevums: Saskarne un saglabāšana (3. līmenis)

Pievieno lietotāja saskarni un saglabāšanu.

Izpildes soļi:

  1. main.py: izvēlne ar 1) Spēlēt; 2) Skatīt rezultātus; 3) Iziet.
  2. Pirms spēles: lietotājs izvēlas klasi (Bruninieks/Burvis/Strelnieks) un ievada vārdu.
  3. Pēc spēles: saglabā JSON failā rezultati.json — vārds, klase, uzvarētie ienaidnieki, datums.
  4. Opcija "Skatīt rezultātus" parāda TOP 10 (sakārtotus pēc uzvarētajiem).
  5. GitHub: vismaz 5 commit ar skaidriem ziņojumiem un README ar palaišanas instrukciju.

Papildus uzdevums: Inventārs ar ieročiem

Pievieno ieroču klases ar bonusu.

Izpildes soļi:

  1. ieroci.py: class Ierocis ar nosaukums, bojajums_bonus.
  2. Specifiski: Zobens(Ierocis), Loks(Ierocis) — katrs ar savām īpašībām.
  3. Varonim pievieno self.ierocis — viņa uzbrukums kļūst self.speks + self.ierocis.bojajums_bonus.
  4. Pirms spēles ļauj izvēlēties ieroci.

Biežākās kļūdas

Koda piemērs

import random

class Tels:
    def __init__(self, vards, hp, speks):
        self.vards = vards
        self.hp = hp
        self.speks = speks

    def vai_dzivs(self): return self.hp > 0
    def cizt(self, b): self.hp = max(0, self.hp - b)
    def __str__(self): return f"{self.vards} ({self.hp} HP)"

class Bruninieks(Tels):
    def __init__(self, vards):
        super().__init__(vards, hp=150, speks=15)
        self.brunas = 5
    def cizt(self, b): super().cizt(max(0, b - self.brunas))

class Goblins(Tels):
    def __init__(self):
        super().__init__("Goblins", hp=40, speks=8)

bruno = Bruninieks("Lanselots")
goblins = Goblins()

while bruno.vai_dzivs() and goblins.vai_dzivs():
    goblins.cizt(bruno.speks)
    if goblins.vai_dzivs(): bruno.cizt(goblins.speks)

uzvaretajs = bruno if bruno.vai_dzivs() else goblins
print(f"Uzvarētājs: {uzvaretajs}")
Uzvarētājs: Lanselots (130 HP)
⬅ Iepriekšējā stunda Tēmas apkopojums ➡