1

I don't know how to unset my cards after drawing, my array is always full event avec i use my function draw() It works when i use a var_dump just after my draw function but when i use it in the while the array is full. I don't know if the array is re-filled or not and why it returns to 30 elements even after the unset

Thank you for your help!

 <?php class Card{ public $name; public $life; public $damage; function __construct($name, $life, $damage) { $this->name = $name; $this->life = $life; $this->damage = $damage; } } class Deck{ public $cards; public function draw($deck){ $sortedDeck = array_values($deck); $rand = mt_rand(0,count( $sortedDeck ) -1 ); $drawnCard = $sortedDeck[$rand]; unset($deck[$rand]); return $drawnCard; } public function shuffle_array($array) { $shuffled_array = []; $arr_length = sizeof($array); if($arr_length < 2) { return $array; } while($arr_length) { --$arr_length; $rand_key = array_keys($array)[mt_rand(0, $arr_length)]; $shuffled_array[$rand_key] = $array[$rand_key]; unset($array[$rand_key]); } return $shuffled_array; } function __construct() { $names = ["loup", "troll", "gobelin"]; $a = 0; $this->cards = []; while ($a <= 29) { array_push($this->cards, new Card($names[rand(0, count($names) -1 )], rand(5, 15), rand(5, 15))); $a++; } } } class Player{ public $name; public $health; public $card; function __construct($name, $health, $card) { $this->name = $name; $this->health = $health; $this->card = $card; } } $deck1 = new Deck(); $deck2 = new Deck(); $finalDeck1 = $deck1->shuffle_array($deck1->cards) ; $finalDeck2 = $deck2->shuffle_array($deck2->cards) ; if (empty($finalDeck1)) { echo "empty"; foreach ($deck1 as $key => $value) { foreach ($value as $key1 => $value1) { array_push($finalDeck1, $value1); } } } if (empty($finalDeck2)) { echo "empty"; foreach ($deck2 as $key => $value) { foreach ($value as $key1 => $value1) { array_push($finalDeck2, $value1); } } } $player1 = new Player("player1", 30 , $deck1->draw($finalDeck1)); $player2 = new Player("player2", 30 , $deck2->draw($finalDeck2)); while ($player1->health > 0 && $player2->health > 0) { if ($player1->card->life < $player2->card->damage) { echo "La carte du player 1 " . $player1->card->name . " à " . $player1->card->damage . " de dégats et " . $player1->card->life . " pv". "<br>"; echo "La carte du player 2 " . $player2->card->name . " à " . $player2->card->damage . " de dégats et " . $player2->card->life . " pv". "<br>" ; $player1->health = $player1->health + ($player1->card->life - $player2->card->damage); echo 'PDV du player 1 = ' . $player1->health . "<br>"; echo 'PDV du player 2 = ' . $player2->health . "<br>" . "<br>"; $player1->card = $deck1->draw($finalDeck1); $player2->card = $deck2->draw($finalDeck2); var_dump($finalDeck1); } if ($player2->card->life < $player1->card->damage){ echo "La carte du player 1 " . $player1->card->name . " à " . $player1->card->damage . " de dégats et " . $player1->card->life . " pv". "<br>"; echo "La carte du player 2 " . $player1->card->name . " à " . $player2->card->damage . " de dégats et " . $player2->card->life . " pv". "<br>" ; $player2->health = $player2->health + ($player2->card->life - $player1->card->damage); echo 'PDV du player 1 = ' . $player1->health . "<br>"; echo 'PDV du player 2 = ' . $player2->health . "<br>" . "<br>"; $player1->card = $deck1->draw($finalDeck1); $player2->card = $deck2->draw($finalDeck2); var_dump($finalDeck1); } if ($player2->card->life > $player1->card->damage && $player2->card->life > $player1->card->damage) { echo "La carte du player 1 " . $player1->card->name ." à " . $player1->card->damage . " de dégats et " . $player1->card->life . " pv". "<br>"; echo "La carte du player 2 " . $player1->card->name ." à " . $player2->card->damage . " de dégats et " . $player2->card->life . " pv". "<br>" ; echo 'PDV du player 1 = ' . $player1->health . "<br>"; echo 'PDV du player 2 = ' . $player2->health . "<br>" . "<br>"; $player1->card = $deck1->draw($finalDeck1); $player2->card = $deck2->draw($finalDeck2); var_dump($finalDeck1); } else{ $player1->card = $deck1->draw($finalDeck1); $player2->card = $deck2->draw($finalDeck2); } } if ($player1->health < 1 && $player2->health < 1) { echo "Egalité"; } elseif (count($finalDeck1) == 0) { echo 'Le player 2 à gagné'; } elseif (count($finalDeck2) == 0) { echo 'Le player 1 à gagné'; } elseif ($player1->health < 1) { echo 'Le player 2 à gagné'; } elseif ($player2->health <1) { echo 'Le player 1 à gagné'; } ?> 

1 Answer 1

2

Try passing the $deck array by reference:

public function draw(& $deck){ $sortedDeck = array_values($deck); $rand = mt_rand(0,count( $sortedDeck ) -1 ); $drawnCard = $sortedDeck[$rand]; unset($deck[$rand]); return $drawnCard; } 

Are arrays in PHP copied as value or as reference to new variables, and when passed to functions?

Sign up to request clarification or add additional context in comments.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.