Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
1 / 1 / 0
Регистрация: 13.08.2016
Сообщений: 18
1

Не получается разместить корабли в морском бое

27.08.2017, 23:03. Показов 1764. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, пишу свой вариант консольной версии морского боя на java. При добавлении на игровое поле 2-ух кораблей периодически вылетает исключение java.lang.ArrayIndexOutOfBoundsException. Ссылка на ошибку, а при добавлении 3-ёх кораблей исключение выпадает постоянно. Так понимаю в классе Cell, в методе coincideShip(Ship ship), при проверке ячеек на занятость происходит выход за пределы массива, подскажите пожалуйста, что можно предпринять для решения проблемы ссылка на исходники.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.08.2017, 23:03
Ответы с готовыми решениями:

Нужно чтобы ИИ в морском бое старался потопить корабли, а подтопленные корабли обводил точками
Нужно написать морской бой, но застрял на написании ИИ противника. Нужно чтобы ИИ старался потопить...

Корабли в Морском бое
Здравствуйте! Я пишу курсач на тему "Морской бой", и препод нагрузил, чтобы вместо кораблей-клеток,...

Поле в морском бое
В консоли раньше при написание морского боя использовал двумерный массив. А что лучше использовать...

Обратный огонь в морском бое
здравствуйте! я только недавно попробовал писать на WinForms программы и еще не очень в этом...

3
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
28.08.2017, 00:04 2
Включай дебаггер, смотри на индексы, когда по массивам итерируешься
0
164 / 170 / 139
Регистрация: 28.11.2016
Сообщений: 301
28.08.2017, 08:15 3
Лучший ответ Сообщение было отмечено pushtun как решение

Решение

Class Runner
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
public class Cell {
 
    static final int SIZE = 10;
    char cell[][] = new char[SIZE][SIZE];
    static final int PATTERN_DECK[] = {4, 3};//,3, 2, 2, 2, 1, 1, 1, 1};  // Как только ставлю колличество кораблей большее 2 игра не запускается
    Ship ships[] = new Ship[PATTERN_DECK.length];
 
    void fillField() {
        for (int i = 0; i < SIZE; i++) {
            for (int j = 0; j < SIZE; j++) {
                cell[i][j] = '~';
            }
        }
    }
 
    void viewField() {
        System.out.println();
        for (int i = 0; i < SIZE; i++) {
            for (int j = 0; j < SIZE; j++) {
                System.out.print(cell[i][j] + " ");
            }
            System.out.println();
        }
        System.out.println();
    }
 
    void initShip() {
        for (int i = 0; i < PATTERN_DECK.length; i++) {
            Ship tmpShip = new Ship(PATTERN_DECK[i]);//здесь можно будет переменную добавить отвечающцю за вертикальный или горизонтальный корабль
            boolean isIntersect;
 
            do {
                isIntersect = false;
                tmpShip.initWithRandom();
                for (int j = 0; j < i; j++) {
                    if (coincideShip(tmpShip)) {
                        isIntersect = true;
                    }
                }
            } while (isIntersect);
 
            drawnShip(tmpShip);
            ships[i] = tmpShip;
        }
    }
 
 
    boolean coincideShip(Ship ship) {
        System.out.println(ship.positionX + " " + ship.positionY + " " + ship.size);
        for (int i = 0; i < ship.size; i++) {
            for (int dy = -1; dy < 2; dy++) {
                for (int dx = -1; dx < 2; dx++) {
                    if (ship.positionY + dy < 0 || ship.positionY + dy >= SIZE ||
                            ship.positionX + dx + i < 0 || ship.positionX + dx + i >= SIZE) {
                        continue;
                    }
                    if (cell[ship.positionY + dy][ship.positionX + dx + i] == '#') {
                        return true;
                    }
                }
            }
        }
        return false;
    }
 
    void drawnShip(Ship tmpShip) {
        for (int i = 0; i < tmpShip.size; i++) {
            cell[tmpShip.positionY][tmpShip.positionX + i] = '#';
        }
 
    }
 
    void checkShoot(int shootY, int shootX) {
        switch (cell[shootY][shootX]) {
            case '~':
                System.out.println("Промах, пробуй ещё");
                cell[shootY][shootX] = '*';
                break;
            case '#':
                cell[shootY][shootX] = 'X';
                hitShip(shootY, shootX);
                break;
            case 'X':
                System.out.println("Сюда уже стрелял");
                break;
            case '*':
                System.out.println("Сюда уже стрелял");
                break;
        }
    }
 
    void hitShip(int shootY, int shootX) {
        for (Ship ship : ships) {
            if (ship.shipArr[shootY][shootX] == '#') {
                ship.lives--;
                if (ship.lives == 0) {
                    System.out.println("Корабль потоплен");
                } else {
                    System.out.println("Ранил");
                }
            }
 
        }
    }
 
    boolean isNotGameOver() {
        for (int i = 0; i < SIZE; i++) {
            for (int j = 0; j < SIZE; j++) {
                if (cell[i][j] == '#') {
                    return true;
                }
            }
        }
        return false;
    }
}

Смотрите код. Метод coincideShip() установлен ограничитель на размер массива.
1
1 / 1 / 0
Регистрация: 13.08.2016
Сообщений: 18
28.08.2017, 20:31  [ТС] 4
Цитата Сообщение от v777779 Посмотреть сообщение
Смотрите код. Метод coincideShip() установлен ограничитель на размер массива.
Спасибо огромнейшее, корабли разместились с первого раза. Я уже собирался в исключениях копаться, а тут всё гораздо проще. Ещё раз спасибо.
0
28.08.2017, 20:31
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.08.2017, 20:31
Помогаю со студенческими работами здесь

Быстрая рандомная расстановка в морском бое
Посоветуйте, как быстро и рандомно расставить корабли в морском бое. поле 10x10 Добавлено через...

Поможете идеей общения игроков в морском бое
Поле состоит из JButton но проблема в том что при нажатии на кнопку, сервер идет overflow, если...

Не получается разместить дивы
Вчера полдня убил на одну проблемку. И так, есть вот такая вёрстка: &lt;!DOCTYPE HTML PUBLIC...

Не получается разместить список горизонтально
Сайт Wordpress Woocommerce В шаблоне по умолчанию идет отображение категорий в столбец, при чем,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru