Ich versuche, ein Spiel von Schlachtschiffen zu erstellen, in denen der Computer die Schlachtschiffe zufällig auf dem Brett legt.C++ Battleships Freiraum Funktion
Schlachtschiffe können nicht übereinander oder direkt nebeneinander platziert werden. Ich baute eine Funktion, um dies zu überprüfen und true zurückzugeben, wenn freier Speicherplatz verfügbar ist, aber aus irgendeinem Grund legt das Programm immer noch die Schiffe gegen die Regeln. Es passiert nicht jedes Mal, aber es passiert immer noch.
Hier ist die Funktion, die für freie Speicherplatz überprüft:
bool Game2::CheckPlace(int row, int column, DIRECTION direct, Battleship ship)//this function checks if a ship can be layed at the coordinates it recieved.
{
if (board[row][column] != '_' || board[row][column + 1] != '_' || board[row + 1][column + 1] != '_' || board[row + 1][column] != '_' || board[row - 1][column - 1] != '_' || board[row][column - 1] != '_' || board[row + 1][column - 1] != '_' || board[row + 1][column] != '_' || board[row + 1][column + 1] != '_')
return false;
if (direct == horizontal)//for horizontal direction
{
if (10 - column < ship.GetLength())//if there is no space left for the ship.
return false;
for (int i = 0; i < ship.GetLength(); ++i)//this loop creates a kind of a block that moves together to find surrounding ships.
{
if (row == 0 && column == 0 && (board[row + 1][column + i] != '_' || board[row + 1][column + 1 + i] != '_' || board[row][column + 1 + i] != '_'))//top left corner
return false;
if (row == 9 && column == 0 && (board[row - 1][column + i] != '_' || board[row - 1][column + 1 + i] != '_') || board[row][column + 1 + i] != '_')//bottom left corner
return false;
if (row > 0 && row < 9 && column > 0 && column < 9 && board[row][column + 1 + i] != '_' || board[row + 1][column + 1 + i] != '_' || board[row + 1][column + i] != '_' || board[row + 1][column - 1 + i] != '_' || board[row][column - 1 + i] != '_' || board[row - 1][column - 1 + i] != '_' || board[row - 1][column + i] != '_' || board[row - 1][column + 1 + i] != '_')//middle of the board
return false;
if (row == 0 && column > 0 && column < 9 && (board[row][column - 1 + i] != '_' || board[row][column + i] != '_' || board[row][column + 1 + i] != '_' || board[row + 1][column - 1 + i] != '_' || board[row + 1][column + i] != '_' || board[row + 1][column + 1 + i] != '_'))
return false;
if (row == 9 && column > 0 && column < 9 && (board[row - 1][column - 1 + i] != '_' || board[row - 1][column + i] != '_' || board[row - 1][column + 1 + i] != '_' || board[row][column - 1 + i] != '_' || board[row][column + i] != '_' || board[row][column + 1 + i] != '_'))
return false;
if (column = 0 && row > 0 && row < 9 && (board[row + 1][column + i] != '_' || board[row + 1][column + 1 + i] != '_' || board[row][column + 1 + i] != '_' || board[row - 1][column + i] != '_' || board[row - 1][column + 1 + i] != '_'))
return false;
}
return true;
}
if (direct == vertical)
{
if (10 - row < ship.GetLength())//if there is no space left for the ship.
return false;
for (int i = 0; i < ship.GetLength(); ++i)//this loop creates a kind of a block that moves together to find surrounding ships.
{
if (row == 0 && column == 0 && (board[row + i][column + 1] != '_' || board[row + 1 + i][column + 1] != '_' || board[row + 1 + i][column] != '_'))
return false;
if (row == 0 && column == 9 && (board[row + i][column - 1] != '_' || board[row + 1 + i][column - 1] != '_' || board[row + 1 + i][column] != '_'))
return false;
if (row == 0 && column > 0 && column < 9)
if (board[row + i][column + 1] != '_' || board[row + 1 + i][column + 1] != '_' || board[row + 1 + i][column] != '_' || board[row + i][column - 1] != '_' || board[row + 1 + i][column - 1] != '_')
return false;
if (column == 0 && row > 0 && row < 9 && (board[row + i][column + 1] != '_' || board[row + 1 + i][column + 1] != '_' || board[row + 1 + i][column] != '_' || board[row - 1 + i][column + 1] != '_' || board[row - 1 + i][column] != '_'))
return false;
if (column == 9 && row > 0 && row < 9 && (board[row + i][column - 1] != '_' || board[row + 1 + i][column - 1] != '_' || board[row + 1 + i][column] != '_' || board[row - 1 + i][column - 1] != '_' || board[row - 1 + i][column] != '_'))
return false;
if (row > 0 && row < 9 && column > 0 && column < 9)
if ((board[row + i][column + 1] != '_' || board[row + 1 + i][column + 1] != '_' || board[row + 1 + i][column] != '_' || board[row + i][column - 1] != '_' || board[row + 1 + i][column - 1] != '_' || board[row - 1 + i][column + 1] != '_' || board[row - 1 + i][column] != '_' || board[row - 1 + i][column - 1] != '_'))
return false;
}
return true;
}
}
Und hier ist ein Foto eines Beispiel Ausgabe:
Es klingt wie Sie lernen müssen, wie Verwenden Sie einen Debugger, um durch Ihren Code zu gehen. Mit einem guten Debugger können Sie Ihr Programm Zeile für Zeile ausführen und sehen, wo es von dem, was Sie erwarten, abweicht. Dies ist ein essentielles Werkzeug, wenn Sie programmieren wollen. Weiterführende Literatur: ** [Wie kleine Programme zu debuggen] (http://ericlippert.com/2014/03/05/how-to-debug-small-programs/) ** – NathanOliver
Warum verwenden Sie keine temporäre Karte Dies ist eine Kopie der Originalkarte. Füge das Schlachtschiff hinzu, indem du jedes Element mit tmp_board [x] [y] + = '_' zum temp-board hinzufügst und dann nachprüfst, ob jeder Wert des Schlachtschiffes nicht '_' ist. – Lucian
'if (column = 0' sollte' == 'sein. Ein vernünftiger Compiler würde dies mit aktivierten Warnungen warnen. – interjay