Проблема с проверкой условия для массива

Процедурный морской бой. Поле - линия 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;
}

}

→ Ссылка