我正在制作其中一个必须选择两个区块的游戏,如果它们是相同的,它们会保持开放状态。如果你选择不同的区块,你必须选择另外两个区块。
到目前为止,这是我的代码:
public $pictures = ['apple.png', 'cake.png', 'coconut.png', 'guava.png',
'guawa.png', 'kiwi.png', 'limewire.png', 'pear.png'];
private function makeGame()
{
foreach($this->pictures as $picture)
{
for($i = 0; $i < 2; $i++)
{
$this->mapBoard[] = array('value' => $picture, 'x' => $this->randomPos('x'), 'y' => $this->randomPos('y'));
}
}
}
private function randomPos($arg)
{
$random = mt_rand(1,4);
if(!empty($this->mapBoard))
{
foreach($this->mapBoard as $image)
{
if($image[$arg] == $random)
$this->randomPos($arg);
else
return $random;
}
}
else
{
return $random;
}
}
但'x'和'y'的值有时会重复。你能告诉我哪里做错了什么,或者另一种方法来产生独特的x&amp;收率
答案 0 :(得分:1)
如果mt_rand()
传递了两个参数,只有3的差异,那么你将不可避免地得到重复的模式,因为所有的组合都将用完。
答案 1 :(得分:1)
一种可能的解决方案是解决问题。列出一个位置列表(即[1.1, 1.2, 1.3, 1.4, 2.1, ...]
),然后列出shuffle此数组。现在为第一张照片拍摄这个洗牌列表中的前两个条目,第二张图片接下来的两个,依此类推。
答案 2 :(得分:1)
最好的办法是循环所有地图块并为其分配图片。
在每个块上从数组中选择一个随机图片,当它被使用时,将其从数组中删除。
这样的事情:
$this->images = {"1.jpg","1.jpg","2.jpg","2.jpg","3.jpg","...etc etc."}; //16 images (8 unique)
$this->mapboard = array(); // Gonna be a 2 dimensional
// We are making a 4x 4 map
for($x=0,$x<4;$x++){
for($y=0,$y<4;$y++){
shuffle($numbers); /// we randomize array elements by shuffling it (like a deck of cards)
$this->mapboard[$x][$y] = array_pop($this->images); //we take the last card out of the deck and put it on the map (x,y)
}
}
//all cards are on board, and all blocks are used.