问题描述
所以基本上这是我为战舰游戏制作的算法。 我的 while 循环有问题,我想让 do while 循环中的代码不断重复,如果生成的值已经存在于多维数组中,并且看起来它确实有效,因为它生成了正确的值,但是我不断收到错误“未定义偏移”,为什么? 是的,我知道这是丑陋的代码,但我真的只是对错误感兴趣,因为否则程序运行良好
$_SESSION["ladjica1"] = array("","","");
$_SESSION["ladjica2"] = array("","");
$_SESSION["ladjica3"] = array("","");
$_SESSION["ladjica4"] = array("","");
$_SESSION["ladjica5"] = array("","");
$_SESSION["ladjica"] = array(
$_SESSION["ladjica1"],$_SESSION["ladjica2"],$_SESSION["ladjica3"],$_SESSION["ladjica4"],$_SESSION["ladjica5"]
);
function multi_array_iskanje($search_for,$search_in) {
foreach ($search_in as $element) {
if ( ($element === $search_for) || (is_array($element) && multi_array_iskanje($search_for,$element)) ){
return true;
}
}
return false;
}
function generirajLadjo($dolzina,$sirina,$indeksladje) {
do {
$ladjicaROW = rand(1,10)*10-1;
$ladjicaCOL = rand(1,10);
$zacetniPolozaj = $ladjicaROW + $ladjicaCOL;
for($sir = 0; $sir < $sirina; $sir++) {
$HaliV = rand(0,1);
if($HaliV == 1) {
if($ladjicaCOL > $dolzina) {
for($x = 0; $x < $dolzina; $x++) {
$_SESSION["ladjica".strval($indeksladje)][$x] = $zacetniPolozaj - $x;
}
} else {
for($x = 0; $x < $dolzina; $x++) {
$_SESSION["ladjica".strval($indeksladje)][$x] = $zacetniPolozaj + $x;
}
}
} else {
if(($ladjicaROW > ($dolzina*10)) && $ladjicaROW % 10 != 0) {
for($x = 0; $x < $dolzina; $x++) {
$_SESSION["ladjica".strval($indeksladje)][$x] = $zacetniPolozaj - ($x*10);
}
} else {
for($x = 0; $x < 5; $x++) {
$_SESSION["ladjica".strval($indeksladje)][$x] = $zacetniPolozaj + ($x*10);
}
}
}
}
} while(multi_array_iskanje($_SESSION["ladjica".strval($indeksladje)][$x],$_SESSION["ladjica"])==true);
}
generirajLadjo(5,1,1);
generirajLadjo(4,2);
generirajLadjo(3,3);
generirajLadjo(3,4);
generirajLadjo(2,5);
解决方法
因为 for 循环会增加计数器,然后测试它你的 do-while 限制语句使用了 $x = 5
并且爆炸了
$_SESSION["ladjica".strval($indeksladje)][$x]
超越界限。
我所做的只是 $x--;
作为完成循环和宾果游戏之前的最后一件事。没有错误。
$_SESSION["ladjica1"] = array("","","");
$_SESSION["ladjica2"] = array("","");
$_SESSION["ladjica3"] = array("","");
$_SESSION["ladjica4"] = array("","");
$_SESSION["ladjica5"] = array("","");
$_SESSION["ladjica"] = array(
$_SESSION["ladjica1"],$_SESSION["ladjica2"],$_SESSION["ladjica3"],$_SESSION["ladjica4"],$_SESSION["ladjica5"]
);
function multi_array_iskanje($search_for,$search_in)
{
foreach ($search_in as $element) {
if ( ($element === $search_for) || (is_array($element) && multi_array_iskanje($search_for,$element)) ){
return true;
}
}
return false;
}
function generirajLadjo($dolzina,$sirina,$indeksladje)
{
do {
$ladjicaROW = rand(1,10)*10-1;
$ladjicaCOL = rand(1,10);
$zacetniPolozaj = $ladjicaROW + $ladjicaCOL;
for($sir = 0; $sir < $sirina; $sir++) {
$HaliV = rand(0,1);
if($HaliV == 1) {
if($ladjicaCOL > $dolzina) {
for($x = 0; $x < $dolzina; $x++) {
$_SESSION["ladjica".strval($indeksladje)][$x] = $zacetniPolozaj - $x;
}
} else {
for($x = 0; $x < $dolzina; $x++) {
$_SESSION["ladjica".strval($indeksladje)][$x] = $zacetniPolozaj + $x;
}
}
} else {
if(($ladjicaROW > ($dolzina*10)) && $ladjicaROW % 10 != 0) {
for($x = 0; $x < $dolzina; $x++) {
$_SESSION["ladjica".strval($indeksladje)][$x] = $zacetniPolozaj - ($x*10);
}
} else {
for($x = 0; $x < 5; $x++) {
$_SESSION["ladjica".strval($indeksladje)][$x] = $zacetniPolozaj + ($x*10);
}
}
}
}
$x--;
} while(multi_array_iskanje($_SESSION["ladjica".strval($indeksladje)][$x],$_SESSION["ladjica"])==true);
}
generirajLadjo(5,1,1);
generirajLadjo(4,2);
generirajLadjo(3,3);
generirajLadjo(3,4);
generirajLadjo(2,5);
控制外循环有点狡猾,结果循环中发生了其他事情 IMO