PHP перемещает элементы проверки внутри многомерного массива, часть 2

У меня уже есть части, нанесенные на карту в массиве, и он отлично печатает

    $board = array(
             array('1','rs','1','rs','1','rs','1','rs'),
             array('rs','1','rs','1','rs','1','rs','1'),
             array('1','rs','1','rs','1','rs','1','rs'),
             array('rs','bs','rs','bs','rs','bs','rs','bs'),
             array('bs','rs','bs','rs','bs','rs','bs','rs'),
             array('2','bs','2','bs','2','bs','2','bs'),
             array('bs','2','bs','2','bs','2','bs','2'),
             array('2','bs','2','bs','2','bs','2','bs')
              );

1 = черные фигуры
2 = красные фигуры
rs = красный квадрат
bs = черный квадрат

этот код анализирует ввод игрока: пример FROM F2 в координаты (0,0)

function parseSquareFrom($square) {
    if (strlen($square) != 2) {
        return FALSE;
    }

    $coords = array(ord('A') - ord($square[0]), $square[1] - 1);

    // Perform bounds-checking.
    if ($coords[0] < 0 || $coords[0] > 7 || $coords[1] < 0 || $coords[1] > 7) {
        return FALSE;
    }

    return $coords;
}

Я повторил ту же функцию для ввода TO (куда игрок хочет переместить фигуру).

мой вопрос в том, что этот следующий код является допустимым способом перемещения с функциями, указанными выше.

    $board[$coords1[0]-1][$coords1[1]+1] = $board[$coords[0]][$coords[1]];
    $board[$coords[0]][$coords[1]] = 0;

    //eating action
    $board[$coords1[0]][$coords1[1]] = 0;
    $board[$coords1[0]-2][$coords1[1]+2] = $board[$coords[0]][$coords[1]];

$way = ($_POST['way'] === 'up')? 1:-1;

$way = ($_POST['way'] === 'down')? -1:+1;



    //if player is 'up' then the value of $way is 1 so
      $board[$x+(-1*$way)][$y+(1*$way)] = $board[$coords[0]][$coords[1]]; // position 2,2 becomes 1,3
   //if player is not 'up' then the value of $way is -1 so
      $board[$x+(-1*$way)][$y+(1*$way)] = $board[$coords[0]][$coords[1]]; // position 2,2 becomes 3,1

Я планирую иметь функцию для обновления движений плитки на экране, чтобы фигура двигалась по мере того, как она выделяла фигуру при переходе к следующему квадрату.

это использует сериализацию в файл для хранения стартовых позиций, движений, позиций королей и ферзей


person hgbso    schedule 18.11.2010    source источник
comment
Согласовано. Вы принимаете ответ, нажимая на стрелку под оценкой и стрелки слева от ответа. Вы можете сделать это только для одного ответа. Вы также можете проголосовать за те ответы, которые вы считаете полезными, нажав на стрелку вверх рядом с ответом.   -  person Juan Cortés    schedule 19.11.2010
comment
Хорошо, я согласен с тем, что я не голосовал за кого-либо, я сожалею об этом, но я неоднократно говорил спасибо, и я извиняюсь перед всеми, кого я раздражал этими вопросами.   -  person hgbso    schedule 19.11.2010
comment
как бы я обновлял доску, когда есть движение   -  person hgbso    schedule 19.11.2010


Ответы (2)


Я собираюсь предположить, что $coords является переменной $_POST, как было предложено в первой части этого вопроса. Если это так, первая часть вашего кода верна:

$board[$coords1[0]-1][$coords1[1]+1] = $board[$coords[0]][$coords[1]];
$board[$coords[0]][$coords[1]] = 0;

Это перемещает фигуру по диагонали на один шаг вверх-вправо по доске. Вторая часть, с другой стороны, пропускает фактическое действие «поедания». Если только место, указанное пользователем, не является тем, где находится вражеская фигура. В этом случае ваш код будет работать.


