Shuffle Cards Function
| From: | Robert Schultz | Date: | Sun, 19 Aug 2001 04:37:18 +0000 |
| Subject: | Shuffle Cards Function | ||
| Groups: | php.general | ||
| Request: | Send a blank email to php-general+get-63349@lists.php.net to get a copy of this message | ||
I've written a ShuffleCards function that will actually shuffle a deck of
cards just like would happen in real life (divide the deck in half and stick
them into each other with 1-3 cards between each other card)
function ShuffleCards(&$cardsArray, $times)
{
// Randomizes where to split within center (-3 to +3 from dead center)
(MINIMUM 10 CARDS IN DECK)
// Splits into two array. Randomizes how many cards from left and how
many cards from right (between 1 and 3)
// Alternates sides. Continues until both arrays are empty.
$arraySize = count($cardsArray);
if($arraySize<10)
return;
$deadCenter = $arraySize/2;
for($i=0;$i<$times;$i++)
{
reset($cardsArray);
$cutVariant = rand(-3, 3);
$cutLocation = $deadCenter+$cutVariant;
$firstArray = array();
$secondArray = array();
for($z=0;$z<$arraySize;$z++)
{
if($z<$cutLocation)
array_push($firstArray, $cardsArray[$z]);
else
array_push($secondArray, $cardsArray[$z]);
}
$bottomFirst = rand(0, 1);
$cardsArray = array();
while(count($firstArray) && count($secondArray))
{
$leftNewCards = array();
$rightNewCards = array();
$leftVariant = rand(1, 3);
if($leftVariant>count($firstArray))
$leftVariant = count($firstArray);
$rightVariant = rand(1, 3);
if($rightVariant>count($secondArray))
$rightVariant = count($secondArray);
for($x=0;$x<$leftVariant;$x++)
{
array_push($leftNewCards, array_shift($firstArray));
}
for($y=0;$y<$rightVariant;$y++)
{
array_push($rightNewCards, array_shift($secondArray));
}
if($bottomFirst==0)
{
$newCardsArray = array_merge($leftNewCards, $rightNewCards);
$bottomFirst = 1;
}
else
{
$newCardsArray = array_merge($rightNewCards, $leftNewCards);
$bottomFirst = 0;
}
reset($newCardsArray);
while(count($newCardsArray))
{
array_push($cardsArray, array_shift($newCardsArray));
}
}
if(count($firstArray))
{
while(count($firstArray))
array_push($cardsArray, array_shift($firstArray));
}
if(count($secondArray))
{
while(count($secondArray))
array_push($cardsArray, array_shift($secondArray));
}
}
}
Robert Schultz - bert@ncinter.net