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

作为指导方针,我不会在循环内执行$i--,因为这是一个经典的无限循环生成器。而是在内部执行另一个循环,继续生成随机地雷,直到它没有击中现有的地雷。

于 2012-04-05T20:20:48.753 回答
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

问题出在您的第二个循环中。由于索引是随机数,所以这些索引的数组值可能已Xelse语句中设置为,并且随机地,将一次又一次地检查相同的索引,因此它将进入if语句,这里是你减去的地方i

在循环体中更改循环变量的值不是一个好习惯i

于 2012-04-05T20:27:22.283 回答
-1

显然是因为您减少了循环计数器:

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

在某一时刻,所有字段都将等于“X”,您将有一个无限循环。

在 for 循环中使用索引是一个非常糟糕的习惯

于 2012-04-05T20:20:44.157 回答