#java #arrays #multidimensional-array #coordinates
Вопрос:
Мне нужно написать программу, которая принимает вводимые пользователем данные о количестве кораблей на борту линкоров и размере доски (которая всегда квадратная — поэтому, если размер = 5, то доска 5×5). Затем программа берет доску ряд за рядом и помещает ее в двумерный массив.
Где я застрял, так это в том, что программа должна проверить правильность введенной пользователем платы. Это как с точки зрения того, что лодкам не разрешается прикасаться (даже по диагонали), так и с точки зрения правильного количества лодок. Затем эта программа возвращает заявление, в котором либо говорится, что плата верна, либо нет.
Это код, который у меня есть до сих пор:
// This checks whether the boat is diagonal, horizontal or just length 1 static boolean checkType(int[][] board, int size) { for (int y = 0; y lt; 5; y ) { for (int x = 0; x lt; 5; x ) { if (board[x][y] == 1) { if (board[x 1][y] == 1) { horizontalBoat(board, size, x, y); } else if (board[x][y 1] == 1) { verticalBoat(board, size, x, y); } else singleBoat(board, size, x, y); } } } } /* Then for example the boat is horizontal, it passes the initial point through this method. What I have tried to do is for the for loop to continue until it has passed through all the points that the boat is at. Then it passes values into the second for loop which basically tries to check that the square around the ship on the board is all 0s (as boats are also not allowed to touch diagonally) - hence why I have passed the position before the first 1 and the position after the last 1 of the boat into it. However for some reason the for statement won't loop. */ static boolean horizontalBoat(int[][] board, int size, int x, int y) { for (int c = x; c lt; size; ) { if (board[c][y] == 1) { c ; } else { int lastPositionX = c; if (((board[x - 1][y]) == 0) amp;amp; ((board[x 1][y]) == 0)) { for (int firstPositionX = (x - 1); firstPositionX lt;= lastPositionX; firstPositionX ) { if ((board[firstPositionX][y 1] == 0) amp;amp; (board[firstPositionX][y - 1] == 0)){ return true; } } } } } return false; } // For context, this part of the code stores the board through user input. This part works. public static void main(String[] args) { int ships_num; Scanner sc; int size; int[][] board; sc = new Scanner(System.in); do { System.out.println("Enter the number of boats. The max is 10 "); ships_num = sc.nextInt(); } while (ships_num gt; 10); System.out.println("Number of boats " ships_num); do { System.out.println("Enter the size of the board. The max is 20"); size = sc.nextInt(); } while (size gt; 20); System.out.println("El tamano del tablero: " size); board = new int[size][size]; for (int y = 0; y lt; size; y ) { System.out.println("Enter the values of each row of the board, starting with" "the first. Enter 1 to represent a ship and 0 to represent water."); String temp = sc.next(); for (int x = 0; x lt; size; x ) { board[x][y] = temp.charAt(x); } }
Кроме того, я хочу попытаться создать int ships_num_check, который будет добавлять его каждый раз, когда лодка будет закончена, чтобы в конце я мог сравнить это с количеством лодок, которое должно быть. Однако я не уверен, как я могу сделать это с помощью разных методов из-за области применения?
Комментарии:
1. Отложите опубликованный код в сторону и создайте тестовую программу, в которой вы жестко закодируете допустимую сетку ввода и недопустимую сетку ввода. Как только ваша логика проверки заработает, добавьте
Scanner
код обратно. Разбейте свой код на небольшие (10 строк или меньше) проверяемые методы. Одним из подходов может быть однократное сканирование входной сетки и создание массива точек координат судна. Затем вы можете обработать массив координат, ища корабли, которые соприкасаются.2. @GilbertLeBlanc Привет, Гилберт, извини, я новичок в программировании, но я не совсем уверен, что ты имеешь в виду под этим. Могли бы вы показать пример в коде? Я борюсь с тем, как я могу заставить код распознавать, что такое лодка и что такое одна лодка, соприкасающаяся с другой. Спасибо за вашу помощь
Ответ №1:
Вот один из способов создания тестовой программы. Этот код основан на следующих предположениях:
- Корабль может быть любой длины от единицы до ширины и высоты входной сетки.
- Корабль может располагаться горизонтально, вертикально или по диагонали.
- Никакие два корабля не могут соприкасаться по горизонтали, вертикали или диагонали.
Результат должен быть:
true false
Вот код испытательного стенда. Не стесняйтесь добавлять столько входных сеток, сколько захотите, чтобы протестировать свой код:
public class BattleshipTesting { public static void main(String[] args) { // Valid grid int numberOfShips1 = 4; int[][] inputGrid1 = { { 0, 0, 1, 1, 1, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 }, { 0, 1, 0, 0, 0, 0, 0 }, { 0, 0, 1, 0, 0, 1, 0 }, { 0, 0, 0, 0, 0, 1, 0 }, { 0, 1, 1, 1, 0, 1, 0 }, { 0, 0, 0, 0, 0, 1, 0 } }; System.out.println(verifyGrid(numberOfShips1, inputGrid1)); // Invalid grid int numberOfShips2 = 5; int[][] inputGrid2 = { { 0, 0, 1, 1, 1, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 }, { 0, 1, 0, 0, 0, 0, 0 }, { 1, 0, 1, 0, 0, 1, 0 }, { 1, 0, 0, 0, 0, 1, 0 }, { 0, 1, 1, 1, 0, 1, 0 }, { 0, 0, 0, 0, 0, 1, 0 } }; System.out.println(verifyGrid(numberOfShips2, inputGrid2)); } public static boolean verifyGrid(int numberOfShips, int[][] inputGrid) { // Here's where your testing logic goes return true; } }
Когда у вас будет рабочий verifyGrid
метод, вы сможете добавить свой Scanner
код обратно.
Разбейте свой код на небольшие (10 строк или меньше) проверяемые методы.