Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
 Аватар для Cold As Ice
0 / 0 / 0
Регистрация: 11.02.2017
Сообщений: 16

Морской бой

15.11.2018, 20:57. Показов 1407. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!

Могли бы подсказать, пожалуйста!
Пишу морской бой и возникла проблема, проверки расстоновки кораблей. - классика, поле 10x10
На данный момент реализовано по типу так:
То есть получаем корабль, формируем рандомную точку (x, y) - для старта, выбираем 1 из 4 возможных путей, и в зависимости от пройденной проверки, будем добавлять корабль на поле или вызывать снова данный метод.
Проверка, та что есть что-то рисует, но не совсем корректна составлена, так как еще есть стенки. Погуглил нашел много информации, но не особо понимаю как применить на конкретно мой случай с указанными данными:

Java
1
2
3
4
5
  
int shipSize = ship.getSize();
int way = randomWayForInputShip();
int xCord = getRandomNumber(0, 9);
int yCord = getRandomNumber(0, 9);
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
        boolean isPutted = false;
        while (!isPutted) {
 
    
                try {
                    if (way == 1) {
                        for (int i = -1; i <= shipSize; i++) {
                            if (getSquare(xCord + i - shipSize + 2, yCord - 1) == Designations.W &&
                                    getSquare(xCord + i - shipSize + 2, yCord) == Designations.W &&
                                    getSquare(xCord + i - shipSize + 2, yCord + 1) == Designations.W &&
                                    xCord + i - shipSize + 2 <= 9) {
                                count++;
                            }
                        }else if (way == 2) {
 
........................................
if (count == shipSize + 2) {
                try {
                    setShipOnTheField(way, shipSize, new Point(xCord, yCord));
                    isPutted = true;
                } catch (ExceptionSetShip exceptionSetShip) {
                    exceptionSetShip.printStackTrace();
                }
            }
                    }
Java
1
2
3
4
5
 public Designations[][] setShipOnTheField(int way, int shipSize, Point point) throws ExceptionSetShip {
        if (way == 1) {
            return TypeOfShips.setShipOnTheFieldWithWay1(shipSize, point, field);
        } else if (way == 2) {
............

Java
1
2
3
4
5
6
7
8
9
public static Designations[][] setShipOnTheFieldWithWay1(int shipSize, Point point, Designations[][] field) {
        int xCord = point.getX();
        int yCord = point.getY();
        for (int i = 0 ; i < shipSize; i++) {
            // risuet vniz
            field[xCord++][yCord] = Designations.V;
        }
        return field;
    }
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
15.11.2018, 20:57
Ответы с готовыми решениями:

Морской бой
Всем привет! Могли бы Вы мне помочь, суть вопроса в следующем: Нужно частично реализовать игру &quot;Морской бой&quot;, а именно, чтоб...

Морской бой
Привет всем, Читаю книгу Сьерра и Бейтса, уже на 150-ой где то странице они вбамбурили консольную игру под названием &quot;морской...

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

4
528 / 263 / 70
Регистрация: 11.12.2016
Сообщений: 1,223
16.11.2018, 00:46
Цитата Сообщение от Cold As Ice Посмотреть сообщение
Погуглил нашел много информации, но не особо понимаю
но мы же не гуглили..
Цитата Сообщение от Cold As Ice Посмотреть сообщение
выбираем 1 из 4 возможных путей
вообще не понятно о каких путях вы говорите.
Цитата Сообщение от Cold As Ice Посмотреть сообщение
Пишу морской бой и возникла проблема, проверки расстоновки кораблей.
1) Я бы создал булеву матрицу 10*10, и принял к примеру 1 за свободное пространство и 0 за зайнятое (без разницы, потому что тут корабль или просто он рядом).
2) начал с самых больших (в конце корабли поменьше легче поместить)
3) в зависимости от развернутости корабля находил случайно первую точку слева вверху от 0 до 10-размер корабля по Х и У
4) проверял подходит координаты проекции корабля и пространства рядом, дают 1? иначе шаг 3.
5) заполнил координаты (они булевы и 10 та 10) корабля и вокруг "0".
6) взял корабли поменьше и шаг 2.
ясно что наперед сложно все предвидеть, например 2.1 выбрал нужный корабль(случайно?), 2.2 случайно развернул..
Но логика думаю что понятна.
0
958 / 577 / 136
Регистрация: 23.05.2012
Сообщений: 7,364
16.11.2018, 02:04
Цитата Сообщение от Cold As Ice Посмотреть сообщение
То есть получаем корабль, формируем рандомную точку (x, y) - для старта, выбираем 1 из 4 возможных путей, и в зависимости от пройденной проверки, будем добавлять корабль на поле или вызывать снова данный метод.
Все норм. Только после выбора точки и направления проверяйте растояние до стенки. Если оно больше или равно длины корабля, то размещаем, иначе выбираем точку заново.
0
 Аватар для Cold As Ice
