0

我正在制作一款你必须选择两个街区的游戏,如果它们相同,它们就会保持开放。如果您选择不同的街区,它们会关闭,您必须选择另外两个街区。

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

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 & y。

4

3 回答 3

1

由于mt_rand()传递了两个仅相差 3 的参数,因此不可避免地会出现重复模式,因为所有组合都将用完。

于 2013-06-16T07:54:25.230 回答
1

一种可能的解决方案是反转问题。制作一个位置列表(即[1.1, 1.2, 1.3, 1.4, 2.1, ...]),然后打乱这个数组。现在对于第一张图片,在这个混洗列表中取前两个条目,对于第二张图片,取接下来的两个,依此类推。

于 2013-06-16T08:01:25.940 回答
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.
于 2013-06-16T08:07:18.013 回答