记忆拼图 - 产生独特的位置

时间:2013-06-16 07:47:38

标签: php oop puzzle

我正在制作其中一个必须选择两个区块的游戏,如果它们是相同的,它们会保持开放状态。如果你选择不同的区块,你必须选择另外两个区块。

到目前为止,这是我的代码:

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;收率

3 个答案:

答案 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.