Milyen megoldás lehetne erre?
Egy kombinálós játékot készítek C#-ban. Minden elem egy IELem interfésztől örökli a tulajdonságait, minden elem külön osztályban van, és azon gondolkozom, hogy a kombinációkat hogyan lehetne eltárolni.
Gondoltam arra, hogy minden elemnek lenne egy dictionaryje, amiben benne lenne hogy mivel kombinálva mit adna eredményül, de ez elég hard-codednek tűnik, mivel akkor a másik elemnek is meg kéne lennie ugyanezeknek.
Arra is gondoltam, hogy ugyanez, kicsit másképp, egy statikus metódus, amely szintén egy dictionary-t ad vissza, bemenetként egy IElem-et kap meg, és belül ifekkel megnézem hogy mondjuk if(bemenet is Water), akkor visszaadok egy olyan dictionary-t, amely tartalmazza az összes kombinációját a víznek.
Egyéb, hatékonyabb ötlet? 200 objektumon nem lehet túl hatékony végigiterálni minden kombinálásnál.
A lényege az, hogy különböző elemek vannak, lásd föld, víz, levegő és tűz alapból, ezekből kell előre meghatározott elemeket előállítani úgy, hogy megfelelően elemeket kell kombinálni. Az elemeknek van egy Unlocked tulajdonsága, amely csak a 4 alap elem esetében true kezdetkor, más esetben false. Az összes elem egy osztály, amely örököl az IElem osztálytól, amely tartalmaz többekközt egy stringet az elem nevének azonosításáért, egy BitmapImage-t amely az ikonja lesz stb...
Ha kombinációkkal előáll egy eddig előállítatlan elem, akkor annak Unlocked tulajdonsága true lesz. Kilépéskor ez a lista amely az összes elemet tartalmazza, json-ban lesz elmentve, indításkor pedig a programba kódolt összes elemet tartalmazó lista lesz összefésülve a json-ban tárolt listával, így a már unlocked elemek is megjelennek.
Amiről te beszélsz az gyakorlatilag egy irányított kör nélküli gráf, ahol az elemek a csúcsok, az élek pedig azt mutatják meg hogy az elem milyen más elemeknek a komponense. Ezt a gráfot kéne tárolni.
A legszembetűnőbb megoldás ha minden elemnél tárolod egy halmazban a komponenseit. Ha elő akarod segíteni a keresést a gráfban mert nagy méretű elemszámod van akkor minden elemhez tárold hogy milyen elemeknek a komponense, így ha kíváncsi van milyen elemeket lehet létrehozni pár kiválasztott elemből akkor csupán egy metszetszámítással megoldhatod.
Ami nem világos hogy miért kerül minden elem egy külön osztályba? A leírásod alapján 1 osztály kell és annak objektumai a különböző elemek. Konstruktorban átadod a komponenseket, az elem nevét, a bitmapet meg amit akarsz és az összes objektumot tárolod egy listában. Ha keresel akkor csak végigmész a listán és csak halmazegyenlőséget nézel. A konstruktorban szintén meghívhatod más elemek függvényeit önmagával hogy regisztrálják azt ha kétirányú keresés kell.
Ha kellenek még ötletek a tárolásra akkor próbálj az interneten kör nélküli irányított gráfok tárolására keresni struktúrákat, vagy egy csomó. Gráfos könyvtárak is megkönnyíthetik az életed, megoldják helyetted a struktúrát és a keresést.
"200 objektumon nem lehet túl hatékony végigiterálni minden kombinálásnál"
200 objektumon végig iterálás nem számít időigényes műveletnek.
Gráfra nem gondoltam, de átgondolva egyszerűbbnek tűnik, köszönöm az ötletet! Igazából nem is tudom minek szedem mindet külön osztályba..tényleg egyszerűbb hogy egy Element osztály és azt töltöm fel egy listába, konstruktorparaméterekkel megadva a unique vonásait az adott elemnek.
Az, hogy a játékot évekkel ezelőtt megírták, nem hiszem hogy egyet jelentene azzal, hogy önképzésből nem csinálhatnám meg magamnak :)
A hatékonyság szempontja legfőképpen abban jelenne meg, hogy az UI-t megakasztja-e ilyenkor az iterálás folyamatáig. Oké, ezt lehet aszinkronosan is csinálni, akkor nem blokkol, de nem teszteltem, a kód egy része van csak meg, amíg a kombinációkra nem találok megoldást, nem akartam mindet megcsinálni, de a gráfos jó lesz.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!