我有一个board.php
文件,在我的网页上显示一个电路板。该文件包含一个boardEngine.php
文件,其中包含初始化的每个变量和矩阵,以及计算所需的每个函数。
我在我的board.php
中添加了一个表单,以便我可以在电路板上进行下一步操作。 board.php
代码如下:
<!doctype html>
<html>
<body>
<?php
include_once('boardEngine.php');
?>
<div id='board'>
<?php
if (isset($_GET['move'] )) {
checkMove($_POST['queryMove']); // checkMove is from boardEngine.php
}
printBoard(); // function from boardEngine.php
?>
</div>
<form id="moveForm" action="board.php?move" method="post" >
<input type="text" name="queryMove" placeholder="form: 'e2f3' (e2 to f3)" required> </p>
<input type="submit" value=">move!<" >
</form>
</body>
问题在于,当我提交移动时,board.php
会重新加载一组$_GET['move']
。由于它被重新加载,似乎再次包含boardEngine.php
,并且矩阵中的每个位置都被初始化。
据我了解到目前为止,移动已提交,board.php
已重新加载,boardEngine.php
包含在另一个时间,每个位置都被重置,然后因为$_GET['move']
变量已被重置通过表单设置,将计算一个移动。提交新动作后,将重置董事会,并考虑最后一步,等等。
我错了吗?我该如何解决这个问题?
编辑1:这是我的boardEngine.php代码的外观:
<?php
define("PAWN", 10);
define("KNIGHT", 20);
define("BISHOP", 30);
define("ROOK", 40);
define("QUEEN", 50);
define("KING", 100);
define("B_PAWN", -10);
define("B_KNIGHT", -20);
define("B_BISHOP", -30);
define("B_ROOK", -40);
define("B_QUEEN", -50);
define("B_KING", -100);
$board = array(
array("", 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'),
array( 1, B_ROOK, B_KNIGHT, B_BISHOP, B_QUEEN, B_KING, B_BISHOP, B_KNIGHT, B_ROOK),
array(2, B_PAWN, B_PAWN, B_PAWN, B_PAWN, B_PAWN, B_PAWN, B_PAWN, B_PAWN),
array(3, 0, 0, 0, 0, 0, 0, 0, 0),
array(4, 0, 0, 0, 0, 0, 0, 0, 0),
array(5, 0, 0, 0, 0, 0, 0, 0, 0),
array(6, 0, 0, 0, 0, 0, 0, 0, 0),
array(7, PAWN, PAWN, PAWN, PAWN, PAWN, PAWN, PAWN, PAWN),
array(8, ROOK, KNIGHT, BISHOP, QUEEN, KING, BISHOP, KNIGHT, ROOK)
);
function checkMove($query) {
global $board;
if(strlen($query) != 4) {
return "Wrong query!";
}
//...
// Next modfy the $board positions according to rules
}
function printBoard() {
// ...
}
答案 0 :(得分:1)
BoardEngine.php
看起来如何?
为什么不把它变成一个类?像这样:
class BoardEngine {
//You can remove the construct function below, if you don't need it
function __construct(argument)
{
//Constructor code here if needed
}
public function printBoard()
{
# function code here...
}
public function checkMove($var)
{
# function code here...
}
public function yetanotherone()
{
# function code here...
}
}
然后您可以将所有“引擎”逻辑放在那里。
在您的board.php
:
<?php
require_once('BoardEngine.php');
$boardEngine = New BoardEngine();
if (isset($_GET['move'] )) {
$boardEngine->checkMove($_POST['queryMove']); // checkMove is from boardEngine.php
}
$boardEngine->printBoard(); // function from boardEngine.php
?>
<div id='board'>
</div>
<form id="moveForm" action="board.php?move" method="post" >
<input type="text" name="queryMove" placeholder="form: 'e2f3' (e2 to f3)" required> </p>
<input type="submit" value=">move!<" >
</form>
</body>
为了保存每次重新加载的动作,我还建议使用$_SESSION
。
或者在BoardEngine
班级:
private $lastmove;
public function setLastMove($value)
{
$this->lastmove = $value;
}
public function getLastMove($value)
{
return $this->lastmove;
}
现在在你的board.php中你可以设置最后一步:
$boardEngine->setLastmove($var);
最后一步:
$boardEngine->getLastmove();
编辑:要求:
要将最后一次移动保存为$_SESSION
并将其回显:
$_SESSION['lastmove'] = $boardEngine->getLastmove();
echo $_SESSION['lastmove'];
答案 1 :(得分:1)
http是一种无状态协议,这意味着脚本将针对每个请求重新运行。发布表单会创建一个新请求。
你必须以某种方式坚持你的游戏状态。 $_SESSION
是一个好主意,正如Barmar所建议的那样。
编辑:由于您已发布了您的主板引擎,并且刚开始使用,请执行以下操作:
1)在代码的开头添加session_start();
2)用`
替换$board=....
部分
if(!isset($_SESSION['board']))
$_SESSION['board']=.......
3)用$board
$_SESSION['board']
的每个出现
答案 2 :(得分:0)
首先,不要说
行动中的 board.php?move
。最好用值指定get变量。
将其更改为board.php?move=yes
然后,
if(isset($_GET['move'])) if($_GET['move']==="yes") include_once('boardEngine.php');