Validieren Sie ein JSON-codiertes Battleship-SpielbrettPhp

PHP-Programmierer chatten hier
Anonymous
 Validieren Sie ein JSON-codiertes Battleship-Spielbrett

Post by Anonymous »

Ich erstelle ein Multiplayer-Battleship-Spiel mit einem Apache/PHP-Server (ja, ich weiß, dass Node dafür viel besser wäre, aber ich werde es später lernen). Wie auch immer, ich bin an dem Punkt angelangt, an dem beide Spieler ihre Spielbretter hochladen, um das Spiel zu starten. Während mein clientseitiges JavaScript die Boards natürlich ordnungsgemäß kompiliert und validiert, bevor es sie an den Server sendet, ist dies immer noch anfällig für Betrug, sodass der Server dies ebenfalls überprüfen muss. Auf dem Server kommt es jedoch vor allem auf Geschwindigkeit und Effizienz an.

Derzeit folgt mein Server folgendem Prozess:
  • Der Server empfängt das Board als JSON-codiertes mehrdimensionales Array über eine AJAX-Anfrage.

    Code: Select all

    $board = json_decode($_REQUEST["board"]);
    
  • Server validiert die Struktur der übergebenen Eingabe.

    Code: Select all

    $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();
    
  • Im Array stehen die Zahlen null bis fünf für Leerzeichen, Flugzeugträger-, Schlachtschiff-, Kreuzer-, U-Boot- und Zerstörer-Kacheln. Ich zähle jeweils die richtige Menge.

    Code: Select all

     $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();
    
  • Ich muss sicherstellen, dass Schiffskacheln nur vertikale oder horizontale Linien sind.

    Code: Select all

     $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();
    
  • Ich muss sicherstellen, dass die Schiffe durchgehend und ohne Lücken sind.

    Code: Select all

    ??????????????????????????
    
Mit genügend Arbeit hätte ich Schritt fünf abschließen können, aber es wäre äußerst ineffizient gewesen, alles wiederholt zu durchlaufen. Abschließend: Wie kann ich das, was ich entworfen habe, effizienter machen und wie schließe ich den letzten Schritt (5) zur Validierung des hochgeladenen Boards ab?

Beispielboard (gültig):

Code: Select all

    "[[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]]"
Beispielboard (aus vielen Gründen ungültig):

Code: Select all

    "[[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]]"

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post