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...
Wat me niet helemaal duidelijk is, is of je een tabel wilt hebben met echt alle mogelijke combinaties erin, of dat je op zeker moment gewoon 1 waarde eruit wilt halen die in feite random komt vanuit de complete set?
Wat me niet helemaal duidelijk is, is of je een tabel wilt hebben met echt alle mogelijke combinaties erin, of dat je op zeker moment gewoon 1 waarde eruit wilt halen die in feite random komt vanuit de complete set?
Ik wil een tabel hebben, waar alle mogelijke combinaties in komen te staan. Dus zoals ik de tabel nu heb gemaakt, zo moet hij eigenlijk helemaal opgevult worden met alle mogelijke combinaties.
Ik wil een tabel hebben, waar alle mogelijke combinaties in komen te staan. Dus zoals ik de tabel nu heb gemaakt, zo moet hij eigenlijk helemaal opgevult worden met alle mogelijke combinaties.
Leg eens uit waarom.
Klinkt lullig, begrijp ik, maar je gaat zo een tabel maken met 10 miljoen records, die nooit meer zullen veranderen en die je op elk moment opnieuw zou kunnen aanmaken. Als je dus op veel moment veel gegevens eruit nodig heb kan je gelijk hebben dat je die tabel nodig hebt. Zo niet, dan denk ik dat je voor jezelf een probleem creeert dat je niet nodig hebt. Bedenk ook dat een tabel met 10 miljoen records niet de snelste in zijn soort zal zijn....
Maar goed, antwoord op je vraag, simpele for loopjes doen de truck waarschijnlijk wel. Als je het over RGB kleuren hebt:
<?php
for($red=0; $red<256; $red++){
for ($green=0; $green<256; $green++){
for ($blue=0; $blue<256; $blue++){
mysql_query('INSERT INTO kleuren(red, green, blue)
VALUES("'.$red.'","'.$green.'","'.$blue.'")');
}
}
}
?>
En met prepared statements etc kan het natuurlijk nog veel sneller, maar je begrijpt nu het idee wel neem ik aan.
Het gaat in totaal om 46 items per rij. Je hebt steeds een gen en dat gen heeft ALTIJD 2 allelen.
Dus ik heb het zo benoemd: extension_1, extension_2, agouti_1, agouti_2, cream_1, cream_2 en zo gaat het de hele tabel nog door.
Elk gen heeft zijn eigen onderdelen. Extension bestaat steeds uit GE of E
Officieel is het E en e, maar dit zie je in de tabel niet, dus heb ik er een G bij staan. Grote E en e is kleine e. Dus conclusie: GE en e, bij agouti is het inderdaad altijd A^a', 'A+', 'A^GA', 'A^t'. Maar het is niet EN, EN. Je ziet er steeds maar 1 van, waardoor je zoveel combinaties krijgt. Dit is de hele rij met genen:
extension_1, extension_2, agouti_1, agouti_2, creampearl_1, creampearl_2, dun_1, dun_2, champagne_1, champagne_2, silver_1, silver_2, grey_1, grey_2, flaxen_1, flaxen_2, pangare_1, pangare_2, sooty_1, sooty_2, kit_1, kit_2, splashedwhite1_1, splashedwhite1_2, splashedwhite2_1, splashedwhite2_2, splashedwhite3_1, splashedwhite3_2, rabicano_1, rabicano_2, frame_1, frame_2, metallic_1, metallic_2, appaloosa_1, appaloosa_2, patn1_1, patn1_2, patn2_1, patn2_2, sabino_1, sabino_2, hoofd_1, hoofd_2
En dit is een gedeelte uit een rij:
Extension_1 = GE
Extension_2 = GE
Agouti_1 = A^a
Agouti_2 = A^a
Creampearl_1 = C
Creampearl_2 = C
Alle genen hebben dus hun eigen allelen. Extension_1 en 2 hebben GE of E, maar agouti heeft A^a, A+, A^GA of A^t.
Zo geld dit voor die hele tabel, zal zo even een printscreen maken, misschien dat het dan iets duidelijker is.
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 :)
Even terugkomen op de vraag of het nodig is om alles in een db op te slaan.
Bedenk even dit: als we je nu een functie geven, die al die mogelijkheden oplijst (om dan in een SQL string te steken met INSERT...)
Krijgen we als resultaat een hoop records, telkens met een ID met auto increment (1; 2; 3; ...)
Aan de hand van die ID kunnen we het record terugvinden.
Wel, het lijkt me dat (ongeveer) die zelfde functie kan gebruikt worden om dit on the fly te genereren.
bereken_combinatie(1) // geeft 'GE' 'GE' 'A^a' 'A^a' ...
bereken_combinatie(15) // geeft 'GE' 'E' 'At' 'A^a' ... (zal wel niet overeen komen met 15...)
Dus, die functie zal telkens een identieke uitkomst geven.
Geen enkele combinatie wordt overgeslagen, als je echt wil.
bv.
<?php
for($i=0; $item = bereken_combinatie($i); $i++) { // zal een lijst geven met alle mogelijkheden
// doe hier iets met $item
}
?>
En berekenen hoeveel combinaties er zijn, is ook kinderspel.
Wat denk je?
Erwin H op 12/02/2013 15:43:32
Dat worden dus 46 geneste for loopjes.... duurt even, maar kan makkelijk.
Trouwens, het is nog niet aan de orde; maar ik zit direct al te denken om de zware berekening met javascript te doen. De rekenkracht van de client pc gebruiken.
@Kris ultieme oplossing natuurlijk maar TS zal dan aan moeten geven of hij kan werken met ID in plaats van de hele rij uit de database. De 46 geneste for-loops vullen inderdaad een behoorlijke database. Eerst zal duidelijk moeten zijn hoe TS een en ander gebruikt, gaat hij zoeken in de tabel naar de juiste combinatie of is het slechts een referentie? Controleren of een bepaalde combinatie bestaat zal toch op de database moeten want steeds berekeken of iets bestaat kan ook behoorlijke loops veroorzaken. TS moet dus nog wat meer toelichten over de functie van de tabel in relatie met zijn datamodel.