0 / 0 / 0
Регистрация: 11.02.2017
Сообщений: 16
16.11.2018, 05:40  [ТС]
Может быть, кому нибудь будет интересно, написал метод, который решил мою проблему, оставил проверку только двух путей вниз и право:
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
public void setShip(IShip ship) {
        boolean isPutted = false;
        while (!isPutted) {
            boolean isCorrectLetter = true;
            int shipSize = ship.getSize();
            int way = randomWayForInputShip();
            int xCord = getRandomNumber(0, 9);
            int yCord = getRandomNumber(0, 9);
            int xSource = xCord;
            int ySource = yCord;
            if ((way == 1 && shipSize + xCord <= 10) || way == 2 && shipSize + yCord <= 10) {
                for (int k = 0; k < shipSize; k++) {
                    for (int i = 0; i < 3; i++) {
                        int x = xCord + i - 1;
                        for (int j = 0; j < 3; j++) {
                            int y = yCord + j - 1;
                            if (x < 0 || y < 0 || x > 9 || y > 9) {
                                continue;
                            }
                            if (getSquare(x, y) != Designations.W) {
                                isCorrectLetter = false;
                            }
                        }
                    }
                    if (way == 1) {
                        xCord++;
                    } else if (way == 2) {
                        yCord++;
                    }
                }
            } else {
                continue;
            }
 
            if (!isCorrectLetter) {
                continue;
            }
 
            try {
                isPutted = true;
                setShipOnTheField(way, shipSize, new Point(xSource, ySource));
            } catch (ExceptionSetShip exceptionSetShip) {
                exceptionSetShip.printStackTrace();
            }
        }
    }
0
 Аватар для Aviz__
2747 / 2055 / 508
Регистрация: 17.02.2014
Сообщений: 9,474
16.11.2018, 08:07
Вот, проверку ходов шахматного коня делал, может натолкнет на мысль...
Проверить корректность хода шахматного коня
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
16.11.2018, 08:07
Помогаю со студенческими работами здесь

Примитивнейшая игра морской бой
public class SimpleDotComGame { public static void main(String args) throws IOException { BufferedReader reader = new...

Морской бой UTF8 смещение
Всем добра, пишу морской бой, хочу побаловаться с консолью пустые клетки вывожу квадратами, но вот беда имена клеток сдвигаются, кто-нибудь...

Игра через сервер в морской бой
Игра по сети в «Морской бой». Игроки играют в игру, передавая координаты через сервер.

Почти готовый морской бой (нужна критика кода)
Морской бой 1. код разделён на два пакета logic и swing 2. правильно ли я манипулирую данными: получаю, передаю, изменяю. ? 3. не...

Разработка/Морской бой/Сравнение данных в многомерных массивах
Добрый день. Во время создания морского боя (игрок против игрока) столкнулся с тем, что не получается сравнить значения массивов и если...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru