我正在使用类编写PHP游戏,而我正试图弄清楚如何在主要游戏方法的中间获取用户输入。我理解从HTML表单提交数据并让PHP脚本使用$_GET
或$_POST
检索数据的概念,但我不知道如何在方法的中间发生这种情况(如果这是处理这个的最好方法)。这是游戏类:
class GamePlay
{
$playerChoice="";
$gameOver="false";
public function play() {
while !($this->gameOver) {
doSomething();
$this->playerChoice=$this->getPlayerInput();
doSomethingElse();
}
}
public function getPlayerInput() {
echo '<form name="playerForm" "method="post">';
echo '<input type="submit" name="submit" value="do this" />';
echo '<input type="submit" name="submit" value="do that" />';
echo '</form>';
$input=$_POST['submit'];
return $input;
}
}
但是脚本最终执行doSomethingElse()
而不等待用户提交数据,我希望用户在脚本继续之前提交。我该怎么做呢?
答案 0 :(得分:3)
您对HTTP请求的工作原理存在误解。
您的脚本应独立处理表单的每次提交。我的意思是脚本应该处理请求,显示表单,并终止执行。然后,当用户点击提交时,您的脚本将再次执行。您需要使用sessions或cookies之类的内容来保留用户请求之间的状态。
答案 1 :(得分:0)
通常输入来自向服务器发送请求的用户或ajax(链接或ajax对象)。你应该在一个页面上有你的功能的前半部分,在第二页面上有一个完成(通过链接或其他东西到达)。
public function play(){
while !($this->gameOver){
doSomething();
}
}
public function getPlayerInput(){
echo '<form name="playerForm" "method="post" action="action.php">';
echo '<input type="submit" name="submit" value="do this" />';
echo '<input type="submit" name="submit" value="do that" />';
echo '</form>';
$input=$_POST['submit'];
return $input;
}
然后第二页action.php可以通过读取$ _POST变量和doSomethingElse来处理。
答案 2 :(得分:0)
你必须更好地掌握输入在php中的工作原理。
您无法让用户将数据输入到脚本中间。当php脚本开始执行时,所有用户输入已经完成,你只需要处理它。
尝试将方法拆分为两个以模拟预期的行为
class GamePlay
{
$playerChoice="";
$gameOver="false";
public function pendingInput() {
// check for input into $_GET or $_POST and return data or false
// something like (this function maybe a lot more complicate (or splitted
// into smaller ones):
if (isset($_POST['submit']) {
// always check user input for forgeries
// you have to write the sanitize function obviously
$input=sanitize($_POST['submit']);
return $input;
} else {
return false;
}
}
public function play(){
if (!$this->gameOver) {
$input = $this->pendingInput();
if($input) {
$this->applyUserMove($input);
$this->doComputerMove();
}
$this->getPlayerInput();
} else {
$this->gameEnds();
}
}
public function getPlayerInput(){
echo '<form name="playerForm" "method="post">';
echo '<input type="submit" name="submit" value="do this" />';
echo '<input type="submit" name="submit" value="do that" />';
echo '</form>';
}
public function gameEnds() {
echo 'The game is over. The winner is blah blah ... ';
echo 'play another game?';
echo 'link to start game...';
}
}
您必须考虑在问题中设计的while循环的单次运行。使用会话(因为http是无状态的)并让服务器/客户端负责循环。
注意:这只是解决问题的方法,还有其他方法,但这与您的预期解决方案类似。
一些额外的提示:您可以将php游戏视为Finite State Automata:
您可以使用调度程序选择状态并为每个状态编写方法,或者只使用applyUserMove等厨房接收器方法并在内部操作交换机。无论哪种方式,你必须做的工作(作为程序)是相同的。