10.1: Tworzenie kolekcji obiektów

Cele lekcji

Po zakończeniu tej lekcji…

  • Będziesz wiedzieć, jak przechowywać grupy obiektów w pojedynczej właściwości lub zmiennej i odczytywać je.

 

Obsługa grup obiektów

W niektórych naszych klasach brakuje właściwości. Podczas opracowywania koncepcji programu wspomniałem, że gracz będzie mógł przechowywać przedmioty w plecaku i wykonywać zadania nagradzane przedmiotami wymaganymi do ich ukończenia, a z potworów będą wypadać łupy.

Aktualnie dysponujemy klasą Quest i Item, ale zadań ani przedmiotów nie możemy przypisać nigdzie w klasach Player ani Monster. Nie utworzyliśmy jeszcze metody przechowywania wielu przedmiotów, a gracz raczej będzie miał w plecaku wiele przedmiotów i będzie miał wiele rozpoczętych zadań.

Ten problem rozwiążemy za pomocą list lub kolekcji.

Jednak zanim utworzymy właściwości list, do przedmiotów i zadań musimy dołączyć dodatkowe informacje.

W przypadku przedmiotów w plecaku będziemy musieli określać ich liczbę. Podobną operację będziemy wykonywać dla klasy Quest, czyli będziemy określać liczbę przedmiotów potrzebnych do ukończenia zadania.

W przypadku zadań potrzebujemy jeszcze miejsca, w którym będziemy zapisywać, czy gracz ukończył zadanie czy nie.

W klasie Monster potrzebujemy listy przedmiotów, które mogą „wypaść” z potwora. To będzie nasza „tabela łupów”, w której będziemy zapisywać procentową szansę na „upuszczenie” łupu przez potwora. Jeśli jakiś przedmiot jest domyślny, to wymagane jeszcze będzie dodatkowe zabezpieczenie, na wypadek gdyby generator liczb losowych nie umożliwił zdobycia danego przedmiotu.

Powyższe zadania można wykonać na wiele sposobów, ale w tej lekcji wykorzystamy metodę opartą na dodatkowych klasach.

Utworzymy więc kilka nowych klas, a następnie dodamy je jako właściwości listy do istniejących klas Player, Monster i Quest.

 

UWAGA: W filmie klasa Quest jest pozbawiona właściwości RewardItem dodanej w poprzedniej lekcji (6:52). Tę właściwość należy zachować w klasie.

 

 

Etap 1: Uruchom aplikację Visual Studio i otwórz swoje rozwiązanie.

 

Etap 2: Utwórz cztery nowe klasy, klikając prawym przyciskiem myszy projekt Engine i wskazując pozycje Add i Class. Tworzonym klasom nadaj następujące nazwy:

 

InventoryItem.cs

 

LootItem.cs

 

PlayerQuest.cs

 

QuestCompletionItem.cs

 

UWAGA: W dwóch klasach używamy nowego typu danych bool (wartość logiczna). Wartość logiczna pozwala przechowywać dwa stany true (prawda) lub false (fałsz). Przykładowo: w klasie PlayerQuest właściwość IsCompleted będzie zawierać wartość false do momentu ukończenia zadania. Wtedy wartością będzie true.

 

Etap 3: Mamy już nowe klasy, więc możemy utworzyć dla nich właściwości w klasach Player, Quest i Monster.

Zmodyfikujmy klasę Player, klikając ja dwukrotnie w projekcie Engine.

Przyjrzyjmy się wierszowi 2 w klasie Player. Ten wiersz jest wymagany, aby korzystać z list, czyli wartości lub właściwości zawierającej kolekcję obiektów w tej samej klasie. Tutaj program będzie wyszukiwał wszystkie elementy potrzebne do korzystania z kolekcji.

Do klasy Player dodaj następujące właściwości:

 

Te dwie nowe właściwości pozwalają przechowywać listy zawierające obiekty InventoryItem i PlayerQuest.

W kodzie konstruktora dodaj następujące wiersze:

 

Te dwa wiersze pozwalają ustawić puste listy jako wartości nowych właściwości. Jeśli nie ustawilibyśmy tych opcji, wartością właściwości byłoby null, czyli nic. Ustawienie pustej listy pozwala nam na późniejsze dodanie elementów, ponieważ do pustej listy można dodawać obiekty, ale wartość nic (null) już nie umożliwia wykonania tej operacji.

 

Player.cs (uzupełniony, ze zmianami)

 

Etap 4: Zmodyfikuj klasę Quest i dodaj nową właściwość:

 

W konstruktorze dodaj ten nowy wiersz, aby przygotować listę QuestCompletionItems do przyjmowania obiektów:

 

Quest.cs (uzupełniony, ze zmianami)

 

Etap 5: Zmodyfikuj klasę Monster, dodając następującą właściwość:

 

A do konstruktora dodaj następujący wiersz, aby nowa właściwość nie miała wartości null:

 

UWAGA 1: W przypadku właściwości ciąg, liczba całkowita i logiczna nie trzeba ustawiać wartości domyślnej, ponieważ te typy danych zawierają wbudowane wartości domyślne. W przypadku list domyślnie określona jest wartość null (nic), więc należy ustawić wartość pustą (nowy obiekt listy niezawierający wartości).

UWAGA 2: W konstruktorze nie utworzyliśmy parametrów przeznaczonych do uzupełnienia wartościami w przypadku nowych właściwości. Mogliśmy to zrobić, ale uzupełnimy je w inny sposób — prostszy dla osób rozpoczynających przygodę z programowaniem.

 

Monster.cs (uzupełniony, ze zmianami)

 

Podsumowanie

Niemal wszystkie programy, które napisałem zawierały listy lub kolekcje. W prawdziwym świecie zazwyczaj obsługujemy kilka elementów (np. wyświetlanie wszystkich wpłat i wypłat na rachunku bankowym).

Niedługo dowiesz się, jak dodawać i opracowywać obiekty na listach.

 

Łącza do tej lekcji

Kod źródłowy w serwisie GitHub (nowe lekcje) (zaktualizowane lekcje)

Kod źródłowy w serwisie Dropbox (nowe lekcje) (zaktualizowane lekcje)

Leave a Reply

Your email address will not be published. Required fields are marked *