0

私は、2 つのブロックを選択する必要があり、それらが同じ場合は開いたままにするゲームの 1 つを作成しています。別のブロックを選択すると、ブロックが閉じ、別の 2 つのブロックを選択する必要があります。

これまでの私のコードは次のとおりです。

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

考えられる解決策の 1 つは、問題を逆にすることです。位置のリスト (つまり[1.1, 1.2, 1.3, 1.4, 2.1, ...]) を作成し、この配列をシャッフルします。最初の写真は、このシャッフルされたリストの最初の 2 つのエントリを取得し、2 番目の画像は次の 2 つのエントリを取得します。

于 2013-06-16T08:01:25.940 に答える
1

mt_rand()差が 3 しかない 2 つの引数が渡されると、すべての組み合わせが使い果たされるため、繰り返しパターンが発生することは避けられません。

于 2013-06-16T07:54:25.230 に答える
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 に答える