Проверка игрового поля «Морской бой» в формате JSONPhp

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 Проверка игрового поля «Морской бой» в формате JSON

Сообщение Anonymous »

Я создаю многопользовательскую игру «Морской бой», используя сервер Apache/PHP (да, я знаю, что Node подойдет для этого намного лучше, но я научусь этому позже). В любом случае, я нахожусь на этапе, когда оба игрока загружают свои игровые доски, чтобы начать игру. Хотя мой клиентский JavaScript, очевидно, правильно скомпилирует и проверит доски перед отправкой их на сервер, он все еще уязвим для мошенничества, поэтому сервер также должен дважды проверить. Однако на сервере скорость и эффективность решают все.

На данный момент мой сервер выполняет следующий процесс:
  • Сервер получает плату в виде многомерного массива в кодировке JSON через запрос AJAX.

    $board = json_decode($_REQUEST["board"]);
  • Сервер проверяет структуру переданных входных данных.

    $validate = array(gettype($board) == "array", count($board) == 10);
    for($i = 0; $i < count($board); $i++) {
    array_push($validate, count($board[$i]) == 10);
    for($ii = 0; $ii < count($board[$i]); $ii++) {
    array_push($validate, gettype($board[$i][$ii]) == "integer");
    }
    }
    if(in_array(0, $validate)) throwError();
  • В массиве цифры от нуля до пяти обозначают пустые плитки авианосца, линкора, крейсера, подводной лодки и эсминца соответственно. Я считаю необходимое количество каждого.

    $valueCount = array_count_values(array_merge($board[0], $board[1], $board[2], $board[3], $board[4], $board[5], $board[6], $board[7], $board[8], $board[9]));
    $template = array("0"=>83,"1"=>5, "2"=>4, "3"=>3, "4"=>3, "5"=>2);
    if($template != $valueCount) throwError();
  • Мне нужно убедиться, что плитки кораблей представляют собой только вертикальные или горизонтальные линии.

    $shipsValid = array(false, false, false, false, false);
    $transpose = array_map(null, $board[0], $board[1], $board[2], $board[3], $board[4], $board[5], $board[6], $board[7], $board[8], $board[9]);
    for($i = 0; $i < 9; $i++) {
    $temp1 = array_count_values($board[$i]);
    $temp2 = array_count_values($transpose[$i]);
    if($temp1["1"] == 5 || $temp2["1"] == 5) shipsValid[0] = true;
    if($temp1["2"] == 4 || $temp2["2"] == 4) shipsValid[1] = true;
    if($temp1["3"] == 3 || $temp2["3"] == 3) shipsValid[2] = true;
    if($temp1["4"] == 3 || $temp2["4"] == 3) shipsValid[3] = true;
    if($temp1["5"] == 2 || $temp2["5"] == 2) shipsValid[4] = true;
    }
    if(in_array(0, $shipsValid)) throwError();
  • Мне нужно обеспечить непрерывность движения кораблей без пробелов.

    ??????????????????????????
При достаточном объеме работы я мог бы выполнить пятый шаг, но многократно повторять все действия было бы крайне неэффективно. Итак, в заключение, как я могу сделать то, что я разработал, более эффективным и как выполнить последний шаг (5) для проверки загруженной платы?

Пример платы (действительной):

"[[0,1,1,1,1,1,0,0,0,0],
[0,0,0,0,0,0,0,2,0,0],
[0,0,0,0,0,0,0,2,0,0],
[0,0,0,0,0,0,0,2,0,0],
[0,3,3,3,0,0,0,2,0,0],
[0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0],
[0,0,5,0,0,0,4,4,4,0],
[0,0,5,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0]]"


Пример доски (недействителен по многим причинам):

"[[0,1,1,0,1,1,0,0,0,1],
[0,0,0,0,0,0,0,2,0,0],
[0,0,0,0,0,0,0,2,0,0],
[0,0,0,0,0,0,0,2,0,0],
[0,6,6,6,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,4,4,4,4,4],
[0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0]]"


Подробнее здесь: https://stackoverflow.com/questions/475 ... game-board
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»