ebSkola

3.6 Noslēguma projekts: Klases turnīra simulators

Stundas uzdevums: Apvienot OOP, signālus, struct un C# skriptus pilnvērtīgā rundām balstītā klases turnīra simulācijā.

SR 2.4.1. Problēmu dekompozīcija SR 2.4.7. UI SR 2.4.15. Modulāras programmas SR 2.4.18. OOP

80 min plāns: Ievads un kritēriju pārruna (~10 min) · 1. uzdevums (~20 min) - saliec komandu un šķēršļus · 2. uzdevums (~25 min) - uzraksti vienas kārtas loģiku · 3. uzdevums (~20 min) - pievieno turnīra ciklu un rezultātu · Iesniegšana (~5 min).

Pirms sāc: šis ir 3. tēmas noslēguma projekts. Izmanto visu apgūto: klases, mantošanu, signālus, Inspector īpašības un struct. Sāc ar vienu kārtu, tikai tad taisi ciklu.

Teorija: Simulatora apraksts

Rundām balstīta klases turnīra simulācija ar trim spēlētāja dalībniekiem (Captain, Presenter, TimeKeeper) pret nejauši ģenerētiem šķēršļiem (PrinterQueue, WifiDrop, MissingMarker).

Turnīra plūsma:

  1. Turnīra sākumā izvēlies 3 dalībnieku komandu.
  2. Šķēršļi tiek ģenerēti.
  3. Katras kārtas: spēlētājs izvēlas darbību (izvēlēties gājienu, prezentācijas bonusu, atjaunot enerģiju).
  4. Pēc tam šķēršļi samazina komandas enerģiju.
  5. Raundi turpinās, līdz viena puse pabeigusi visus gājienus.

Klašu hierarhija: Participant (base) → Captain, Presenter, TimeKeeper; Obstacle (base) → PrinterQueue, WifiDrop, MissingMarker.

Kā šo izmantot projektā

Atceries: ar redzamu efektu editorā nepietiek. Paskaidro, kura C# klase glabā stāvokli, kura metode to maina un kā Godot node struktūra izmanto šo kodu.

Pārbaudi: katrai būtiskai turnīra lomai ir C# klase vienā .cs failā, ar konstruktoriem, metodēm, signāliem vai mantošanu.

public class OopCheckpoint
{
    public string Lesson = "3.6 Noslēguma projekts: Klases turnīra simulators";
    public bool UsesCSharp = true;
    public bool HasScriptFile = true;
    public bool HasSingleResponsibility = true;
    public bool UsesGodotInspector = true;
}

Praktiskie uzdevumi

1. uzdevums -

Saliec komandu un šķēršļus

Beigās tev būs trīs dalībnieki un trīs šķēršļi, gatavi turnīram.

  1. Izveido C# klasi TournamentManager, kas manto no Node.
  2. Pievieno tai private List<Participant> party = new(); un private List<Obstacle> obstacles = new();.
  3. Pievieno komandai pa vienam Captain, Presenter un TimeKeeper objektam.
  4. Pievieno šķēršļu sarakstam trīs dažādus Obstacle mezglus.
  5. Izdrukā _Ready() metodē visu dalībnieku un šķēršļu nosaukumus.
  6. Būvē un palaid, lai pārbaudītu abus sarakstus.
  7. Pārliecinies, ka neviens saraksts nav tukšs.

Gatavs, kad: Output panelī izdrukājas trīs dalībnieki un trīs šķēršļi ar saviem nosaukumiem.

2. uzdevums -

Uzraksti vienas kārtas loģiku

Beigās viena turnīra kārta samazinās enerģiju pareizajiem objektiem.

  1. Uzraksti metodi private void PlayTurn().
  2. Izvēlies tajā nejaušu šķērsli ar (int)GD.RandRange(0, obstacles.Count - 1).
  3. Izvēlies nejaušu dalībnieku no komandas.
  4. Izsauc dalībniekam ApplyPenalty ar šķēršļa spēku.
  5. Izdrukā, kurš šķērslis kuram dalībniekam iedarbojās un cik enerģijas palika.
  6. Izsauc metodi trīs reizes un pārbaudi izdrukas.
  7. Pārbaudi, ka katra loma sodu izcieš atšķirīgi.

Gatavs, kad: katrā kārtā izdrukājas cits šķērslis un dalībnieks, un kapteinis zaudē mazāk nekā pārējie.

3. uzdevums -

Pievieno turnīra ciklu un rezultātu

