Jak rozwiązać zagadnienie z umiejętnościami w grze?

0

Witam
Przepraszam za troche dziwny temat ale nie wiem jak mozna inaczej napisac ;)
Pisze sobie prosta gre i natrafiłem na taki problem: chce aby każdy przeciwnik/gracz posiadał umiejetności (atak obrona itp) i dodatkowo chce aby przedmioty ktore ktoś nosi zwiekszały/zmniejszały te umiejetnosci tylko nijak nie wiem jak te informacje zapisać. Dodam że każdy posiada tą samą liste umiejetności.

Na początku myślałem czy by nie zrobić takiej klasy:

 
public class Skill {
	
	public int value;
	
	public Skill(int value){
		this.value=value;
	}
	
	//plus tam wszystkie metody zmieniające wartość
	
}

i każdy posiadał by liste albo mapę (wartość-skill, klucz jego nazwa) tylko w takim rozwiazaniu nie wiem jak w klasie przedmiotu zapisać informacje o tym jaką umiejętność modyfikuje zeby nie doszło do sytuacji w której dodaje bonusy do nieistniejącej umiejętności. Czy macie moze jakiś pomysł jak to rozwiazać? ;)
Pozdrawiam

0

Każdą umiejętność zapisz sobie w osobnym polu klasy; Złapanie przedmiotu zwiększa tę wartość, a jego utrata zmniejsza; Dane przedmiotów możesz zapisac sobie w jakiejś zorganizowanej strukturze; Każdy przedmiot niech posiada liczby określające o ile zwiększy dane umiejętności; Jeśli w ogóle nie zwiększy - liczba 0.

0

a co jesli w przyszłosci bede chciał dodac jakąs umiejetność do gry? wtedy w kazdym pliku przedmiotu (ktorych moze byc sporo) musze dodawać?

0

Jabym zrobil klase Skill zawierajaca pola ktore zawiera kazda umiejetnosc nazwa,punkty_many,obrazenia,tekstura, po czym dziedziczyl z tej klasy np public class FireBall extends Skill.
EDIT:
Musialem na chwile leciec, ale juz jestem xD nie skonczylem mysli jeszcze
Co do przedmiotu mozesz tez ja kategoryzowac

class Przedmioty
class Miecz extends Przedmioty
class Tarcza extends Przedmioty
Miecz(Lista_argumentow_jak_np_obrazenia)
{
super()
listaumiejetnosci.dodaj(uderzenie);
}
Tarcza(lista_argumentow_jak_np_wytzymalosc)
{
super()
listaumiejetnosci.dodaj(obrona)
}

No i jeszcze klasa trzymajaca wszystkie obiekty np.

Tarcza woodenShield(tu_jakies_statystyki_np_wytrzymalosc_dodatkowe_umiejetnosci)
Tarcza ironShield(tak_samo)

EDIT2: w sumie listaumiejetnosci tez moze byc w klasie przedmioty wiec super()

0

a co jesli w przyszłosci bede chciał dodac [...]

To naskrob w jakims pythonie narzedzie ulatwiajace zarzadzanie tymi danymi. Przeciez nie bedziesz tego recznie robic.

0
n0name_l napisał(a):

To naskrob w jakims pythonie narzedzie ulatwiajace zarzadzanie tymi danymi. Przeciez nie bedziesz tego recznie robic.

Troszkę nie rozumiem.

0

Troszkę nie rozumiem.

A bierzesz sie za pisanie gry...
Chodzi mu o program ktoremu podajesz jako parametry nazwy plikow ktore ma otworzyc i dopisac do nich jakas linijke czyli
program woodenShield ironShield ... -d listaumiejetnosci.dodaj(obrona);
I program ci wyszukuje w katalogu woodenShield.class ironShield.class.. i tak dalej pozniej zaleznie od nazwy plikow konstruktory woodenShield() ironShield().... po klamrze otwierajacej dodaje linijke listaumiejetnosci.dodaj(obrona);

Lecz przed tym najlepiej sie jeszcze zastanow jak powinna wygladac twoja gra ja polecam ci moje rozwiazanie ktore wczesniej napisalem co do przedmiotow juz widzialem takie rozwiazanie w kodzie innej gry

0
asdfvcxz napisał(a):
n0name_l napisał(a):

To naskrob w jakims pythonie narzedzie ulatwiajace zarzadzanie tymi danymi. Przeciez nie bedziesz tego recznie robic.

Troszkę nie rozumiem.

Trochę mnie przeraża ta myśl, ale on chyba chce żebyś w pythonie sobie napisał skrypt który pomoże Ci zmodyfikować źródła gry w javie :D

