[php] random kaarten delen

Pagina: 1
Acties:
  • 412 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • EL_Loco
  • Registratie: Oktober 2001
  • Laatst online: 08-11-2023

EL_Loco

alias Haco

Topicstarter
Ik ben bezig om met php een kaartspel te maken voor 4 personen. Nu deel ik (als test) handmatig de kaarten. (De rest werkt prima.) Alleen heb ik problemen met het (automatisch) delen.
Ik heb al gezocht met google, daar vond ik niets handigs, ik heb ook de search gebruikt, daar vond oa een topic wat handig zou zijn als ik delphi gebruik, maar ik gebruik php, en ik kon er geen kaas van maken.
Ik heb op php.net/rand gekeken.
Maar ik heb geen idee hoe ik het aan moet pakken.
Is het kaartspel zitten 32 kaarten. 7,8,9,10,boer,dame,heer,aas in harten, ruiten, schoppen en klaveren. Er zijn 4 personen die ieder 8 kaarten moeten krijgen

Hoe kan ik dit het beste aanpakken :?

rumores non hiatus dremelunt
malleo omnia consentiunt
Lid van het Anti-Jamba front!


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 12-05 12:21
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.

[ 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. :( ]


Acties:
  • 0 Henk 'm!

  • Explore
  • Registratie: Maart 2001
  • Laatst online: 08-04-2011

Explore

Op zoek naar werk

shuffle() bedoel je...?
Die ja. ;-)

[ Voor 25% gewijzigd door Explore op 05-05-2003 16:04 ]

[ specs ] [ Tweaker gallery ]


Acties:
  • 0 Henk 'm!

  • EL_Loco
  • Registratie: Oktober 2001
  • Laatst online: 08-11-2023

EL_Loco

alias Haco

Topicstarter
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.
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()

rumores non hiatus dremelunt
malleo omnia consentiunt
Lid van het Anti-Jamba front!


Acties:
  • 0 Henk 'm!

  • Varienaja
  • Registratie: Februari 2001
  • Laatst online: 11-05 21:23

Varienaja

Wie dit leest is gek.

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

[ Voor 17% gewijzigd door Varienaja op 05-05-2003 16:09 ]

Siditamentis astuentis pactum.


Acties:
  • 0 Henk 'm!

  • EL_Loco
  • Registratie: Oktober 2001
  • Laatst online: 08-11-2023

EL_Loco

alias Haco

Topicstarter
Varienaja 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
zo dacht ik in het bigin ook, maar dat behoorlijk ingewikkeld. Ik het gekeken naar shuffle en array_slice, en daarmee kan het heel makkelijk :)
soultaker, you're my man _/-\o_

-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!


Acties:
  • 0 Henk 'm!

  • cenix
  • Registratie: September 2001
  • Laatst online: 12-05 11:16
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...

Acties:
  • 0 Henk 'm!

Anoniem: 42544

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

[ Voor 2% gewijzigd door Anoniem: 42544 op 05-05-2003 16:26 . Reden: Geen smilies grr ]


Acties:
  • 0 Henk 'm!

  • EL_Loco
  • Registratie: Oktober 2001
  • Laatst online: 08-11-2023

EL_Loco

alias Haco

Topicstarter
Anoniem: 42544 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
8)7 8)7 dit moest ik echt 2 keer doorlezen, voor ik begreep wat je bedoelde. In princiepe is dit ook een handige oplossing. Maar ik ben nu bezig met shuffle (dat werkt niet echt maargoed :?) en ik probeer het ook ng volgens jouw manier. (leer ik weer extra van :) )

rumores non hiatus dremelunt
malleo omnia consentiunt
Lid van het Anti-Jamba front!


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 00:26

crisp

Devver

Pixelated

welliswaar javascript, maar hier worden nog wel een aantal leuke shuffle-methoden uitgelegd: Uniek random getal

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • EL_Loco
  • Registratie: Oktober 2001
  • Laatst online: 08-11-2023

EL_Loco

alias Haco

Topicstarter
geniaal, het werkt. :) Ik gebruik nu alleen niet array_slice, maar het splitsen doe ik zo:
PHP:
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!


Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 19:09
Wil je de kaarten in een database gaan zetten? Dat is toch helemaal niet nodig, die blijven toch altijd gelijk.

Acties:
  • 0 Henk 'm!

Anoniem: 50813

Ik had een iets ingewikkelder probleem, maar zal uitleggen hoe ik het heb opgelost.

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.

Acties:
  • 0 Henk 'm!

  • EL_Loco
  • Registratie: Oktober 2001
  • Laatst online: 08-11-2023

EL_Loco

alias Haco

Topicstarter
djluc 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.
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 Id

rumores non hiatus dremelunt
malleo omnia consentiunt
Lid van het Anti-Jamba front!


Acties:
  • 0 Henk 'm!

  • kmf
  • Registratie: November 2000
  • Niet online

kmf

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.

One thing's certain: the iPad seriously increases toilet time.. tibber uitnodigingscode: bqufpqmp


Acties:
  • 0 Henk 'm!

  • xander88
  • Registratie: September 2003
  • Laatst online: 28-02-2007
cenix 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...
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 is
$j=0;
for($i=0; $i<count($kaarten_array)-$j; $i++) $j++

Heb zelf ooit iets soortgelijks gemaakt in c.

Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Volgens mij geeft ie dat wel aan?
[rml]EL_Loco in "[ php] random kaarten delen"[/rml]

De code die je daarbij moet bedenken is heel simpel:
PHP:
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 ]


Acties:
  • 0 Henk 'm!

Anoniem: 13700

Het freecell shuffle algoritme is vrij efficiënt; je schudt en deelt de kaarten als het ware in een bewerking.

Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 12-05 12:21
Waarom moeilijk doen als het makkelijk kan? PHP biedt een eigen shuffle-functie en die is voor de meeste toepassingen efficient genoeg; pas als je arrays met, zeg, meer dan 10.000 elementen wil schudden kun je overwegen zelf moeite te gaan doen (maar dan nog betwijfel ik of je in PHP code een veel efficienter algoritme kunt implementeren).

offtopic:
De oplossing van JeroenDega is trouwens niet correct!

[ Voor 18% gewijzigd door Soultaker op 13-10-2004 13:38 ]


Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 23-04 16:41

drm

f0pc0dert

athlonkmf:
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.
Misschien handiger om even een nieuw topic te openen, de verwarring treedt al op ;) Je vraagt namelijk toch iets anders, want als ik je goed begrijp ben je benieuwd hoe je een client/server (n:1) model oplost met php ipv hoe je kaarten schudt, toch?

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

Anoniem: 113889

Je kan een spelstapel bouwen uit mogelijke kaarten of stenen. De spelstapel is de associatie tussen "kaart" en spel. Per kaart in de spelstapel leg je vast wie de eigenaar is en toestanden als bv "afgelegd" en sequencing. Gedurende het spel hoef je alleen de eigenschappen van de spelstapel te wijzigen.
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:
code:
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.
Pagina: 1

Let op:
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!