خسته نباشید.

نیازی به دستور نکست ندارید همین الان دارید داخل دو تا حلقه تو در تو تک تک خانه های بورد را بررسی می کنید. مثلا اگر مهره آبی بود و خانه جلوییش (راست جلو) خالی بود یک حرکت قابل قبول است. حرکت را بصورت موقت انجام داده (برای بررسی حرکت مجاز بعدی نباید تغییری در مهره های بورد اصلی صورت گیرد) و مقدار V را محاسبه می کنیم. من متوجه شیوه محاسبه فرمول v نشدم اینکه مقدار اولیه برای v و w0 و ... چیست.

اما در هر صورت من فرض می کنم مقدار v اولیه برابر -100 باشه.


<?php
$a=array(
array(2,5,2,5,0,5,1,5,),
array(2,5,2,5,0,5,1,5,),
array(2,5,2,5,0,5,1,5,),
array(2,5,2,1,0,5,1,5,),
array(2,5,2,5,0,5,1,5,),
array(2,5,2,5,0,5,1,5,),
array(0,5,0,5,0,5,1,5,),
array(0,5,0,5,0,5,1,5,),

);


$w0=-10;
$w1=50;
$w2=-30;
$v=$w0+($w1*$blue)+($w2*$red);
$move = [];

foreach($a as $i=>$row){
foreach($row as $j=>$data){
if(isset($a[$i+1][$j+1]))
{
$db=$a[$i+1][$j+1];
}
$r=1;
if($data===1 && $db===0){
if(isset($a[$i+1][$j+1]))
{
//چون نباید بورد اصلی تغییر کند و این حرکت تنها جهت محاسبه وی است بورد را در یک متغییر موقت میریزیم
$tmp = $a;
$tmp[$i+1][$j+1]=1;
$tmp[$i][$j]=0;

//توجه کنید که در هر حرکت ممکن است تعداد مهره ها تغییر کنید پس باید دوباره شمرده شود
$red=0;$blue=0;
array_walk_recursive($tmp, function($val) use(&$red){ if($val==2) {++$red;}elseif($val==1) {++$blue;}});


$vj=$w0+($w1*$blue)+($w2*$red);
if($vj > $v)
{
$error=$vj-$v;
$w1=$w1+0.1*$blue*$error;
$w2=$w2+0.1*$red*$error;
$v = $vj;
//ذخیره اطلاعات مربوط به حرکت تا بعدا روی بورد اصلی این حرکت پیاده شود
$move = [$i, $j, $i+1, $j+1];
}

}
}
}
}

var_dump($v);
var_dump($move);
//بهترین حرکت مورد انتخاب شده روی بورد اصلی پیاده شود
if($move){
//جای دو خانه را با هم عضو کن
$tmp = $a[$move[0]][$move[1]];
$a[$move[0]][$move[1]] = $a[$move[2]][$move[3]];
$a[$move[2]][$move[3]] = $tmp;
unset($tmp);
}