Place Ship Into Battleship Game Board

Description: These functions look for a random place on a typical 10 x 10 Battleship game board to place ships, checks to make sure it won't collide with other placed ships and then sets the ship into the board.
Tested Platform: PHP 7+
Language: PHP
// Place the ship onto the board. 
// Typicall call would be placeShip(board, 5, "C") for a five spot carrier ship.
function placeShip(&$board, $shipSize, $shipMarker) {
    $shipPlacement = findPlaceOnBoard($board, $shipSize);
        
    while (!checkForSafePlacement($board, $shipSize, $shipPlacement["start_x"], $shipPlacement["start_y"], $shipPlacement["orientation"])) {
        $shipPlacement = findPlaceOnBoard($board, $shipSize);
    }
        
    $orientation = $shipPlacement["orientation"];
    $startY = $shipPlacement["start_y"];
    $startX = $shipPlacement["start_x"];
        
    if ($orientation == 0) {
        for ($i = 0; $i < $shipSize; $i++) {
            $board[$startY][$startX + $i] = $shipMarker;
        }
    }
    else {
        for ($i = 0; $i < $shipSize; $i++) {
            $board[$startY + $i][$startX] = $shipMarker;
        }
    }
}
    
    
// Look at the board and find a random place to place a ship.
// Return the starting X,Y and orientation for the ship in an array.
function findPlaceOnBoard(&$board, $shipSize) {
    $orientation = rand(0,1);
        
    $maxStartCoord = (count($board[0]) - $shipSize);
        
    if ($orientation == 0) {
        // Horizontal
        $startX = rand(0,$maxStartCoord);
        $startY = rand(0,count($board) - 1);
    }
    else {
        // Vertical
        $startX = rand(0,count($board[0]) - 1);
        $startY = rand(0,$maxStartCoord);
    }
        
    return array("start_x" => $startX, "start_y" => $startY, "orientation" => $orientation);
}
    
    
// Check to see if it is safe to place the ship at starting X,Y with given orientation
// Here "W" is a marker for open water. Use whatever marker determines open water.
// Returns true if it is safe to place the ship at the specified location with given orientation.
function checkForSafePlacement(&$board, $shipSize, $startX, $startY, $orientation) {
    if ($orientation == 0) {
        for ($i = 0; $i < $shipSize; $i++) {
            if ($board[$startY][$startX + $i] != "W") { return false; }
        }
    }
    else {
        for ($i = 0; $i < $shipSize; $i++) {
            if ($board[$startY + $i][$startX] != "W") { return false; }
        }
    }
    return true;
}

Posted: March 18, 2023

Return to the snippets listing