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ā.
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:
- Turnīra sākumā izvēlies 3 dalībnieku komandu.
- Šķēršļi tiek ģenerēti.
- Katras kārtas: spēlētājs izvēlas darbību (izvēlēties gājienu, prezentācijas bonusu, atjaunot enerģiju).
- Pēc tam šķēršļi samazina komandas enerģiju.
- 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.
- Izveido C# klasi
TournamentManager, kas manto noNode. - Pievieno tai
private List<Participant> party = new();unprivate List<Obstacle> obstacles = new();. - Pievieno komandai pa vienam
Captain,PresenterunTimeKeeperobjektam. - Pievieno šķēršļu sarakstam trīs dažādus
Obstaclemezglus. - Izdrukā
_Ready()metodē visu dalībnieku un šķēršļu nosaukumus. - Būvē un palaid, lai pārbaudītu abus sarakstus.
- 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.
- Uzraksti metodi
private void PlayTurn(). - Izvēlies tajā nejaušu šķērsli ar
(int)GD.RandRange(0, obstacles.Count - 1). - Izvēlies nejaušu dalībnieku no komandas.
- Izsauc dalībniekam
ApplyPenaltyar šķēršļa spēku. - Izdrukā, kurš šķērslis kuram dalībniekam iedarbojās un cik enerģijas palika.
- Izsauc metodi trīs reizes un pārbaudi izdrukas.
- 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.
- Uzraksti ciklu, kas izsauc
PlayTurn(), kamēr aktīvi vismaz divi dalībnieki. - Pieslēdzies katra dalībnieka signālam
Finishedno 3.3 stundas. - Izdrukā paziņojumu, kad kāds dalībnieks izstājas.
- Saskaiti kārtu skaitu ar lauku
private int currentTurn = 0;. - Izdrukā beigās uzvarētāja vārdu un kopējo kārtu skaitu.
- Palaid simulāciju trīs reizes un pieraksti rezultātus.
- 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.
- Pievieno scēnai
Labelmezglu katram dalībniekam. - Atjaunini tajos enerģijas vērtību pēc katras kārtas.
- Pievieno vienu
Labelnotikumu žurnālam. - Pievieno pogu, kas izpilda vienu kārtu.
- 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:
- Viss projekts ar C# skriptiem, scēnām un projekta failiem.
- Ekrānuzņēmums ar Output paneli, kurā redzama vismaz viena pilna turnīra norise līdz uzvarētājam.
- Faili
TournamentManager.cs,Participant.csun vismaz vienas lomas klase. - 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
partyunobstaclesnetiek 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
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++;
}
}