rumores non hiatus dremelunt
malleo omnia consentiunt
Lid van het Anti-Jamba front!
[ Voor 6% gewijzigd door Soultaker op 05-05-2003 16:01 . Reden: Die functie heet dus 'shuffle' en niet 'array_shuffle'. Stomme inconsistente naamgeving van PHP ook altijd. :( ]
Die ja. ;-)
[ Voor 25% gewijzigd door Explore op 05-05-2003 16:04 ]
[ specs ] [ Tweaker gallery ]
Ik heb inderdaad de kaarten al in een array staan. Ik zat in de richting de denken van rand, maar ik zal kijken naar shuffle() en array_slice()Soultaker schreef op 05 May 2003 @ 15:59:
Hoe zou je het in het echt doen? Ik zou de kaarten eerst schudden en daarna iedere speler een kwart van de stapel geven. Kijk daarom eens naar de functies 'shuffle' en 'array_slice'. Ik neem daarbij aan dat je alle beschikbare kaarten in een array hebt staan; zoniet, dan moet je ze daar nog even in zetten.
rumores non hiatus dremelunt
malleo omnia consentiunt
Lid van het Anti-Jamba front!
Speler twee krijgt een kaart (1..31)
Speler drie krijgt een kaart (1..30)
Speler vier (1..29)
en zo door totdat de kaarten op zijn.
je moet de uitgedeelde kaarten wel uit je array verwijderen natuurlijk
[ Voor 17% gewijzigd door Varienaja op 05-05-2003 16:09 ]
Siditamentis astuentis pactum.
zo dacht ik in het bigin ook, maar dat behoorlijk ingewikkeld. Ik het gekeken naar shuffle en array_slice, en daarmee kan het heel makkelijkVarienaja schreef op 05 mei 2003 @ 16:09:
Ik zou gewoon speler1 een random kaart geven (ergens tussen de 1 en de 32 dus)
Speler twee krijgt een kaart (1..31)
Speler drie krijgt een kaart (1..30)
Speler vier (1..29)
en zo door totdat de kaarten op zijn.
edit:
je moet de uitgedeelde kaarten wel uit je array verwijderen natuurlijk
soultaker, you're my man
-edit- een verschikkelijke typo
[ Voor 8% gewijzigd door EL_Loco op 05-05-2003 16:14 ]
rumores non hiatus dremelunt
malleo omnia consentiunt
Lid van het Anti-Jamba front!
Verwijderd
* Maak 2 verzamelingen. 1 lege van 32 plaatsen (A) en 1 volle genummerd met 32 plaatsen met index 1 tot en met 32 ( B ).
* Pak een random getal tussen 1 en 32.
* Pak het random getal als index en kopieer de waarde hiervan naar de lege verzameling (verz B ). De eerste keer dat je deze procedure uitvoerd is de index gelijk aan de waarde (in verz A).
* Verplaats de waarde die nu op de plaats met index 32 staat naar de plaats met index van het random getal. (De waarde hiervan wordt overschreven maar deze is al gekopieerd naar verzameling B ).
* Nu heb je dus 31 volle plaatsen in verz A en in verz B zit 1 waarde.
* Pak een random waarde tussen 1 en 31.
* Pak het random getal als index en kopieer de waarde hiervan naar de lege verzameling (verz B ). Deze waarde hoeft dus niet meer gelijk te zijn aan het random getal
* Verplaats de waarde die nu op de plaats met index 31 staat naar de plaats met index van het random getal. (De waarde hiervan wordt overschreven maar deze is al gekopieerd naar verzameling B ).
* Nu heb je dus 30 volle plaatsen in verz A en in verz B ziten 2 waardes.
* enz enz
Op het einde heb je dus in verzameling B een gevulde verzameling met 32 Unieke Getallen
[ Voor 2% gewijzigd door Verwijderd op 05-05-2003 16:26 . Reden: Geen smilies grr ]
Verwijderd schreef op 05 mei 2003 @ 16:23:
Kaarten delen is altijd lastig gezien het feit dat je bijvoorbeeld 32x wil trekken maar wel 32 unieke getallen (of kaarten) wilt krijgen. Het volgende algoritme werkt perfect:
* Maak 2 verzamelingen. 1 lege van 32 plaatsen (A) en 1 volle genummerd met 32 plaatsen met index 1 tot en met 32 ( B ).
* Pak een random getal tussen 1 en 32.
* Pak het random getal als index en kopieer de waarde hiervan naar de lege verzameling (verz B ). De eerste keer dat je deze procedure uitvoerd is de index gelijk aan de waarde (in verz A).
* Verplaats de waarde die nu op de plaats met index 32 staat naar de plaats met index van het random getal. (De waarde hiervan wordt overschreven maar deze is al gekopieerd naar verzameling B ).
* Nu heb je dus 31 volle plaatsen in verz A en in verz B zit 1 waarde.
* Pak een random waarde tussen 1 en 31.
* Pak het random getal als index en kopieer de waarde hiervan naar de lege verzameling (verz B ). Deze waarde hoeft dus niet meer gelijk te zijn aan het random getal
* Verplaats de waarde die nu op de plaats met index 31 staat naar de plaats met index van het random getal. (De waarde hiervan wordt overschreven maar deze is al gekopieerd naar verzameling B ).
* Nu heb je dus 30 volle plaatsen in verz A en in verz B ziten 2 waardes.
* enz enz
Op het einde heb je dus in verzameling B een gevulde verzameling met 32 Unieke Getallen
rumores non hiatus dremelunt
malleo omnia consentiunt
Lid van het Anti-Jamba front!
Intentionally left blank
1
2
3
4
5
6
7
8
9
10
11
12
13
| for($b=0; $b<7; $b++ ) { echo $kaart[$b] . "<BR>\n"; } echo "<BR>"; echo "<BR>"; for($c=8; $c<15; $c++ ) { echo $kaart[$c] . "<BR>\n"; } //enz. // het moet nu nog wel in een database, maar das zo gedaan :) |
rumores non hiatus dremelunt
malleo omnia consentiunt
Lid van het Anti-Jamba front!
Verwijderd
Ik heb laatst een begin gemaakt voor mijn mah-jongg spel, en daarbij moeten 52 stenen uit 136 stenen random gedeeld worden aan vier spelers. Dat zijn verschillende 34 stenen die er elk 4 keer in zitten. Daarvoor heb ik een array gebruikt van twee kolommen, met in de eerste de steenomschrijving en in de tweede een teller met hoevaak een steen al gebruikt was. Er wordt een random getal getrokken, die positie uit de array wordt aan de speler gedeeld en de teller wordt één opgehoogd. Wanneer de teller al op 4 staat moet er nog een keer random getrokken worden, aangezien deze steen al vier keer is uitgedeeld.
Geen idee of je er iets aan hebt. Was overigens ook geen PHP hoor.
mja, maar ze moeten nog wel met een user worden verbonden en die users staan in een DB dus is het makkelijk om de kaarten daarbij te zetten met een Iddjluc schreef op 05 May 2003 @ 17:12:
Wil je de kaarten in een database gaan zetten? Dat is toch helemaal niet nodig, die blijven toch altijd gelijk.
rumores non hiatus dremelunt
malleo omnia consentiunt
Lid van het Anti-Jamba front!
Ik ben namelijk van plan om zelf ook een php-spel te maken en zit vooral met het probleem hoe de kaarten van iedereen gerefreshed kan worden. Misschien dat de TS leuke oplossingen hiervoor had.
One thing's certain: the iPad seriously increases toilet time.. tibber uitnodigingscode: bqufpqmp
Ja wel hoor! de laatste kaart (31) vervangt de getrokken kaart, daarna vervangt kaart 30 de gtrokken kaart en maak je een loop die eentje klein iscenix schreef op 05 mei 2003 @ 16:15:
Varienaja: dat gaat niet lukken, de kaart moet eruit zijn, maar in jouw "code" daar staat de kaart nog in, je zou wel kunnen proberen de kaart uit de array te halen en dan kaart (1..30) doen, kaart uit array halen (1..29) doen, etc...
$j=0;
for($i=0; $i<count($kaarten_array)-$j; $i++) $j++
Heb zelf ooit iets soortgelijks gemaakt in c.
[rml]EL_Loco in "[ php] random kaarten delen"[/rml]
De code die je daarbij moet bedenken is heel simpel:
1
2
3
4
5
6
7
8
9
10
| $cards = array(1, 2, 3, 4, 5, 6, 7, 8); shuffle($cards); for($i = 0; $i < 4; $i++) { for($j = 0; $j < 2; $j++) { $card = $cards[$i*$j]; echo "<p>Speler {$i} krijgt kaart {$card}</p>"; } } |
[ Voor 7% gewijzigd door ACM op 13-10-2004 11:21 ]
Verwijderd
De oplossing van JeroenDega is trouwens niet correct!
[ Voor 18% gewijzigd door Soultaker op 13-10-2004 13:38 ]
Misschien handiger om even een nieuw topic te openen, de verwarring treedt al opathlonkmf:
misschien een flinke schop, maar ik wil toch wel weten hoe de TS het uiteindelijk heeft opgelost en of hij zijn kaartspel echt af heb.
Ik ben namelijk van plan om zelf ook een php-spel te maken en zit vooral met het probleem hoe de kaarten van iedereen gerefreshed kan worden. Misschien dat de TS leuke oplossingen hiervoor had.
Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz
Verwijderd
Opbouw van de spelstapel is het afleiden van de spelstapel uit de mogelijke combinaties. Bij Mah-Jong koppel je elke "steen" dan 4x.
Vervolgens kan je nog een eigenaar toewijzen, wat zo makkelijk gaat als met de volgende SQL voor klaverjassen met z'n vieren:
1
2
3
4
5
| update deck set owner=1 where owner is NULL order by rand() limit 8 |
en dan natuurlijk voor alle spelers.
Let er op dat dit een topic van een jaar oud is, daar is die dikgedrukte datum voor om je op te wijzen, bij sommige reacties!