12.6 Noslēguma projekts: Daudzspēlētāju Krustiņi un nullītes

Tavs šīs stundas izaicinājums: Apvienot visu kursā apgūto, lai izveidotu pilnvērtīgu daudzspēlētāju "Krustiņi un nullītes" spēli, kas pieejama publiski internetā.

SR 2.4.1. Problēmas dekompozīcija SR 2.4.7. Lietotāja saskarne SR 2.4.11. API SR 2.4.18. OOP SR 2.4.17. Datu krātuves

Teorija: Spēles apraksts un arhitektūra

Tava noslēguma spēle ir daudzspēlētāju "Krustiņi un nullītes", kurā divi spēlētāji no atšķirīgiem datoriem var spēlēt vienu un to pašu partiju reālā laikā.

Tehnoloģijas (viss kurss vienā):

Galvenās funkcijas:

1. uzdevums: Backend ar OOP un DB (1. līmenis)

Izveido pilnu Flask serveri.

Izpildes soļi:

  1. Datubāzē izveido tabulas: speles (id, kods, laukums TEXT, pasreizejais TEXT, status TEXT, izveidots TIMESTAMP) un uzvaras (id, vards, koda).
  2. Klase Spele: __init__(kods) izveido tukšu 9-pozīciju virkni, gajiens(poz, simbols), uzvaretajs() pārbauda 8 uzvaras kombinācijas.
  3. Maršrutas: POST /api/spele izveido jaunu, atgriež kodu; GET /api/spele/<kods> stāvokli; POST /api/spele/<kods>/gajiens izpilda gājienu.
  4. Saglabā kodu: app.py, models.py, schema.sql.

2. uzdevums: Frontend ar HTML/CSS/JS (2. līmenis)

Izveido pielāgojamu lietotāja saskarni.

Izpildes soļi:

  1. static/index.html: 2 ekrāni — sākuma ("Izveidot" / "Pievienoties") un spēles (3×3 režģis + statuss).
  2. static/style.css: 3×3 grid CSS, hover efekti, atšķirīgas krāsas X un O.
  3. static/spele.js: fetch() izsaukumi, polling ik 2 sek. ar setInterval(), klikšķu apstrāde.
  4. Pievieno paziņojumus: "Tavs gājiens", "Pretinieka gājiens", "Uzvarēja X!".
  5. Pārliecinies, ka spēle darbojas no diviem dažādiem pārlūkiem.

3. uzdevums: Izvietošana un pulēšana (3. līmenis)

Publicē projektu un veic gala uzlabojumus.

Izpildes soļi:

  1. Sagatavo requirements.txt, Procfile, .env.example.
  2. Push uz GitHub un izvieto Render (Web Service + PostgreSQL).
  3. Pievieno TOP 10 uzvarētāju lapu (/uzvaras).
  4. Pievieno spēles izsmelšanos (DELETE spēles, kas vecākas par 1 stundu).
  5. Uzraksti README.md ar: kā spēlēt, tehnoloģijas, palaišana lokāli, public URL.
  6. GitHub: vismaz 8 commit ar skaidriem ziņojumiem.
  7. Aizpildi AUDIT.md ar projekta retrospektīvu — kas izdevās, kas nē, ko mācīsi citiem.

Papildus uzdevums: AI pretinieks

Pievieno minimax algoritmu, lai cilvēks varētu spēlēt pret datoru.

Izpildes soļi:

  1. Implementē minimax(laukums, dziluma, ir_X) klasi AISpeletajs.
  2. Atgriež labāko gājienu visās 9 pozīcijās.
  3. Pievieno frontend opciju: "Spēlēt pret AI".

Biežākās kļūdas

Koda piemērs

class Spele:
    """Krustiņi un nullītes spēles loģika."""
    UZVARES = [(0,1,2),(3,4,5),(6,7,8),(0,3,6),(1,4,7),(2,5,8),(0,4,8),(2,4,6)]

    def __init__(self, laukums="---------", pasreizejais="X"):
        self.laukums = list(laukums)
        self.pasreizejais = pasreizejais

    def gajiens(self, poz, simbols):
        if self.laukums[poz] != "-": raise ValueError("Aizņemta pozīcija")
        if simbols != self.pasreizejais: raise ValueError("Nav tavs gājiens")
        self.laukums[poz] = simbols
        self.pasreizejais = "O" if simbols == "X" else "X"

    def uzvaretajs(self):
        for a, b, c in self.UZVARES:
            if self.laukums[a] == self.laukums[b] == self.laukums[c] != "-":
                return self.laukums[a]
        if "-" not in self.laukums: return "neizšķirts"
        return None

# Lietošana
s = Spele()
s.gajiens(0, "X"); s.gajiens(4, "O"); s.gajiens(1, "X"); s.gajiens(5, "O"); s.gajiens(2, "X")
print(f"Uzvarētājs: {s.uzvaretajs()}")
Uzvarētājs: X
⬅ Iepriekšējā stunda Tēmas apkopojums ➡