Ik ben al enige tijd bezig met het ontwerpen en uitwerken van een mmorpg. Ik heb daarvoor kleurengenetica nodig, dit doe ik samen met een bioloog. We zitten met 1 probleem, alle mogelijke combinaties moeten in de database worden geplaatst. Wanneer je dit met de hand moet doen, dan zou je meer dan 10 miljoen combi's krijgen... Dit vraagt gegarandeerd om fouten in de genetica, denk aan dubbele of juist ontbrekende genetica.
Mijn vraag is hoe ik een code kan schrijven zodat ik dit automatisch kan invoeren in de database. Ik moet ALLE mogelijke combinaties in de database zien te krijgen. Ik heb een tabel: kleurengenetica, met daarin de onderliggende onderdelen:
kleurgenetica_id
naam (deze is alleen nodig bij het handmatig invoeren, die zou dan dus weg kunnen)
extension_1 (enum: 'GE','E')
extension_2 (enum: 'GE','E')
agouti_1 (enum: 'A^a', 'A+', 'A^GA', 'A^t')
agouti_2 (enum: 'A^a', 'A+', 'A^GA', 'A^t')
En zo nog een stuk of 50 bepaalde onderdelen in de kleuren.
Om even te laten zien wat je dan zou krijgen, hij moet alle mogelijke combinaties overnemen.
Dus je begint bij extension_1 met GE, en gaat dan verder, dan krijg je deze combinaties:
GE GE A^a A^a (en dan de rest vd kleuren)
GE E A^a A^a (en dan de rest vd kleuren)
GE E A+ A^a (de rest vd kleuren)
Ik hoop dat met het bovenstaande duidelijk wordt wat de bedoeling is.
Ik heb al meerdere spellen gezien waarbij ze ook kleurengenetica hebben, dus ik weet dat het moet kunnen. Maar ook de berichten die ik daar naartoe heb gestuurd zijn tevergeefs, daar heb ik nooit antwoord op gehad.
Wat is het handigste om te doen? Kan ik een script schrijven waardoor hij dat automatisch kan doen? Of moet ik heel mijn tabel aanpassen en niet met enumvelden oid? Ik had in eerste instantie dit bedacht om dit zo met de hand in te vullen namelijk, maar achteraf bleek dat we meer dan 10miljoen combo's zouden krijgen. Dat is echt een pokkeklus met de hand, dan werk ik liever even wat langer door, zodat het geautomatiseerd kan worden.
Hoop dat iemand me uit de brand kan helpen, heb al meerdere webdevelopers gesproken, maar die weten het ook niet...
Dit zijn wat printscreens. Een vriendin (de bioloog) heeft wat voorbeelden handmatig ingevoerd). Om ze te koppelen aan de afbeeldingen in een andere tabel heeft ze de ID's van elke kleur gebruikt. Vervolgens aan de voorkant wordt het ID opgehaald dat bij dat paard hoort, die zie je nu ook staan bij: Kleur_id op de laatste afbeelding.
Deze wordt later weggelaten voor de spelers, maar voor onszelf staat die daar nu even. De genetica_id's gebruiken we dus om de afbeeldingen te koppelen aan de juiste kleuren. Gezien meerdere genetica voor dezelfde kleur (dus zelfde afbeelding) kan zorgen.
Edit: Toch nog even wat verhelderen dan.
Ik ben een speler en ik heb 1 paard.
Dit paard heeft een paard_id en staat in de tabel paarden, daarin staat:
geb_datum, naam, gebruiker_id, kleurgenetica_id, laatst_gewijzigd enz.
Vervolgens klik ik mijn paard aan, dan kom ik aan bij het paard profiel. Hier zie ik een foto van het paard. Deze komt uit een koppeltabel: koppel_id, ras_id, kleurgenetica_id, foto_id
Vervolgens kan ik klikken op een knop: kleurgenetica. Daar zie je dan wat ik in de printscreen heb laten zien. Het genetica_id met daarbij alle bijbehorende allelen.
Dus per paardprofiel haalt hij aan de hand van het genetica_ID de rij op.
Erwin, de tabel is het essentiƫle voor in het spel. Het gaat erom dat je paarden kunt fokken op bepaalde kleuren. Aan alle genetica worden afbeeldingen gekoppeld. Dus als je een paard fokt, dan komt daar een veulen uit met een bepaalde genetica code. Als je dan door hebt welke genetica je paarden hebben, kun je weer zorgen dat je een unieke kleur fokt. Dit is alleen mogelijk als ik die tabel met al die kleuren heb. Ik heb nooit meer dan 1 kleur tegelijk nodig. Elk paard heeft altijd maar 1 kleur, dus aan elk paard is dan 1 kleur_id gekoppeld.
De eerste 100 paarden maak ik zelf aan, zodat ik weet welke belangrijke kleuren erin komen. Daarna moet je fokken om andere kleuren te krijgen. Daarvoor moet die tabel dus al klaar zijn, want anders kan ik vantevoren nooit de juiste afbeeldingen aan de kleuren gekoppeld hebben. Dan heb je een paard zonder foto zeg maar. Dan speel je een spel zonder character(s).. Dat mag dus niet gebeuren :)
EDIT: Ik zag je reactie over for loopjes, zoiets dacht ik eerst ook, weet alleen de uitvoering daarvoor nog niet helemaal :)
Als ik dit zo lees dan ben je echt gek als je 10 miljoen records in een database gaat pompen.... voor niets.
Bij elk paard hoort een record met de genetica erbij, dat begrijp ik. Alleen die kan je ook aanmaken op het moment dat je een paard aanmaakt. Tenzij jij verwacht dat je veel meer dan 10 miljoen paarden gaat aanmaken in dat spel, is een record per paard nog altijd sneller en minder opslag dan 10 miljoen records.
Die 10 miljoen records heb je ook totaal niet nodig om te bepalen wat je moet doen, daarvoor heb je alleen de gegevens van je paard(en) nodig (die heb je) en de mogelijke waardes van de genetica (die heb je ook).
Ik zou als ik jou was echt even diep gaan nadenken en de gewenste functionaliteit scheiden van de implementatie. Zoals je het nu doet is het het paard achter de wagen spannen.... om maar even bij het onderwerp te blijven.
Nee, dat is het hem nou juist, dat heb ik al eerder geprobeerd uit te leggen ;)
Je hebt een zwarte fries bijvoorbeeld, maar er kunnen voor die ene afbeelding zo'n 200 verschillende genetica combinaties zijn. Daarom heb ik een koppeltabel, zodat aan 1 afbeelding meerdere genetica kan worden gekoppeld. en 1 soort genetica kan voor meerdere uitkomsten zorgen.
Als ik de genetica op het moment van aanmaken van een paard genereer, dan kan ik nooit afbeeldingen tonen. Ik kan niet de afbeeldingen al koppelen zonder dat ik de genetica heb. Tevens kan ik niet aan een speler vertellen dat EE A^aA^a enz. voor zwart staat en ee A^a A^a voor een voskleur.
Het gaat er ook om dat de speler wat over kleurengenetica kan leren, daar draait het nu eenmaal om in het spel. Ik weet dat het zwaar voor de DB gaat worden, maar dat wist ik van tevoren al... Dus aub daar geen discussie over.
... Controleren of een bepaalde combinatie bestaat zal toch op de database moeten want steeds berekeken of iets bestaat kan ook behoorlijke loops veroorzaken. ...
Wel, om te beginnen, die functie zal geen loops nodig hebben.
Het zal neerkomen op wat nadenken over modulus ( % ) en machten van 'het aantal opties' ... en zo.
Wat nuttig kan zijn in de database, zijn de paarden die bestaan. Niet alle theoretische mogelijkeden.
Met dan een extra veld: een getal tussen 0 en 50 miljoen (ongeveer), die je aan de functie moet geven om tot de berekening te komen.
delete, dubbele post omdat de pagina 20 minuten nodig had om te laden....
[size=xsmall]Toevoeging op 12/02/2013 17:08:11:[/size]
Deloryan Hommers op 12/02/2013 16:43:18
Ik weet dat het zwaar voor de DB gaat worden, maar dat wist ik van tevoren al... Dus aub daar geen discussie over.
Dan niet joh. Ik probeer je te helpen, omdat je zometeen een database gaat krijgen die niet vooruit te branden is en dat helemaal niet nodig is. Je denkt in implementatie, niet in functionaliteit. Maar als je zelf de verkeerde kant op wilt hollen, ga lekker je gang.
Ik heb je generator.
Ik heb het eerst gegoten in iets dat je rustig kan testen; stand alone. Met niet te veel gegevens.
Maar in principe moet het ook werken voor meer gegevens.
Super bedankt! Ik ga hier binnenkort mee aan de slag. Op de planning stond afgelopen week al, maar helaas heerst de griep nogal... Carnaval gevierd en vervolgens ziek geworden, ben sinds vandaag weer wat aan de betere hand. Hoop dat het gauw lukt, ik laat het weten!