0

board.phpWeb ページにボードを表示するファイルが 1 つあります。このファイルには、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と、 set でリロードされること$_GET['move']です。リロードされているため、再び含まれているように見えboardEngine.php、マトリックス内のすべての位置が初期化されます。

これまでのところ、移動が送信され、board.phpリロードboardEngine.phpされ、すべての位置がリセットされて別の時間に含まれていることを理解しているので$_GET['move']、フォームを介して変数が設定されているため、1 つの移動が計算されます。新しい手が送信されると、ボードはリセットされ、最後の手が考慮されます。

私が間違っている?どうすればこの問題を解決できますか?

編集 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() {
  // ...
}
4

3 に答える 3

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();

編集:明確にするために:最後の動きをaとして保存し$_SESSIONてエコーアウトするには:

$_SESSION['lastmove'] = $boardEngine->getLastmove();
echo $_SESSION['lastmove'];
于 2013-10-10T16:28:20.813 に答える
1

http はステートレス プロトコルです。つまり、リクエストごとにスクリプトが何度も実行されます。フォームを投稿すると、新しいリクエストが作成されます。

どうにかしてゲームの状態を維持する必要があります。$_SESSIONBarmarも提案したように、それは良い考えです。

編集:ボードエンジンを投稿したので、始めるために、次の手順を実行します。

session_start();1)コードの先頭にa を追加します

$board=....2) の部分を ` に置き換えます。

if(!isset($_SESSION['board']))
  $_SESSION['board']=.......

$board3)コード内のすべての出現箇所を次のように置き換えます$_SESSION['board']

于 2013-10-10T16:38:54.547 に答える
0

まず言わないで

board.php?moveアクションで。get 変数には値を指定した方がよいでしょう。に変更しますboard.php?move=yes

それで、

if(isset($_GET['move'])) if($_GET['move']==="yes")  include_once('boardEngine.php');
于 2013-10-10T16:30:44.607 に答える