Dostęp do obiektu utworzonego w innej metodzie | JAVA

Cześć! Dopiero się uczę, więc może dla kogoś to będzie proste jak bułka z masłem, ale myślę i myślę i nic mi nie przychodzi do głowy, poza tworzeniem zmiennych bez obiektu. Mianowicie uparłem się na obiekt i chciałbym aby został.

W tym miejscu chciałbym przeprosić was wszystkich w jaki sposób tworzę tę grę :stuck_out_tongue: Wszelkie zasady programowania są tutaj łamane :smiley: Jako, że się uczę to ćwiczę i tworzę w sposób jaki umiem do tej pory :x

Mam tekstową grę w javie. Mam plik ze zmiennymi globalnymi, gdzie przechowuję tablicę boolean. Ta tablica nazywa się existing. Teraz, zakładamy, że gracz wejdzie do parku, losuje mu miejsce, w którym się znajdzie. Jeśli wylosuje mu psa, to wtedy tworzy się obiekt pies(z nim jest mało problemu, bo za każdym razem jak wejdziemy na pole z psem to można wygenerować nowego psa, z uwagi na to, że on nie musi nic pamiętać). Problem pojawia się gdy losujemy jakąś osobę, chciałbym aby prowadziła z nami dialog, tylko, ze za każdym razem będzie to inny dialog, a do tego potrzebne jest to by obiekt osoba przechowywał wartości z odbytymi rozmowami (to jak sobie je zrobię już moja sprawa). Potrzebny mi tylko jakiś pomysł co zrobić, żeby za każdym wejściem na pole sprawdzał czy dany obiekt istnieje, a jeśli tak, to żeby pobierał gotową postać, która ma już jakieś dane, imię, wiek, pamięć mózgową, a nie, że za każdym wejściem będzie tworzona nowa postać, która zapomina co do niej mówiliśmy.

Czyli sytuacja ma wyglądać tak: Gracz wchodzi do parku -> Losuje osobę -> Sprawdzane jest czy dana postać istnieje -> Jeśli nie, to tworzy, jeśli tak to ja pobiera -> Postać wygenerowana lub pobrana zostaje użyta w rozmowie pomiędzy osobami.

Obecnie, gdy chce mu powiedzieć, że gdy postać istnieje to ma wziąć ją gotową to nie wiem co wpisać w funkcji losującej miejsce, wpisuję nazwę metody w której ma sie odbyć rozmowa, ale jako argument musi przyjąć obiekt, który utworzyliśmy kiedyś, przy pierwszym wejściu do parku. Bez sensu by było gdybym do każdej metody w grze przecież wsadzał ten obiekt, żeby ciągle go pamiętał, no tak to robić nie będę chyba, za dużo roboty nawet i bez sensownego chodzenia tego bezdomnego za nami nawet do lodówki :stuck_out_tongue: Wklejam link do GitHuba!

Czy możesz spotkać na tym samym polu różne obiekty (psy, osoby itd), czy po wylosowaniu za pierwszym razem (wylosowano osobę) będzie to ciągle ta sama osoba i na tym polu psa już nie spotkasz?

Hmm, to jest rozwiązane tak, że park jest klasą, a zdarzenia to funkcje w tej klasie. Losując jakieś zdarzenie przenosi nas do losowej metody związanej z jakimś losowym zdarzeniem. Więc ciężko mi odpowiedzieć na twoje pytanie. Jeśli chodzi Ci czy w danej klasie mogę spotkać i psa i osobę to tak, ale jeśli pytasz czy w jednej metodzie mogę spotkać psa i kota to odpowiem nie. Każda metoda odpowiada za jeden typ stworzenia, mało tego, są nawet podzielone, że funkcja losująca losuje nam metode z jakimś zwierzęciem lub postacią, a z tej metody, którą wylosowaliśmy przechodzimy w zależności co dalej zrobimy znowu do losowania miejsca, albo do dalszej metody odpowiedzialnej za dalszą rozmowę, działania z polem które wylosowaliśmy na początku.

Czyli najpierw losujesz metodę wykorzystaną do stworzenia postaci, a potem wewnątrz tej metody losujesz konkretną osobę?

Czyli na przykładzie:

  1. wchodzisz do parku
  2. wylosowałeś że pojawi się człowiek. Następnie wylosowałeś, że człowiek będzie nazywał się Adam
  3. pogadałeś, wyszedłeś z parku
  4. wróciłeś do parku, wylosowałeś, że pojawi się zwierzę. Następnie wylosowałeś, że zwierzęciem będzie pies
  5. wyszedłeś z parku
  6. wróciłeś do parku, wylosowałeś, że pojawi się człowiek. Ponieważ losowałeś już w tym parku człowieka, pojawi się wcześniej stworzony Adam

