我目前正在使用PHP来存储一些值(会话变量)和一些游戏逻辑函数,而Javascript方面主要用于渲染和玩家控件。
之前它运行良好,但现在游戏开始崩溃,我意识到Session的变量没有显示正确的值,就像它们已经更新一样。奇怪的是这个游戏在网址内没有“www”的情况下运行正常,通常发生在游戏的第二轮。下面是游戏开始崩溃时返回错误值的函数:
function TakeCurrentTurn(){
$currentTurn = $_SESSION["CurrentTurn"];
if ($currentTurn == $_SESSION["LastTurn"]){
$_SESSION["LastTurn"] = 0;
}
if ($currentTurn == 1){
OnPlayerMoved();
}else{
OnAiMoved();
}
if (GetSelectedCardCount($currentTurn) > 0){
if (CsIsAllow($currentTurn) == true){
DrawSelectedCard();
$_SESSION["LastTurn"] = $currentTurn;
}else{
UnselectAllCard($currentTurn);
}
}
IncreaseCurrentTurn();
session_write_close();
$img = [];
$img[] = GetDeckImg(2);
$img[] = GetDeckImg(3);
$img[] = GetDeckImg(4);
if ($_SESSION["LastTurn"] == $currentTurn && $currentTurn != 1 && $currentTurn != 0){
$img4Count = count($img[2]);
for ($i=0; $i<$img4Count; $i++){
$img[$currentTurn-2][] = $img[2][$i];
}
}
echo implode(",", $img[0])." ".implode(",", $img[1])." ".implode(",", $img[2])." ".$currentTurn;
}
当GetDeckImg函数从另一个Session变量返回值时,IncreaseCurrentTurn函数会增加$ _SESSION [“CurrentTurn”]的值。
当整个事件崩溃时,我注意到返回值显示的值与前一个响应相同。我不确定是什么导致了这个问题。我已将session_start()放在文件的顶部(在error_reporting(E_ALL)下面)并使用session_write_close(),但似乎无法解决问题。
编辑:
function IncreaseCurrentTurn(){
$_SESSION["CurrentTurn"] += 1;
if ($_SESSION["CurrentTurn"] > 3){
$_SESSION["CurrentTurn"] = 1;
}
}
function GetDeckImg($player){
$count = count($_SESSION["Poker"][$player]);
$deck = [];
for ($i=0; $i<$count; $i++){
$card = $_SESSION["Poker"][$player][$i];
$deck[] = $card['img'];
}
return $deck;
}
Edit2(更新信息): 经过多次检查后,我意识到服务器在错误发生时返回了之前的结果。当我再次重新发送最后一个请求时,它将返回正确的结果(此刻这正是我正在处理的问题......)。我也注意到这个问题只发生一次(或从不)每场比赛,一旦我重新发送最后一个请求并得到正确的结果,游戏的其余部分将正常运行。