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

shotFiredGame.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'。