2
<?php
$mines = 10;

####
for($x=1; $x<=9; $x++) {
    for($y=1; $y<=9; $y++) {
        $minefield[$x][$y] = 0;
    }
}       

for($i=0; $i<$mines; $i++) {
    $randx = rand(1, 9);
    $randy = rand(1, 9);

    if($minefield[$randx][$randy] == 'X') {
        $i--;
    } else {
        $minefield[$randx][$randy] = 'X';
    }
}

何が間違っているのですか?

4

6 に答える 6

8

文字列 (またはリソース) を整数と比較する場合、最初にドキュメントに従って文字列を数値に変換してから比較します。

そのため、これは:

if ($minefield[$randx][$randy] == 'X')

...ここで、$minefield[$randx][$randy] = 0次と同等です:

if (0 == 0) // 0 == (int)'X'

...これは常に真実です。したがって、各反復でインクリメントおよびデクリメントしています。$i

于 2012-04-05T20:23:24.610 に答える
7

$minefield[$x][$y] = '0'; を設定してみます。両方のタイプが文字列になるように、引用符で囲みます。そこが問題かもしれません。

この件名については、PHP マニュアルのComparing Strings to Numbers を参照してください。

于 2012-04-05T20:20:27.850 に答える
1

あなたの問題には別の解決策があります。このように設定し、限られた座標セットで10個の位置のみを選択するようにしてください。

<?php

// build minefield
$minefield = array();
for($x=1; $x<=9; $x++) {
    $minefield[$x] = array();
    for($y=1; $y<=9; $y++) {
        $minefield[$x][$y] = 0;
    }
}

// prepare cartesian func
function array_cartesian() {
    $_ = func_get_args();
    if(count($_) == 0)
        return array(array());
    $a = array_shift($_);
    $c = call_user_func_array(__FUNCTION__, $_);
    $r = array();
    foreach($a as $v)
        foreach($c as $p)
            $r[] = array_merge(array($v), $p);
    return $r;
}

// get coordinates
$coords = array_cartesian(range(1,9), range(1,9));
// pick random coordinates' keys
$chosen_coords = array_rand($coords, 10);

foreach ($chosen_coords as $key) {
    $minefield[$coords[$key][0]][$coords[$key][1]] = 'X';
}

長いですが、Pythonで2〜3行で書くことができます。

追伸 デカルト積のコードはここからです:https ://stackoverflow.com/a/2516779/548696

于 2012-04-05T20:42:41.537 に答える
0

問題は 2 番目のループにあります。インデックスは乱数であるため、これらのインデックスの配列値がステートメントで設定されているX可能else性があり、偶然にも、同じインデックスが何度もチェックされるため、ifステートメントに移動し、ここでマイナスi!

iループの本体でループ変数の値を変更することはお勧めできません。

于 2012-04-05T20:27:22.283 に答える