Najprościej oczywiście słownik - nazwa do wartości - to nawet nie musi być klasa tylko zwykły int
Przy próbie odwołania się do nieistniejącego klucza nic nie robisz
Wyliczanie statystyk jedynie przy zdobywaniu / pozbywaniu się przedmiotu
To jest najprostsza metoda której bym się trzymał - musisz tylko pamiętać żeby przedmioty nabywać / pozbywać się przez konkretne metody żeby nie było problemów z integralnością tych statystyk

0

Nie o to chodzi ze nie wiem jak to zrobić tylko nie widze w tym sensu ;) bardziej chodziło mi o rozwiazanie w którym tylko w jednym miejscu definiuje wszystkie mozliwe umiejetnosci (jakieś enum lub cos) i potem dodaje te liste do postaci a w kodzie przedmiotu tylko pisze o tych umiejetnosciach na które wpływa. Według mnie jest to rozwiazanie dajace w przyszłosci szybsze metody modyfikacji.

0
gsdfgsdfg napisał(a):

Najprościej oczywiście słownik - nazwa do wartości - to nawet nie musi być klasa tylko zwykły int
Przy próbie odwołania się do nieistniejącego klucza nic nie robisz

Czyli po prostu tak jak pisałem z tą mapą? ;)

0

Nie koniecznie szybsze. Ze wzgledow na takie problemy radze sie przerzucac programistom na linuxa bo on ma gotowe narzedzia do takich rzeczy. Przy czym oczywiscie zachowac windowsa. Wedlug mnie powinno byc tak, ale rob jak chcesz:

 
class public Przedmioty
{
String nazwa;
Texture tekstura;
Przedmioty(String nazwa,Texture tekstura)
{
this.nazwa = nazwa;
this.tekstura = tekstura; 
}
}

class public Miecz extends public Przedmioty
{
list umiejetnosci;
int obrazenia;
Miecz(String nazwa,Texture tekstura,int obrazenia)
{
super(nazwa,tekstura);
umiejetnosci.dodaj(atak);
umiejetnosci.dodaj(szarza);
this.obrazenia = obrazenia;
}
}

class public Zbiornik 
{
Miecz woodenSword = new Miecz("wooden sword",woodensword.bmp,5);
Miecz ironSword = new Miecz("iron sowrd",ironsword.bmp,10);
}

Przepraszam za bledny dawno nie pisalem w javie poza tym nie jestem programista gier
EDIT:
W argumentach stosuj structury
I jak mowilem wczesniej list umiejetnosci mozna dac do Przedmioty

0

@michu45
Tylko nigdzie w twoim rozwiązaniu nie ma np o ile zwiekszyć dana umiejętnośc ;) (ale to jest kwestia dodania parametru w metodzie) co do reszty to jest to własnie koncept o którym pisałem na początku z listą możliwych umiejętnosci ;)

0

Teraz ja troszke nie rozumiem wiec w czym problem dorobic jeszcze class Umiejetnosci pozniej class Atak extends Umiejetnosci *poprawka

public class Umiejetnosci
{
private int level;
Umiejetnosci()
{
level = 0;
}
public int Zwieksz_Umiejetnosci(int ile)
{
level+= ile;
return level;
}
public int Twoj_Level()
{
return level;
}
}

I odwolujesz sie z listy zeby zwiekszyc

0

oto kod jednej funkcji z bardzo popularnej gry Terraria
http://pastebin.com/ZgR1JXCg

funkcja zwiększa lub zmniejsza statystyki na podstawie posiadanych "buffów"
jest wywoływana z funkcji UpdatePlayer która z kolei jest wywoływana w każdej klatce

jak widać gorzej się tego napisać nie dało, mimo to gra jest grywalna, nie wywala się, działa płynnie, nie ma błędów, ma kilka milionów sprzedanych kopii i jest wielkim sukcesem

morał: jeżeli będziesz się spuszczał nad tak żałosnym fragmentem gry i tracił czas nad zastanawianiem się jak to zrobić lepiej zamiast po prostu to zrobić tak jak umiesz najlepiej to niczego nigdy nie osiągniesz

0

Myslac jak to teraz zrobic najlepiej zaoszczedzi sobie w przyszlosci czas zamiast odpowiadac sobie na pytania "dlaczego to nie dziala ?" "co robi ten ta funkcja?" "do czego sluzy ten string?" "dlaczego nikt nie chce ze mna pisac gier?" "czy gdybym jednak dziedziczyl to zaoszczedzil bym linijek kodu"

1
gsdfgsdfg napisał(a):

morał: jeżeli będziesz się spuszczał nad tak żałosnym fragmentem gry i tracił czas nad zastanawianiem się jak to zrobić lepiej zamiast po prostu to zrobić tak jak umiesz najlepiej to niczego nigdy nie osiągniesz