Czy źle to zrozumiałem?

Dokładnie, jest tak jak mówisz. Tylko punkt 6 - Ja właśnie bym chciał żeby to był ten Adam, a nie na nowo stworzony człowiek :stuck_out_tongue: Żeby jakoś zapamiętać, że go stworzyłem i żeby cały czas gdzieś on w tej pamięci był, a nie, że znowu wejdę do parku, a Adam dostał sklerozy i zapomniał co do niego mówiłem :stuck_out_tongue:

Czy tego Adama możesz spotkać w innym parku?

Nie jest tylko jeden park na mapie, z wejściami z różnych stron, ale zawsze to ten sam park. Ta sama klasa, te same metody.

W takim razie po wylosowaniu (że spotkasz człowieka) sprawdź wewnątrz obiektu Park czy istnieje już tam Człowiek (możesz spokojnie trzymać go jako pole tej klasy). Jeśli nie istnieje (jest nullem) to go wygeneruj i zapisz, a następnie kontynuujesz interakcję (bo niezależnie czy Człowiek istniał czy nie, teraz już na pewno istnieje).

Tylko w jaki sposób? W linijce 48 jest kod który jest odpowiedzialny za ten przypadek człowieka. Z tym, że jeśli istnieje obiekt to jak go przekazać? Nie wpisze jego nazwy bo nie występuje on w metodzie random_place(). Tworzony jest w oddzielnej metodzie: generate_bezdomny_1(). A nie będę przecież z tym obiektem latał po całej mapie, tworząc go na początku gry. To by było chyba bez sensu. W tym momencie, mówię, że jeśli zmienna jest true, to obiekt istnieje więc następuje przejście od razu do pola, bez tworzenia postaci, ale jak mu tę postać dać, skoro została stworzona w innej metodzie? Z kolei jakbym utworzył postać w metodzie random_place, to i tak kompilator mi powie, ze w przypadku gdy zmienna, która mówi, czy obiekt istnieje jest true, czyli w przypadku gdy kiedyś już go tworzyliśmy to kompilator mi powie, hej, hej, hej, ale… jeśli chcesz przejść do tej metody, to ona wymaga obiektu postaci, to mi go daj! Ale nie wpisze w niego postaci jeśli nie zawrę jego tworzenia w tym samym statemencie, albo jego przywołania(ale jak?)

Nie bardzo możesz teraz to zrobić z jednego powodu:

Dlatego nie jesteś w stanie prawidłowo wykorzystać OOP. Jakbyś nie leciał na staticach to byłoby teraz prosto :slight_smile: a tak jedyne co pozostaje to jakaś globalna tablica gdzie będziesz przechowywał stworzone obiekty.

1 polubienie

No przyznam, że miałem wczoraj jakiś pomysł na to ale krzyczało, że nie można mieszać metod statycznych z takimi które coś zwracają i się złapałem za głowę ile tu by było tego zmieniania :confused: No cóż, w następnym projekcie będę mądrzejszy o tę wiedzę. Dziękuję!

Niestety tu trzeba zacząć od zera i obiektowo - ale nie przejmuj się - pomysł już masz. Zrób wersję 2.0 w której
a) stworzysz sobie klasę generatora zdarzeń
b) stworzysz sobie klasę generatora postaci (dodatkowo z dziedziczeniem, to co chcesz zrobić to jest idealny, książkowy wręcz przykład wykorzystania polimorfizmu
c) analogicznie klasy do broni (to już szczątkowo masz)
d) stworzysz sobie klasę Miejsce w której będziesz przechowywał postaci (przez listę obiektów klasy bazowowej dla wszystkich istot), szczególnym przypadkiem Miejsca będzie klasa Park

I dane dotyczące konkretnych miejsc będziesz trzymał wewnątrz ich obiektów, to wszystko da się zrobić bez napisania choćby jednego statica!

1 polubienie

Najpierw dokończę to co zacząłem, tym sposobem “mniej ładnym”, a poźniej wezmę się za sposób o którym mówisz. Nie lubię zostawiania niedokończonych rzeczy :stuck_out_tongue: Poza tym, użytkownika, który odpali grę nie będzie interesowało co jest pod maską, także w pierwszej grze mogę sobie pozwolić na śmietnik skoro nie jest jakaś wymagająca :stuck_out_tongue: Po tym spróbuję przenieść Monopoly na wersję komputerową, wtedy zastosuję się do twoich wskazówek!