Я пытаюсь построить X в диагональных полях. Королева размещается случайным образом. Смотрите изображение ниже.
Как видите, только последний X на (5,5) нанесен правильно. В этом примере X должен быть нанесен в графу (1,1), (2,2), (3,3), (4,4) и (5,5). Поскольку королева размещается случайным образом, метод markRelatedDiagonalBoxes должен работать динамически. Ниже Board_model. У любого есть идея, как правильно написать markRelatedDiagonalBoxes, чтобы он отобразил X, как описано выше.
Board_model.php
<?php
/**
* This class will handle:
* 1) Constructing the boards boxes.
* 2) Returning the property $_row.
* 3) Returning the property $_col.
* 4) Returning the property $_box.
* 5) Setting random rows and columns.
* 6) Returning all the related boxes.
* 7) Returning the horizontal related boxes.
* 8) Returning the vertical related boxes.
* 9) Returning the diagonal related boxes.
*/
class Board_model extends CI_Model {
public $randomRow;
public $randomCol;
private $_box;
private $_length;
private $_row;
private $_col;
/**
* This method 1) will:
* 1) Set the $_length property.
* 2) Create an array of new objects, Boxes based on the length of the rows and columns.
* @param int $length
*/
public function __construct() {
parent::__construct();
$this->load->model('box');
$this->_length = 7;
for($row=0; $row < $this->_length; $row++){
for($col=0; $col< $this->_length; $col++){
$this->_row = $row;
$this->_col = $col;
$this->_box[$row+1][$col+1] = new Box($row+1, $col+1);
}
}
}
/**
* This method 2) will:
* 1) Return the $_row property.
* @return int
*/
public function getRow() {
return $this->_row;
}
/**
* This method 3) will:
* 1) Return the $_col property.
* @return int
*/
public function getCol() {
return $this->_col;
}
/**
* This method 4) will:
* 1) Return the $_box property based on the specified row and column.
* @param $row
* @param $col
* @return mixed
*/
public function getBox($row, $col) {
return $this->_box[$row][$col];
}
/**
* This method 5) will:
* 1) Randomly choose a number within the rang from 1 to the $_length property and place it in the property $randomRow.
* 2) Randomly choose a number within the rang from 1 to the $_length property and place it in the property $randomCol.
* 3) Execute the MarkRelatedHorizontalBoxes method.
* 4) Execute the MarkRelatedVerticalBoxes method.
* 5) TODO: Execute the MarkRelatedDiagonalBoxes method.
*/
public function setRandomColRow() {
// STATIC RANDOM TEST NUMBER
//mt_srand(1234534);
$this->randomRow = mt_rand(1, $this->_length);
$this->randomCol = mt_rand(1, $this->_length);
// Set piece
$this->getBox($this->randomRow,$this->randomCol)->setPiece("♕");
$this->relatedDiagonalBoxes();
return $this->_box;
}
function object_to_array($object) {
return (array) $object;
}
/**
* This method 7) will:
* 1) Create the related vertical array
* 2) Loop thew the array
* 3) Get the box position and place and X in the box as piece
* 4) TODO: Check if the box is empty
*/
public function markRelatedVerticalBoxes() {
for($row = 0; $row < $this->_length; $row++) {
$verticalBoxes[$row+1] = $row+1;
// Delete the random cel out of the array
unset($verticalBoxes[$this->randomRow]);
}
foreach ($verticalBoxes as $verticalBox) {
$this->getBox($verticalBox,$this->randomCol)->setPiece("X");
}
}
/**
* This method 8) will:
* 1) Create the related horizontal array
* 2) Loop thew the array
* 3) Get the box position and place and X in the box as piece
*/
public function markRelatedHorizontalBoxes() {
for($col = 0; $col < $this->_length; $col++) {
$horizontalBoxes[$col+1] = $col+1;
// Delete the random cel out of the array
unset($horizontalBoxes[$this->randomCol]);
}
foreach ($horizontalBoxes as $horizontalBox) {
$this->getBox($this->randomRow, $horizontalBox)->setPiece("X");
}
}
public function markRelatedDiagonalBoxes() {
$row = $this->randomRow - 1;
$col = $this->randomCol - 1;
while($row > 0 ) {
while($col > 0 ) {
$this->getBox($row, $col)->setPiece("X");
$col--;
}
$row--;
}
}
/**
* This method 9) will:
* 1) Create the diagonal array
* 2) Loop thew the array
* 3) Get the box position and place and X in the box as piece
* @return array
*/
public function relatedDiagonalBoxes() {
//$this->MarkRelatedHorizontalBoxes();
//$this->MarkRelatedVerticalBoxes();
$this->markRelatedDiagonalBoxes();
}
}
Ваша логика перебирает строки, затем перебирает столбцы внутри. Вы устанавливаете все части, полностью уменьшая столбцы, прежде чем переходить к следующему ряду.
Если вы хотите установить только один кусок на ряд, как вы бы хотели для уклона, вам нужно будет разбить его после размещения элемента в столбце.
while($row > 0) {
while($col > 0) {
$this->getBox($row, $col)->setPiece('X');
$col--;
break; // placing this break is the logic you are trying to achieve
// however defeats the purpose of the secondary while loop
}
$row--;
}
Что-то вроде следующего должно быть достаточно:
while($row > 0 && $col > 0) {
$this->getBox($row--, $col--)->setPiece('X');
}
Это так же, как если бы вы шли прямо по строке или столбцу, вам просто нужно уменьшить оба значения, чтобы получить наклон.
Других решений пока нет …