Beigās turnīrs noskaidros uzvarētāju pats.

  1. Uzraksti ciklu, kas izsauc PlayTurn(), kamēr aktīvi vismaz divi dalībnieki.
  2. Pieslēdzies katra dalībnieka signālam Finished no 3.3 stundas.
  3. Izdrukā paziņojumu, kad kāds dalībnieks izstājas.
  4. Saskaiti kārtu skaitu ar lauku private int currentTurn = 0;.
  5. Izdrukā beigās uzvarētāja vārdu un kopējo kārtu skaitu.
  6. Palaid simulāciju trīs reizes un pieraksti rezultātus.
  7. Veic commit un push.

Gatavs, kad: trīs palaišanas reizēs uzvar dažādi dalībnieki, un cikls vienmēr beidzas, nevis griežas bezgalīgi.

Papildu uzdevums - Parādi turnīru uz ekrāna

Ja pamatdarbs ir gatavs, pārcel izdrukas no Output uz spēles logu.

  1. Pievieno scēnai Label mezglu katram dalībniekam.
  2. Atjaunini tajos enerģijas vērtību pēc katras kārtas.
  3. Pievieno vienu Label notikumu žurnālam.
  4. Pievieno pogu, kas izpilda vienu kārtu.
  5. Izspēlē turnīru, spiežot pogu, nevis palaižot ciklu.

Gatavs, kad: turnīru var izspēlēt ar pogu, un enerģijas vērtības uz ekrāna mainās pēc katras kārtas.

Ko sagatavo

Stundas mērķis: Tev ir strādājošs klases turnīra simulators: trīs dalībnieku lomas ar atšķirīgu uzvedību, trīs šķēršļi, kārtu cikls ar signāliem par izstāšanos un izdrukāts uzvarētājs ar kārtu skaitu.

GitHub krātuvē jābūt:

  1. Viss projekts ar C# skriptiem, scēnām un projekta failiem.
  2. Ekrānuzņēmums ar Output paneli, kurā redzama vismaz viena pilna turnīra norise līdz uzvarētājam.
  3. Faili TournamentManager.cs, Participant.cs un vismaz vienas lomas klase.
  4. README.md: trīs palaišanas reižu rezultāti un viens teikums par to, kāpēc rezultāti atšķiras.

Kā iesniedz: Veic commit un push. Skolotāja norādītajā vietā ievieto tikai GitHub krātuves saiti; visiem prasītajiem failiem, README.md pierakstiem un pierādījumiem jābūt pašā krātuvē.

Biežākās kļūdas

  • Objekti dublējas: pārbaudi, vai party un obstacles netiek aizpildīti vairākas reizes.
  • UI nesinhronizējas: pieslēdz signālus vienā vietā un pēc katras kārtas atjaunini visas enerģijas joslas.
  • Turnīrs nebeidzas: pārbaudi beigu nosacījumu - aktīvo dalībnieku skaitam jāsamazinās, kad kāds izstājas.

Godot ekrānuzņēmumi

klases turnīra simulācijas ekrāns: kreisajā 3 dalībnieku ENERGY bari, vidū penalty number animation, labajā 3 šķēršļi, apakšā action menu (Move, Bonus, Rest, Skip).
klases turnīra simulācijas ekrāns: kreisajā 3 dalībnieku ENERGY bari, vidū penalty number animation, labajā 3 šķēršļi, apakšā action menu (Move, Bonus, Rest, Skip).
Klašu UML diagramma: Participant → Captain, Presenter, TimeKeeper; Obstacle → PrinterQueue, WifiDrop, MissingMarker; abas hierarhijas savienotas ar BattleManager.
Klašu UML diagramma: Participant → Captain, Presenter, TimeKeeper; Obstacle → PrinterQueue, WifiDrop, MissingMarker; abas hierarhijas savienotas ar BattleManager.

Koda piemērs (paplašināts)

using Godot;
using System.Collections.Generic;

public partial class TournamentManager : Node
{
    [Signal] public delegate void TournamentWonEventHandler();

    private readonly List<Participant> party = new();
    private readonly List<Obstacle> obstacles = new();
    private int currentTurn = 0;

    public void StartTournament()
    {
        foreach (Obstacle obstacle in obstacles)
        {
            obstacle.Finished += OnObstacleFinished;
        }
        NextTurn();
    }

    public void ExecuteFocus(Participant participant, Obstacle target)
    {
        int penalty = participant.GetStats().GetTotalFocus();
        target.ApplyPenalty(penalty);
        if (obstacles.Count == 0) EmitSignal(SignalName.TournamentWon);
        else NextTurn();
    }

    private void OnObstacleFinished()
    {
        // Atrod un noņem pabeigto šķērsli
        obstacles.RemoveAll(obstacle => !obstacle.IsActive());
    }

    private void NextTurn()
    {
        currentTurn++;
    }
}
Pilnvērtīga klases turnīra simulācija: 3 dalībnieki pret 3 šķēršļiem, kārtu sistēma, animētas penalty numbers, uzvara/zaudēšana.