4.2 Dictionary un Godot Dictionary
Stundas uzdevums: Apgūt asociatīvās datu struktūras inventāram un konfigurācijai.
80 min plāns: Teorija un paraugs (~10 min) · 1. uzdevums (~20 min) - izveido inventāru ar Dictionary · 2. uzdevums (~25 min) - pievieno drošu meklēšanu · 3. uzdevums (~20 min) - salīdzini C# un Godot vārdnīcas · Iesniegšana (~5 min).
Pirms sāc: atceries no Programmēšanas I vārdnīcas: inventars["zobens"] = 1. C# tam lieto Dictionary<TKey, TValue>, bet Godot pusē - Godot.Collections.Dictionary.
Teorija: Dictionary un Godot Dictionary
Asociatīvā datu struktūra glabā atslēga → vērtība pārus.
using Godot;
using Godot.Collections;
using System.Collections.Generic;
// Dictionary<TKey, TValue> - ātra meklēšana pēc atslēgas
Dictionary<string, int> inventory = new();
inventory["Health Potion"] = 5;
inventory["Mana Potion"] = 3;
if (inventory.TryGetValue("Health Potion", out int amount))
{
GD.Print(amount);
}
// Dictionary ar objektiem pēc ID
Dictionary<int, Enemy> enemyById = new();
// Godot Dictionary - der saziņai ar editoru un JSON saglabāšanai
Godot.Collections.Dictionary inv = new();
inv["coins"] = 100;
inv["arrows"] = 25;
if (inv.ContainsKey("coins")) GD.Print(inv["coins"]);
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: C# kodā pamatoti izvēlēti List, Dictionary vai HashSet, AI stāvokļi ir skaidri, un sarežģītākas sistēmas var profilēt vai atkļūdot.
public class AiDataCheckpoint
{
public string Lesson = "4.2 Dictionary un Godot Dictionary";
public bool UsesCSharp = true;
public bool ChoosesContainer = true;
public bool SeparatesAiState = true;
public bool HandlesRemovalSafely = true;
}
Praktiskie uzdevumi
1. uzdevums -
Izveido inventāru ar Dictionary
Beigās priekšmetus varēs atrast pēc nosaukuma, nevis pēc numura.
- Pievieno faila sākumā
using System.Collections.Generic;. - Izveido
Dictionary<string, int> inventory = new();. - Pievieno
inventory["Health Potion"] = 5;. - Pievieno vēl divus priekšmetus ar dažādiem daudzumiem.
- Izdrukā viena priekšmeta daudzumu pēc nosaukuma.
- Uzraksti ciklu
foreach (var pair in inventory) { ... }, kas izdrukā visu. - Pieraksti, kāpēc uz izdrukas secību nevajag paļauties.
Gatavs, kad: izdrukā redzami visi trīs priekšmeti, un tu vari paskaidrot, ka Dictionary ir paredzēts ātrai meklēšanai pēc atslēgas.
2. uzdevums -
Pievieno drošu meklēšanu
Beigās neesoša priekšmeta pieprasījums vairs neradīs pārsteigumus.
- Izdrukā
inventory["Nav taada"]un pieraksti kļūdas ziņojumu. - Izdrukā pēc tam
inventory.Countun pieraksti, vai tas mainījās. - Pieraksti, kāpēc tieša kvadrātiekavu lietošana bez pārbaudes ir bīstama.
- Nomaini pārbaudi uz
if (inventory.TryGetValue("Health Potion", out int amount)) { ... }. - Uzraksti metodi
int GetAmount(string name), kas atgriež 0, ja priekšmeta nav. - Izsauc to ar esošu un neesošu nosaukumu.
- Pārbaudi, ka vārdnīcas izmērs vairs nemainās.
Gatavs, kad: neesoša atslēga vairs neaptur programmu, bet tava metode korekti atgriež 0.
3. uzdevums -
Salīdzini Dictionary ar Godot Dictionary
Beigās tu zināsi, kuru struktūru lietot saziņai ar Godot.
- Izveido
Godot.Collections.Dictionary saveData = new();. - Pievieno tam
saveData["player_name"] = "Anna";unsaveData["level"] = 5;. - Izdrukā abas vērtības.
- Pieraksti, vai
Godot.Collections.Dictionarypieļauj dažādu tipu vērtības vienā struktūrā. - Mēģini līdzīgus datus ielikt
Dictionary<string, int>un izlasi kļūdu. - Pieraksti, kura struktūra derēs saglabāšanai failā.
- Izvēlies savam inventāram pareizo variantu un pamato.
Gatavs, kad: Godot.Collections.Dictionary pieņem dažādus tipus vienā struktūrā, bet Dictionary<string, int> prasa vienu vērtības tipu.
Papildu uzdevums - Izmēģini SortedDictionary
Ja pamatdarbs ir gatavs, salīdzini ātru meklēšanu ar sakārtotu izdruku.
- Izveido to pašu inventāru ar
SortedDictionary<string, int>. - Izdrukā to ciklā un salīdzini secību ar
Dictionary<string, int>. - Pieraksti, kura struktūra izdrukā atslēgas sakārtoti.
- Pieraksti, kura struktūra parasti ir piemērotāka vienkāršai ātrai meklēšanai.
Gatavs, kad: SortedDictionary izdrukā atslēgas alfabētiski, bet parastais Dictionary tiek lietots ikdienas ātrai piekļuvei.
Ko sagatavo
Stundas mērķis: Tu proti C# izveidot Dictionary inventāru, droši meklēt tajā priekšmetus un izskaidrot, kad jālieto Godot Dictionary.
GitHub krātuvē jābūt:
- C# fails ar inventāru un
GetAmountmetodi. - Ekrānuzņēmums, kurā redzams, ka pēc neesoša priekšmeta pieprasījuma vārdnīcas izmērs nemainās.
- README.md: kāpēc kvadrātiekavas ar neesošu atslēgu ir bīstamas un kad lieto
Godot.Collections.Dictionary.
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
- KeyNotFoundException: Kvadrātiekavas lasa tikai esošas atslēgas. Lieto
TryGetValuevaiContainsKey. - Sajauktas vārdnīcas:
Dictionary<string, int>ir tipa-droša C# struktūra, betGodot.Collections.Dictionaryglabā Variant datus. - Negaidīta secība: parasts
Dictionarynav paredzēts sakārtotai izdrukai. Ja vajag sakārtotas atslēgas, lietoSortedDictionary.
Godot ekrānuzņēmumi
Koda piemērs (paplašināts)
using Godot;
using System.Collections.Generic;
public class PlayerInventory
{
private readonly Dictionary<string, int> inventory = new();
public void AddItem(string name, int amount = 1)
{
inventory.TryGetValue(name, out int current);
inventory[name] = current + amount;
GD.Print("+", amount, " ", name);
}
public bool UseItem(string name)
{
if (!inventory.TryGetValue(name, out int count) || count <= 0)
{
GD.Print("Nav ", name);
return false;
}
inventory[name] = count - 1;
return true;
}
public void PrintInventory()
{
foreach ((string name, int count) in inventory)
{
GD.Print(name, ": ", count);
}
}
}