<?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';
}
}
我做错了什么?
答案 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循环中使用索引是一个非常糟糕的习惯