为什么代码会进入无限循环? (

时间:2012-04-05 20:15:30

标签: php loops

<?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';
    }
}

我做错了什么?

6 个答案:

答案 0 :(得分:8)

在将字符串(或资源)与整数进行比较时,首先将字符串转换为数字as per the documentation,然后进行比较。

因此,这个:

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

...其中$minefield[$randx][$randy] = 0相当于:

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

......总是如此。因此,您在每次迭代时递增递减$i

答案 1 :(得分:7)

我会尝试设置$ minefield [$ x] [$ y] ='0';用引号,这两个类型都是字符串。可能是一个问题。

查看有关此主题的PHP手册Comparing Strings to Numbers

答案 2 :(得分:1)

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

答案 3 :(得分: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

答案 4 :(得分:0)

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

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

答案 5 :(得分:-1)

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

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

在某一点上,所有字段都将等于'X',并且您将拥有无限循环。

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