//Tic-Tac-Toe
$n = 5;//五阶棋盘
$res = array();
function check($arr)
{
$n = $GLOBALS['n'];
$res = $GLOBALS['res'];
//已经下过这一步,返回false;没有,赋值
if (isset($res[$arr[1]][$arr[2]])) {
return false;
} else {
$res[$arr[1]][$arr[2]] = $arr[0];
}
//如果某一步下在对角线上,额外进行一次对角线判断(前提:阶数为奇数)
if ($n % 2 == 1) {
if ($arr[1] == $arr[2]) {
for ($i = 0; $i < $n - 1; $i++) {
if (!(isset($res[$i][$i]) && isset($res[$i + 1][$i + 1])) || $res[$i][$i] != $res[$i + 1][$i + 1]) {
break;
} elseif ($n - 2 == $i) {
var_dump($arr[0] . '--- Win!');
$GLOBALS['res'] = $res;
return true;
}
}
} elseif ($arr[1] + $arr[2] + 1 == $n) {
for ($i = 0; $i < $n - 1; $i++) {
if (!(isset($res[$i][$n - 1 - $i]) && isset($res[$i + 1][$n - 2 - $i])) || $res[$i][$n - 1 - $i] != $res[$i + 1][$n - 2 - $i]) {
break;
} elseif ($n - 2 == $i) {
var_dump($arr[0] . '--- Win!');
$GLOBALS['res'] = $res;
return true;
}
}
}
}
for ($i = 0; $i < $n - 1; $i++) {
//横列判断(是否赋值 or 是否相等),不符合则进行纵列判断
if (!(isset($res[$arr[1]][$i]) && isset($res[$arr[1]][$i+1])) || $res[$arr[1][$i]] != $res[$arr[1][$i+1]]) {
//进行纵列判断(是否赋值 or 是否相等),不符合则跳出两层循环
for ($j = 0; $j < $n -1; $j++) {
if (!(isset($res[$j][$arr[2]]) && isset($res[$j+1][$arr[2]])) || $res[$j][$arr[2]] != $res[$j+1][$arr[2]]) {
break 2;
} elseif ($n - 2 == $j) {
var_dump($arr[0] . '--- Win!');
$GLOBALS['res'] = $res;
return true;
}
}
break;
} elseif ($n - 2 == $i) {
var_dump($arr[0] . '--- Win!');
$GLOBALS['res'] = $res;
return true;
}
}
$GLOBALS['res'] = $res;
}
模拟两位用户下棋并最终打印结果:
check(['a', 0, 3]);
check(['b', 2, 4]);
check(['a', 1, 3]);
check(['b', 1, 2]);
check(['a', 2, 3]);
check(['b', 2, 0]);
check(['a', 3, 3]);
check(['b', 3, 1]);
check(['a', 4, 3]);
var_dump($res);
输出:
ex0.php:49:string 'a--- Win!' (length=9)
ex0.php:73:
array (size=5)
0 =>
array (size=1)
3 => string 'a' (length=1)
2 =>
array (size=3)
4 => string 'b' (length=1)
3 => string 'a' (length=1)
0 => string 'b' (length=1)
1 =>
array (size=2)
3 => string 'a' (length=1)
2 => string 'b' (length=1)
3 =>
array (size=2)
3 => string 'a' (length=1)
1 => string 'b' (length=1)
4 =>
array (size=1)
3 => string 'a' (length=1)