Проблема с проверкой условия для массива
Процедурный морской бой. Поле - линия 1*10. Корабль любого возможного размера.
import java.util.Scanner;
public class Seabat {
static int x;
public static void main(String[] args) {
doGame();
}
static void doGame() {
final int FIELD_LENGTH = 10;
char[] cells = new char[FIELD_LENGTH];
for (int i = 0; i < cells.length; i++) {
cells[i] = '.';
}
double SIZE = (1 + (Math.random() * (cells.length - 1))); //размер корабля
switch ((int) SIZE) {
case 1:
x = (int) (SIZE + (Math.random() * (cells.length - SIZE)));
cells[x] = 'X';
break;
case 2:
x = (int) (SIZE / 2 + (Math.random() * (cells.length - SIZE / 2)));
cells[x] = 'X';
cells[x + 1] = 'X';
break;
case 3:
x = (int) (Math.ceil(SIZE / 2) + (Math.random() * (cells.length - SIZE)));
cells[x] = 'X';
cells[x + 1] = 'X';
cells[x - 1] = 'X';
case 4:
x = (int) (SIZE / 2 + (Math.random() * (cells.length - SIZE)));
cells[x] = 'X';
cells[x + 1] = 'X';
cells[x - 1] = 'X';
cells[x + 2] = 'X';
case 5:
x = (int) (Math.ceil(SIZE / 2) + (Math.random() * (cells.length - SIZE)));
cells[x] = 'X';
cells[x + 1] = 'X';
cells[x - 1] = 'X';
cells[x + 2] = 'X';
cells[x - 2] = 'X';
case 6:
x = (int) (SIZE / 2 + (Math.random() * (cells.length - SIZE)));
cells[x] = 'X';
cells[x + 1] = 'X';
cells[x - 1] = 'X';
cells[x + 2] = 'X';
cells[x - 2] = 'X';
cells[x + 3] = 'X';
case 7:
x = (int) (Math.ceil(SIZE / 2) + (Math.random() * (cells.length - SIZE)));
cells[x] = 'X';
cells[x + 1] = 'X';
cells[x - 1] = 'X';
cells[x + 2] = 'X';
cells[x - 2] = 'X';
cells[x + 3] = 'X';
cells[x - 3] = 'X';
case 8:
x = (int) (SIZE / 2 + (Math.random() * (cells.length - SIZE)));
cells[x] = 'X';
cells[x + 1] = 'X';
cells[x - 1] = 'X';
cells[x + 2] = 'X';
cells[x - 2] = 'X';
cells[x + 3] = 'X';
cells[x - 3] = 'X';
cells[x + 4] = 'X';
case 9:
x = (int) (Math.ceil(SIZE / 2) + (Math.random() * (cells.length - SIZE)));
cells[x] = 'X';
cells[x + 1] = 'X';
cells[x - 1] = 'X';
cells[x + 2] = 'X';
cells[x - 2] = 'X';
cells[x + 3] = 'X';
cells[x + 4] = 'X';
cells[x - 4] = 'X';
cells[x + 5] = 'X';
case 10:
for (int i = 0; i < 10; i++) {
cells[i] = 'X';
}
}
Scanner scanner = new Scanner(System.in);
do {
System.out.println(cells);
System.out.println("Стреляйте:");
int shoot = 0;
while (true) {
if (scanner.hasNextInt()) {
shoot = scanner.nextInt();
break;
} else {
String temp = scanner.nextLine();
}
}
System.out.println("Ваш выстрел:" + shoot);
switch (cells[shoot - 1]) {
case '.':
System.out.println("Промах");
cells[shoot - 1] = '*';
break;
case 'X':
System.out.println("Попадание");
cells[shoot - 1] = '#';
break;
case '*':
System.out.println("Уже было");
break;
}
} while ((cells[x] == 'X')); //как заместо x указать МАССИВ координат?
System.out.println("Последний корабль потоплен.");
System.out.println("Вы победили.");
}
}
Вопрос - Окончание цикла регулируется условием проверки прострела всех координат поля.
while ((cells[x] == 'X'));
Как проверить все элементы массива?
Ответы (2 шт):
Автор решения: Дмитрий
→ Ссылка
Ладно, пусть будет процедурный код, но все таки KISS никто не отменял...
import java.util.*;
public class Seabat {
private final static Random RND = new Random();
private final static String[] FIELD = new String[10];
public static void main(String[] args) {
for (int i = 0; i < FIELD.length; i++) FIELD[i] = ".";
int rnd1 = random(0, FIELD.length);
for (int i = rnd1; i < Math.min(rnd1 + random(1, FIELD.length), FIELD.length); i++) FIELD[i] = "X";
Scanner scanner = new Scanner(System.in);
do {
try {
System.out.println("Стреляйте : ");
int shoot = Integer.valueOf(scanner.nextLine()) - 1;
switch (FIELD[shoot]) {
case ".": shoot("Промах", shoot, "*"); break;
case "X": shoot("Попадание", shoot, "#"); break;
case "*": shoot("Уже было", shoot, "*"); break;
}
} catch (NumberFormatException | ArrayIndexOutOfBoundsException e) {
print("Некорректный ход!");
}
} while (Arrays.stream(FIELD).anyMatch(element -> element.equals("X")));
print("Последний корабль потоплен.", "Вы победили.");
}
private static void shoot(String message, int shoot, String symbol) {
print("Ваш выстрел : " + shoot , message);
FIELD[shoot] = symbol;
for (String cell : FIELD) System.out.print(cell);
System.out.println();
}
private static int random(int min, int max) {
return RND.nextInt(max - min) + min;
}
private static void print(Object ... args) {
for (Object arg : args) System.out.println(arg);
}
}
Автор решения: Eugene_Venev
→ Ссылка
public class Seabat {
static int x;
public static voi
d main(String[] args) {
doGame();
}
static void doGame() {
final int FIELD_LENGTH = 10;
char[] cells = new char[FIELD_LENGTH];
for (int i = 0; i < cells.length; i++) {
cells[i] = '.';
}
/**Выстраивание клеток корабля происходит по предложенному вами шаблону - просто поместить его в линии в одном из направлений.
* Направлением по умолчанию взято слева-направо
* Размер случайный. В пределах случайного размера взято случайное местоположжение.
* Т.е. раньше корабль "обрастал" от центральной клетки, теперь от вдущей.
*/
int SIZE = (int) (1 + (Math.random() * (cells.length - 1))); //размер корабля
System.out.println("Size " + SIZE);
int PLACE = (int) (Math.random() * (FIELD_LENGTH - SIZE)); //размер поля для размещения 1 клетки корабля
for (int i = PLACE; i < PLACE + SIZE; i++) {
cells[i] = 'X';
}
Scanner scanner = new Scanner(System.in);
do {
System.out.println(cells);
System.out.println("Стреляйте:");
int shoot = 0;
while (true) {
if (scanner.hasNextInt()) {
shoot = scanner.nextInt();
break;
} else {
scanner.nextLine();
}
}
System.out.println("Ваш выстрел:" + shoot);
switch (cells[shoot - 1]) {
case '.':
System.out.println("Промах");
System.out.println();
cells[shoot - 1] = '*';
break;
case 'X':
System.out.println("Попадание");
System.out.println();
cells[shoot - 1] = '#';
break;
case '*':
System.out.println("Уже было");
System.out.println();
break;
}
} while (checkCells(cells));
System.out.println("Последний корабль потоплен.");
System.out.println("Вы победили.");
}
static boolean checkCells(char[] cells) {
for (int i = 0; i < cells.length; i++) {
if (cells[i] == 'X') {
return true;
}
}
return false;
}
}