PHP OO - 对象实例的关联数组,每次单击时重置
PHP OO - Associative array of object instances, resetting on each click
这是我的第一个问题,因为我完全卡住了,所以如果我遗漏了任何关键信息,我深表歉意 - 请告诉我!
我正在创建一个 PHP 战舰游戏并尝试使用完整的 OO。我真的很接近,但是,我的 classes 之一的数组没有保存我对它所做的任何更新。
首先,我动态地
created a HTML table with an onclick event - 将坐标传递给 JS 函数。
然后我在 jQuery 中进行 AJAX 调用:
function shotFired(row, column) {
var coords = {
x: row,
y: column
};
$.post("data/game_controller.php", {
jsonCoords: JSON.stringify(coords)
}, function(results) {
console.log(results)
console.log(results[4])
var playerShotResult = results[0];
var computerShotX = results[1] + 1;
var computerShotY = results[2] + 1;
var computerShotResult = results[3];
var positionsClicked = document.getElementById("computer_" + row + "," + column)
switch (playerShotResult) {
case "MISS":
positionsClicked.classList.add("miss");
break;
case "HIT":
positionsClicked.classList.add("hit");
break;
case "Already Hit":
document.getElementById("outputMessage").innerHTML = result
break;
default:
console.log("Player shot defaulted");
}
}, "json")
然后我使用game_controller.php来处理请求并调用shotFired:
<?php
session_start();
require("../classes/Game.class.php");
if (isset($_POST['jsonCoords'])) {
if (isset($_SESSION['newGame'])) {
$game = unserialize($_SESSION['newGame']);
$coords = json_decode($_POST['jsonCoords']);
$results = $game->shotFired($coords->x, $coords->y);
echo json_encode($results);
}
}
shotFired 从 Game.php Class 文件中获取 的实例Fleet class 调用计算机,并运行 checkPosition 函数:
public function shotFired($x, $y)
{
$computer = $this->getComputer();
$playerHit = $computer->checkPosition(($x - 1), ($y - 1));
$computerGrid = $computer->getBattleshipsGrid();
$computerHit = $this->simulateComputerShot();
return [$playerHit, $computerHit[0], $computerHit[1], $computerHit[2], $computerGrid];
}
checksPosition 检查 BattleshipGrid 数组中 Position 实例的 State,然后尝试用 H 或 M 更新数组 - 使用标准 setter 方法:
public function checkPosition($x, $y): string
{
$positionObj = $this->battleshipsGrid["(" . $x . "," . $y . ")"];
$positionState = $positionObj->getState();
if ($positionState == "#") {
$positionObj->setState("M");
return "MISS";
} elseif ($positionState == "M" || $positionState == "H") {
return "Already Fired";
} else {
$positionObj->setState("H");
return "HIT";
}
}
作为参考,我在 Fleet.php:
的构造函数中设置了 Battleships 面板
// Populate associative array with instances of position
for ($y = 0; $y < $gridSize; $y++) {
for ($x = 0; $x < $gridSize; $x++) {
$coordinates = "(" . $x . "," . $y . ")";
$this->battleshipsGrid[$coordinates] = new Position($x, $y);
}
}
它在设置后直接工作 - 但是,在下一个 onclick 事件中,H 或 M 值被重置为之前的值?
Seen here in console output
几个小时后,我最接近的是在 setState 函数中传递 byRef(没有影响)。
我在 array_map 上看到了一些注释,但我不确定这是我要找的吗?
作为参考,这是我将 battleshipGrid 输出到控制台的方式:
public function getBattleshipsGrid()
{
$readableGrid = "";
$grid = $this->battleshipsGrid;
foreach ($grid as $coordsID => $positionObj) {
$readableGrid .= "\n" . $coordsID . ": " . $positionObj->getState();
}
return $readableGrid;
}
很抱歉 post,但我不想遗漏任何内容。任何帮助都将不胜感激!
非常感谢
您似乎没有保存点击坐标的状态。如果您正在使用 eloquent 模型,并且 setState 正在更改属性的值,请确保您调用 $positionObj->save()
因为 php 不会在每个 ajax 请求上保存状态。您将需要使用数据库或某种存储来让您单击特定位置的服务器 'remember'。
这是我的第一个问题,因为我完全卡住了,所以如果我遗漏了任何关键信息,我深表歉意 - 请告诉我!
我正在创建一个 PHP 战舰游戏并尝试使用完整的 OO。我真的很接近,但是,我的 classes 之一的数组没有保存我对它所做的任何更新。
首先,我动态地 created a HTML table with an onclick event - 将坐标传递给 JS 函数。
然后我在 jQuery 中进行 AJAX 调用:
function shotFired(row, column) {
var coords = {
x: row,
y: column
};
$.post("data/game_controller.php", {
jsonCoords: JSON.stringify(coords)
}, function(results) {
console.log(results)
console.log(results[4])
var playerShotResult = results[0];
var computerShotX = results[1] + 1;
var computerShotY = results[2] + 1;
var computerShotResult = results[3];
var positionsClicked = document.getElementById("computer_" + row + "," + column)
switch (playerShotResult) {
case "MISS":
positionsClicked.classList.add("miss");
break;
case "HIT":
positionsClicked.classList.add("hit");
break;
case "Already Hit":
document.getElementById("outputMessage").innerHTML = result
break;
default:
console.log("Player shot defaulted");
}
}, "json")
然后我使用game_controller.php来处理请求并调用shotFired:
<?php
session_start();
require("../classes/Game.class.php");
if (isset($_POST['jsonCoords'])) {
if (isset($_SESSION['newGame'])) {
$game = unserialize($_SESSION['newGame']);
$coords = json_decode($_POST['jsonCoords']);
$results = $game->shotFired($coords->x, $coords->y);
echo json_encode($results);
}
}
shotFired 从 Game.php Class 文件中获取 的实例Fleet class 调用计算机,并运行 checkPosition 函数:
public function shotFired($x, $y)
{
$computer = $this->getComputer();
$playerHit = $computer->checkPosition(($x - 1), ($y - 1));
$computerGrid = $computer->getBattleshipsGrid();
$computerHit = $this->simulateComputerShot();
return [$playerHit, $computerHit[0], $computerHit[1], $computerHit[2], $computerGrid];
}
checksPosition 检查 BattleshipGrid 数组中 Position 实例的 State,然后尝试用 H 或 M 更新数组 - 使用标准 setter 方法:
public function checkPosition($x, $y): string
{
$positionObj = $this->battleshipsGrid["(" . $x . "," . $y . ")"];
$positionState = $positionObj->getState();
if ($positionState == "#") {
$positionObj->setState("M");
return "MISS";
} elseif ($positionState == "M" || $positionState == "H") {
return "Already Fired";
} else {
$positionObj->setState("H");
return "HIT";
}
}
作为参考,我在 Fleet.php:
的构造函数中设置了 Battleships 面板 // Populate associative array with instances of position
for ($y = 0; $y < $gridSize; $y++) {
for ($x = 0; $x < $gridSize; $x++) {
$coordinates = "(" . $x . "," . $y . ")";
$this->battleshipsGrid[$coordinates] = new Position($x, $y);
}
}
它在设置后直接工作 - 但是,在下一个 onclick 事件中,H 或 M 值被重置为之前的值? Seen here in console output
几个小时后,我最接近的是在 setState 函数中传递 byRef(没有影响)。 我在 array_map 上看到了一些注释,但我不确定这是我要找的吗?
作为参考,这是我将 battleshipGrid 输出到控制台的方式:
public function getBattleshipsGrid()
{
$readableGrid = "";
$grid = $this->battleshipsGrid;
foreach ($grid as $coordsID => $positionObj) {
$readableGrid .= "\n" . $coordsID . ": " . $positionObj->getState();
}
return $readableGrid;
}
很抱歉 post,但我不想遗漏任何内容。任何帮助都将不胜感激!
非常感谢
您似乎没有保存点击坐标的状态。如果您正在使用 eloquent 模型,并且 setState 正在更改属性的值,请确保您调用 $positionObj->save()
因为 php 不会在每个 ajax 请求上保存状态。您将需要使用数据库或某种存储来让您单击特定位置的服务器 'remember'。