Что касается проверки границ, которую вы делаете, вы не являетесь пуленепробиваемым, так как добавление 2 в движение еды, в то время как часть находится рядом с границей, приведет к тому, что ваш код попытается поместить часть за пределы доски. . Таким образом, вы можете проверить границы, в зависимости от хода, поэтому, если ход является стандартным диагональным, вы должны проверить, что конечная позиция находится в пределах, а не начальная, поскольку вы предполагаете, что фигура раньше находилась в правильном положении.

person Juan Cortés    schedule 18.11.2010
comment
да $_POST будет из переменной $square будет пользовательским вводом в форму From в эту функцию - person hgbso; 19.11.2010
comment
с точки зрения пользователя вы имеете в виду переменную $way, которая смотрит, какой игрок движется сверху вниз, а какой игрок движется снизу вверх, да, я попытаюсь реализовать этот код после того, как он заработает. - person hgbso; 19.11.2010
comment
@hgbso: Да, я имею в виду переменную $way, которую я предложил, я рад, что вы ее рассматриваете. - person Juan Cortés; 19.11.2010
comment
но дело в том, что есть checkers.html, где пользователи вводят свои имена :::: Player 1 Name:‹input type=text name=p1name/›‹br /› Player 2 Name:‹input type=text name=p2name / ›‹br /› введите туда значения - person hgbso; 19.11.2010
comment
добавить скрытый ввод для формы каждого игрока, который содержит значение $way var. Например <input type='hidden' id='way' value='down'/> - person Juan Cortés; 19.11.2010
comment
‹тип ввода=текстовое имя=тип p1name=скрытый идентификатор=значение пути=вниз/› или ‹тип ввода=скрытый идентификатор=значение пути=вниз/› - person hgbso; 19.11.2010
comment
вы используете код, который я использую, я поместил его в функцию для обработки движения с помощью функций синтаксического анализа для: FROM и TO я добавляю $coords в значения переменной $way - person hgbso; 19.11.2010
comment
в этой части -- $way = ($_POST['player'] === 'up')? 1:-1; -- что мне вставить там, где написано "игрок", или оставить так - person hgbso; 20.11.2010
comment
Я должен использовать операторы if с переменной $way - person hgbso; 23.11.2010
comment
Нет, вы не должны. Код, который я вам дал, заменяет if statements, он делает следующее. Присвойте значение $way, если переменная сообщения «вверх», присвойте ей 1, если нет, присвойте ей -1 - person Juan Cortés; 23.11.2010
comment
черные и красные части были сопоставлены, я знаю, что есть функции массива, где вы можете сдвигать или нажимать, будут ли они работать для обновления доски - person hgbso; 27.11.2010

Я думаю, у вас есть несколько проблем

$board[$coords1[0]-1][$coords1[1]+1] = $board[$coords[0]][$coords[1]];

если $coords[1] == 7 (что кажется разрешенным), то $coords[1]+1 == 8, что выходит за пределы. Не говоря уже о координатах +/- 2, которые мы увидим позже.

Вы, вероятно, не хотите, чтобы эти «bs» / «rs» хранились в вашем хранилище, все это можно предположить.

$getSquareColor = function($x,$y){return ($x+$y)/2 == 1 ? 'red' : 'black';}  //or better yet, const or enum


function getSquareColor($x, $y)  //alternatively
{
    if ( ($x+$y) % 2 == 0) return 'black';
    else return 'red';
}

ps - если вы отбросите эти знаки доллара, функция так же хороша в javascript