Wybacz ale nie zgodze się z tym ;) Ważne jest żeby od początku wszystko dobrze projektować, aby w przyszłości łatwiej sie pisało ;)

0

@asdfvcxz - więc najpierw usiądź i zaprojektuj tę grę, a dopiero później zabierz się za jej pisanie;

@gsdfgsdfg - panuj nad słownictwem, bo Twoje posty będą kasowane; Jeżeli nie umiesz zachować choćby pozornej kulktury osobistej, to nie wypowiadaj się publicznie.

0
asdfvcxz napisał(a):

Wybacz ale nie zgodze się z tym ;) Ważne jest żeby od początku wszystko dobrze projektować, aby w przyszłości łatwiej sie pisało ;)

oczywiście nie tak, niestety nie jesteś w stanie teraz wszystkiego przewidzieć a to co przewidzisz się nigdy nie wydarzy
niestety umiejętności projektowania uczy się wraz z doświadczeniem i zmierzaniu się z realnymi problemami a nie zaś rozważaniami typu "a co jeśli będę kiedyś chciał żeby ta czarna ściana była biała" mimo że nie jesteś w stanie tego przewidzieć w tej chwili i w ogóle mało prawdopodobne że tak będzie

trzy zasady którymi trzeba się kierować w kolejności od najważniejszej: YAGNI, KISS i DRY

napisz grę tak jak umiesz - zdobędziesz doświadczenie i nie powtórzysz błędów w projekcie podczas pisania kolejnej
Nie myśl że pierwsza gra jaką napiszesz będzie arcydziełem pod względem jakości kodu
Nie myśl że kod gry będzie ładniejszy jeśli teraz więcej posiedzisz nad projektem - ładny będzie z początku, potem gdy dojdziesz do problemów których teraz nie przewidzisz - wszystko się rozwali i będzie jak zwykle

Kod funkcji wstawiłem dla przestrogi - jestem pewny że jesteś w stanie już teraz napisać to lepiej

0
furious programming napisał(a):

@asdfvcxz - więc najpierw usiądź i zaprojektuj tę grę, a dopiero później zabierz się za jej pisanie.

Tym własnie się zajmuje dlatego o tym pisze ;) na razie mam to wszystko w zeszycie rozpisane ;)

0

Programowanie obiektowe zostalo stworzone zeby myslec obiektowo
Pomysl co bedzie w twojej grze napisz to w zeszycie jako obiekt:
Przedmioty
Dzwiek
Tekstury
Postacie
...
Po czym dziedziczenie
Przedmioty:
Miecz
Tarcza
Zbroja

Dzwiek:
Punktowy
Przestrzenny

Tekstury:
Wczytywanie tekstur
Nakladanie Tekstur
Bufory

Postacie:
Bohater
NPC:
Przyjazni tutaj tylko ludzie np mozesz tez Dodac Zwierzeta, czyli bedzie tak samo jak w Wrogowie co nie jest poprawne wiec nalezaloby to zmienic sam pomysl nie zapominaj o interfejsach ;d
Wrogowie: to z kolei znowu sie dzieli na podklasy
Zwierzeta
Ludzie

Pozniej jakie zmienne funkcje maja poszczegolne zaczynajac od klas glownych wszystko co bedzie miala kazda podklasa
np. Postacie string nazwa, int stopien_zagrozenia, Tekstura tekstura...
Pozniej np jak dojdziesz do podklasy Zwierzeta moze pojawic sie zmienna bool czy_potrafi_latac?

Tworz interfejs, bez implementacji

EDIT:
Od razu widac blad tutaj jak sie rozpisze:
Tekstury:
Wczytywanie tekstur
Nakladanie Tekstur
Bufory

0

mniej wiecej tak mam ;) tylko w innej formie zapisane. Połowy z tego nie bede się musial przejmować bo robie to jako gre konsolową ;)

0
asdfvcxz napisał(a)

Tym własnie się zajmuje dlatego o tym pisze ;) na razie mam to wszystko w zeszycie rozpisane ;)

Cieszę się, ale w takim razie skąd pomysł o nowych umiejętnościach? Zastanów się już teraz i zaimplementuj te umiejętności, które chcesz zaimplementować; Jeśli nic nowego nie zamierzasz w najbliższym czasie dodawać do gry, to raczej się tym teraz nie martw; W każdym razie kod i tak napisz dobrze, tak aby ewentualne małe czy większe modyfikacje dotyczące tych umiejętności nie musiały trwać pół roku.

1 użytkowników online, w tym zalogowanych: 0, gości: 1