【问题标题】:How to change a value of an object in a multidimensional array with OOP in PHP如何在 PHP 中使用 OOP 更改多维数组中对象的值
【发布时间】:2015-12-08 18:49:09
【问题描述】:

我正在构建一个国际象棋游戏,将 7 个皇后随机放置在棋盘上,而不会互相击中。该板由 7 行和 7 列构成。到目前为止,我做了以下步骤

  1. 制作了 5 个类别:游戏、棋盘、盒子、棋子和皇后。
  2. 游戏的创建和实例。
  3. 使用 createBoard 方法创建了一个新的 Board 对象。
  4. 创建了一个 showBoard 方法来显示板。

现在我想将第一个皇后放在棋盘上的一个随机框中,但我不知道如何访问多维数组的对象。 set_piece 方法应该访问棋盘对象并在随机框中放置一个 Q,然后将该框标记为占用 = true。有人知道应该如何构造 Game 类中的 set_piece 方法吗?

游戏类:

class Game {
    var $board;
    var $length;

    public function createBoard($length) {
        $this->board = new Board($length);
        $this->length = $length;
    }

    public function showBoard() {
        // Create table
        $table_str = '<table border="1px">';
        for($row=1; $row <= $this->length; $row++) {
            $table_str .= "<tr>";
            for($col=1; $col <= $this->length; $col++) {
                $total = $row + $col;
                if($total%2==0) {
                    $table_str .= "<td height=100px width=100px bgcolor=#FFFFFF></td>";
                } else {
                    $table_str .= "<td height=60px width=60px bgcolor=#000000></td>";
                }
            }
            $table_str .= "</tr>";
        }
        return $table_str;
    }
    public function set_piece() {

    }
}

板级:

class Board {
    public $box;
    public function __construct($length) {
        for($i=0; $i < $length; $i++){
            for($j=0; $j< $length; $j++){
               $this->box[$i+1][$j+1] = new Box($i+1, $j+1);
            }
        }
    }
}

盒子类:

class Box {
    public $piece;
    public $occupied = false;
}

单品类:

class Piece {

}

女王级:

class Queen extends Piece {

}

索引:

$game = new Game();

$game->createBoard(7);
$game->set_piece();

echo $game->showBoard();

echo "<pre>";
print_r($game->board);
echo "</pre>";

我尝试访问的数组如下所示:

Board Object
(
    [box] => Array
        (
            [1] => Array
                (
                    [1] => Box Object
                        (
                            [piece] => 
                            [occupied] => 
                        )

                    [2] => Box Object
                        (
                            [piece] => 
                            [occupied] => 
                        )

                    [3] => Box Object
                        (
                            [piece] => 
                            [occupied] => 
                        )

                    [4] => Box Object
                        (
                            [piece] => 
                            [occupied] => 
                        )

                    [5] => Box Object
                        (
                            [piece] => 
                            [occupied] => 
                        )

                    [6] => Box Object
                        (
                            [piece] => 
                            [occupied] => 
                        )

                    [7] => Box Object
                        (
                            [piece] => 
                            [occupied] => 
                        )

                )

             [2] => Array
                (
                    [1] => Box Object
                        (
                            [piece] => 
                            [occupied] => 
                        )

                    [2] => Box Object
                        (
                            [piece] => 
                            [occupied] => 
                        )

                    [3] => Box Object
                        (
                            [piece] => 
                            [occupied] => 
                        )

                    [4] => Box Object
                        (
                            [piece] => 
                            [occupied] => 
                        )

                    [5] => Box Object
                        (
                            [piece] => 
                            [occupied] => 
                        )

                    [6] => Box Object
                        (
                            [piece] => 
                            [occupied] => 
                        )

                    [7] => Box Object
                        (
                            [piece] => 
                            [occupied] => 
                        )

                )

             [3] => Array
                 (
                    [1] => Box Object
                         (
                            [piece] => 
                            [occupied] => 
                        )

                    [2] => Box Object
                        (
                            [piece] => 
                            [occupied] => 
                        )

                    [3] => Box Object
                        (
                            [piece] => 
                            [occupied] => 
                        )

                    [4] => Box Object
                        (
                            [piece] => 
                            [occupied] => 
                        )

                    [5] => Box Object
                        (
                            [piece] => 
                            [occupied] => 
                        )

                    [6] => Box Object
                        (
                            [piece] => 
                            [occupied] => 
                        )

                    [7] => Box Object
                        (
                            [piece] => 
                            [occupied] => 
                        )

                )

            [4] => Array
                (
                    [1] => Box Object
                        (
                            [piece] => 
                            [occupied] => 
                        )

                    [2] => Box Object
                        (
                            [piece] => 
                            [occupied] => 
                        )

                    [3] => Box Object
                        (
                            [piece] => 
                            [occupied] => 
                        )

                    [4] => Box Object
                        (
                            [piece] => 
                            [occupied] => 
                        )

                    [5] => Box Object
                        (
                            [piece] => 
                            [occupied] => 
                        )

                    [6] => Box Object
                        (
                            [piece] => 
                            [occupied] => 
                        )

                    [7] => Box Object
                        (
                            [piece] => 
                            [occupied] => 
                        )

                )

            [5] => Array
                (
                    [1] => Box Object
                        (
                            [piece] => 
                            [occupied] => 
                        )

                    [2] => Box Object
                        (
                            [piece] => 
                            [occupied] => 
                        )

                    [3] => Box Object
                        (
                            [piece] => 
                            [occupied] => 
                        )

                    [4] => Box Object
                        (
                            [piece] => 
                            [occupied] => 
                        )

                    [5] => Box Object
                        (
                            [piece] => 
                            [occupied] => 
                        )

                    [6] => Box Object
                        (
                            [piece] => 
                            [occupied] => 
                        )

                    [7] => Box Object
                        (
                            [piece] => 
                            [occupied] => 
                        )

                 )

             [6] => Array
                (
                    [1] => Box Object
                        (
                            [piece] => 
                            [occupied] => 
                        )

                    [2] => Box Object
                        (
                            [piece] => 
                            [occupied] => 
                        )

                    [3] => Box Object
                        (
                            [piece] => 
                            [occupied] => 
                        )

                    [4] => Box Object
                        (
                            [piece] => 
                            [occupied] => 
                        )

                    [5] => Box Object
                        (
                            [piece] => 
                            [occupied] => 
                        )

                    [6] => Box Object
                        (
                            [piece] => 
                            [occupied] => 
                        )

                    [7] => Box Object
                        (
                            [piece] => 
                            [occupied] => 
                        )

                )

            [7] => Array
                (
                    [1] => Box Object
                        (
                            [piece] => 
                            [occupied] => 
                        )

                    [2] => Box Object
                        (
                            [piece] => 
                            [occupied] => 
                        )

                    [3] => Box Object
                        (
                            [piece] => 
                            [occupied] => 
                        )

                    [4] => Box Object
                        (
                            [piece] => 
                            [occupied] => 
                        )

                    [5] => Box Object
                        (
                            [piece] => 
                            [occupied] => 
                        )

                    [6] => Box Object
                        (
                            [piece] => 
                            [occupied] => 
                        )

                    [7] => Box Object
                        (
                            [piece] => 
                            [occupied] => 
                        )

                )

        )

)