person jon_darkstar    schedule 18.11.2010
comment
«bs», «rs» — это значения изображений для черных и красных квадратов, отображаемых в массив доски из другого массива, называемого частями, точно так же, как черные и красные фигуры, или есть другой способ создать отображение доски, которое имеет клетчатый узор из красные и черные квадраты - person hgbso; 19.11.2010
comment
Я понимаю, как это удобно для изображений, но это немного усложняет запись движений. я думаю, вы могли бы пойти в любом случае. ваша клиентская сторона получает массив или вы визуализируете все через php и просто отправляете изображение? предоставление клиентской стороне массива позволит вам запретить пользователю выбирать недопустимые ходы без отправки запроса, так что это хорошо - person jon_darkstar; 19.11.2010
comment
я пытаюсь использовать сериализацию для хранения позиций в текстовом файле - person hgbso; 19.11.2010
comment
почему текстовый файл? я не вижу необходимости в файловом вводе/выводе. вы не можете передать это javascript как json или что-то в этом роде? или к шаблонизатору как есть? - person jon_darkstar; 19.11.2010
comment
или это текстовый файл для истории? Я думаю, это не плохая идея, но ты действительно собираешься получать по одному после каждого хода? - person jon_darkstar; 19.11.2010
comment
я использую кодировку json с сериализацией в текстовый файл, и я не знаю ни одного javascript, какого-то С++, С# и php - person hgbso; 19.11.2010
comment
так вы планируете сделать так, чтобы состояние застревало между запросами страниц с текстовым файлом? это сработает, но вы, вероятно, предпочтете просто передавать состояние туда и обратно со стороны сервера и клиента. клиент может извлечь выгоду из состояния другими способами, такими как принудительное выполнение допустимых ходов. - person jon_darkstar; 19.11.2010
comment
нет, это излишество, и даже не подходит для дизайна. МОЖЕТ БЫТЬ для незавершенных игр, длящихся дольше, чем сессия. - person jon_darkstar; 19.11.2010
comment
Я знаю, что есть другие языки, которые могут помочь с этим, такие как javascript, как вы сказали, и ajax, но я только начал изучать PHP месяц назад. - person hgbso; 19.11.2010
comment
вам будет трудно делать все на сервере с PHP, я посмотрю на javascript - person jon_darkstar; 19.11.2010
comment
ваша функция выводит значения красного и черного в $x и $y - person hgbso; 19.11.2010
comment
ему не хватало сравнения, но что вы подразумеваете под выводом? координаты определяют цвет квадрата - person jon_darkstar; 19.11.2010
comment
эта часть $coords[1]+1 == 8 должна быть $coords[1]+0 == 8 - person hgbso; 19.11.2010
comment
хм? это был не код, я просто объяснил, что когда $coords[1] равно 7, вы выйдете за пределы, когда добавите к нему 1 (или 2). это именно то, что я хотел сказать - person jon_darkstar; 19.11.2010
comment
хорошо, извините, мой плохой, но мне нужно изменить этот код, чтобы он вышел за пределы - person hgbso; 19.11.2010
comment
у вас есть много вещей, которые нужно учитывать, но да, вам нужно проверять границы каким-то другим/другим/дополнительным способом. это своего рода рост из этого вопроса, и я не могу остаться. жаль, удачи! PS - спасибо, что показали мне "ord", я никогда им не пользовался - person jon_darkstar; 19.11.2010
comment
нет проблем, спасибо за помощь для части ord, кто-то показал мне это в другом из моих сообщений --- функция ord() принимает строку и возвращает эквивалентное значение ASCII. - person hgbso; 19.11.2010
comment
поможет ли сеанс в передаче состояния туда и обратно или это невозможно для PHP - person hgbso; 19.11.2010
comment
в этом нет ничего плохого. PHP использует сеанс не лучше и не хуже, чем любой другой язык, это не особенность какого-либо языка как такового. - person jon_darkstar; 19.11.2010
comment
я даю каждому новому сеансу идентификатор, специфичный для этого сеанса, поэтому, если новая игра запускает новый сеанс, а последний сеанс отправляет счет, кто выиграл, кто проиграл | в таблицу mysql для ведения счета, после чего этот сеанс уничтожается - person hgbso; 19.11.2010