Вы должны лучше понять, как работает ввод в 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...';
}
}
Вынужно подумать об одном цикле цикла, который вы разработали в своем вопросе.Используйте сеансы (так как http не имеет состояния) и пусть сервер / клиент позаботится о цикле.
Примечание: Это просто подход к проблеме, есть другие, но это похожек вашим предполагаемым решениям.
Некоторые дополнительные подсказки: Вы можете думать о php-игре как о конечных автоматах :
- васполучить вход извне
- изменить свой внутренний статус
- выход для информирования пользователя о вашем новом статусе
- в конечном итоге дождаться ввода
Вы можете использоватьдиспетчер, чтобы выбрать состояние и написать метод для каждого состояния или просто сделать метод кухонной раковины, как applyUserMove, и управлять коммутатором внутри.В любом случае работа (как программа), которую вы должны выполнять, одинакова.