【问题讨论】:

  • Anyone an idea how the set_piece。没有。除非你向我们解释它应该做什么。

标签: php oop object multidimensional-array chess


【解决方案1】:

由于您已经拥有一个几乎完美的 OO-Layout,请尝试减少问题:不要访问多维数组,而是尝试添加 getter 和 setter 以显式处理某个级别。

一种方法:

$Game->getBoard()->getBox($row, $col)->getPiece()->set($queen);

更复杂的函数是getBox($row, $col)

class Board {
    public $box;
    public function __construct($length) {
        for($i=0; $i < $length; $i++){
            for($j=0; $j< $length; $j++){
               $this->box[$i+1][$j+1] = new Box($i+1, $j+1);
            }
        }
    }

    public function getBox($row, $col) {
        return $this->box[$row][$col];  // should ave some eception handling here!
    }
}

【讨论】:

    【解决方案2】:

    我会说这是您正在寻找的方法:

    public function set_piece(Piece $piece, $x, $y) {
      $this->board->box[$x][$y]->piece = $piece;
      $this->board->box[$x][$y]->occupied = true;
    }
    

    但是,您应该考虑稍微重构一下您的代码。上面的代码利用了您将板属性设计为public 的事实。起初这可能看起来很方便,因为您可以简单地访问和更改对象的内部结构。但这与 OOP 背后的理念相矛盾,即这正是你不应该做的事情,或者不应该被允许做的事情。相反,您应该通过声明 privateprotected 来隐藏对象的内部结构。只能通过属性的 getter 和 setter 方法进行访问。

    【讨论】:

      【解决方案3】:

      您应该使用setPiece 而不是混淆camelCase 和snake_case。这是一个实现。您也可以考虑使用私有实例变量而不是公共变量。一旦公开,你就不能真正回去,但你总是可以在以后公开私有变量。在这里,如果occupied 变为假,但piece 包含Piece,会发生什么情况。然后你会有不一致的状态。事实上,我建议你完全放弃 occupied 属性,而只拥有一个 piece 属性。

      class Game {
          private $board; // use private vars since you're already doing accessors
          ...
          public function setPiece ($row, $col, Piece $piece) {
              $this->board->setPiece($row, $col, $piece);
          }
      }
      
      class Board {
          ...
          public function setPiece ($row, $col, Piece $piece) {
              // since box is an array, make it plural
              $this->boxes[$row][$col]->setPiece($piece);
          }
      }
      
      class Box {
          ...
          public function setPiece (Piece $piece) {
              $this->piece = $piece;
          }
          public function isOccupied () {
              return !empty($this->piece);
          }
      }
      

      【讨论】:

        【解决方案4】:

        还有一件小事:在Box 类中你真的需要public $occupied 吗?如果$pieceNULL,那么它没有被占用?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多