اینجا میخوام بگم
بیا تو حالت اول بین همه اون هایی که این شرایط را دارن
$data===2 && $db===1 && $dbb===0
کوچکترین را انتخاب کن بزار $vj1
بعد متغیر های w را طبق مقدار vj1 به روز کن که برای اینکار نیاز داریم که vj1 را از v اولیه کم کنیم ولی متغیر v را تغییر نباید تغییر بدیم
بعدش بین اونایی که این شرایط را دارند
$data===2 && $db===0
کوچکترین را انتخاب کن بزار $vj2
بعد متغیر های w را طبق مقدار vj2 به روز کن که برای اینکار نیاز داریم که vj2 را از v اولیه کم کنیم ولی متغیر v را تغییر نباید تغییر بدیم
بعد بین این $vj1 و $vj2 هر کدام کوچکتر بود حرکت مربوط به اونو انجام بده
از متغیر global هم استفاده کردم ولی نشد
$vj1 را با $vj2 برابر میدونه در واقع نیست $vj1 باید کمتر باشه
تو آرایه a هم هیچ تغییری ایجاد نمیکند
چرا نمیدونم؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟ ؟؟؟؟؟؟
<?php
$a = [
[0,2,0,2,0,2,0,2],
[2,0,2,0,2,0,2,0],
[0,2,0,2,0,2,0,2],
[0,0,1,0,0,0,0,0],
[0,0,0,0,0,0,0,0],
[1,0,1,0,1,0,1,0],
[0,1,0,1,0,1,0,1],
[1,0,1,0,1,0,1,0],
];
$red = $blue = 0;
array_walk_recursive($a, function($t) use(&$red, &$blue)
{
if($t==1) {++$blue;}
elseif($t==2) {++$red;}
});
global $w0j1;
global $w1j1;
global $w2j1;
global $w0j2;
global $w1j2;
global $w2j2;
global $vj1;
global $vj2;
global $w0;
global $w1;
global $w2;
$w0=-10;
$w1=50;
$w2=-30;
global $v;
$v=$w0+($w1*$blue)+($w2*$red);
global $vj1;
global $vj2;
$move = [];
$move1 = [];
$move2 = [];
foreach($a as $i=>$row){
foreach($row as $j=>$data){
if(isset($a[$i+1][$j+1]))
{
$db=$a[$i+1][$j+1];
}
if(isset($a[$i+2][$j+2]))
{
$dbb=$a[$i+2][$j+2];
}
if($data===2 && $db===1 && $dbb===0){
if(isset($a[$i+2][$j+2]))
{
//چون نباید بورد اصلی تغییر کند و این حرکت تنها جهت محاسبه وی است بورد را در یک متغییر موقت میریزیم
$tmp1 = $a;
$tmp1[$i+2][$j+2]=2;
$tmp1[$i+1][$j+1]=0;
$tmp1[$i][$j]=0;
//توجه کنید که در هر حرکت ممکن است تعداد مهره ها تغییر کنید پس باید دوباره شمرده شود
$red = $blue = 0;
array_walk_recursive($tmp1, function($t) use(&$red, &$blue)
{
if($t==1) {++$blue;}
elseif($t==2) {++$red;}
});
$vj1=$w0+($w1*$blue)+($w2*$red);
if($vj1 < $v || ($vj1 == $v && rand(0,1)))
{
$error=$vj1-$v;
$w0j1=$w0+0.1*1*$error;
$w1j1=$w1+0.1*$blue*$error;
$w2j1=$w2+0.1*$red*$error;
//ذخیره اطلاعات مربوط به حرکت تا بعدا روی بورد اصلی این حرکت پیاده شود
$move1 = [$i, $j, $i+1, $j+1,$i+2,$j+2];
}
}
}
if($data===2 && $db===0){
if(isset($a[$i+1][$j+1]))
{
//چون نباید بورد اصلی تغییر کند و این حرکت تنها جهت محاسبه وی است بورد را در یک متغییر موقت میریزیم
$tmp2 = $a;
$tmp2[$i+1][$j+1]=2;
$tmp2[$i][$j]=0;
//توجه کنید که در هر حرکت ممکن است تعداد مهره ها تغییر کنید پس باید دوباره شمرده شود
$red = $blue = 0;
array_walk_recursive($tmp2, function($t) use(&$red, &$blue)
{
if($t==1) {++$blue;}
elseif($t==2) {++$red;}
});
$vj2=$w0+($w1*$blue)+($w2*$red);
if($vj2 < $v || ($vj2 == $v && rand(0,1)))
{
$error=$vj2-$v;
$w0j2=$w0+0.1*1*$error;
$w1j2=$w1+0.1*$blue*$error;
$w2j2=$w2+0.1*$red*$error;
//ذخیره اطلاعات مربوط به حرکت تا بعدا روی بورد اصلی این حرکت پیاده شود
$move2 = [$i, $j, $i+1, $j+1];
}
}
}
//انتخاب j1
if($vj1<$vj2 || $vj2===null)
{
if($move1)
{
$v=$w0j1+($w1j1*$blue)+($w2j1*$red);
// جای دو خانه را با هم عضو کن خانه وسط را صفر کن
$tmp1 = $a[$move1[0]][$move1[1]];
$a[$move1[0]][$move1[1]] = $a[$move1[4]][$move1[5]];
$a[$move1[2]][$move1[3]] = 0;
$a[$move1[4]][$move1[5]] = $tmp1;
unset($tmp1);
}
}
//انتخاب j2
elseif($vj2<$vj1 || $vj1===null)
{
if($move2)
{
$v=$w0j2+($w1j2*$blue)+($w2j2*$red);
//جای دو خانه را با هم عضو کن
$tmp2 = $a[$move2[0]][$move2[1]];
$a[$move2[0]][$move2[1]] = $a[$move2[2]][$move2[3]];
$a[$move2[2]][$move2[3]] = $tmp2;
unset($tmp2);
}
}
}
}
var_dump($v);
var_dump($vj1);
var_dump($vj2);
var_dump($move2);
var_dump($move1);
var_dump($a);
?>
ممنون میشم کمکم کنید