Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 25.12.2020
Сообщений: 6

Морской бой

10.03.2022, 16:51. Показов 1535. Ответов 24

Студворк — интернет-сервис помощи студентам
Пишу расстановку кораблей для морского боя в рандомном порядке. И если с однопалубными кораблями все понятно, то вот с двупалобным и далее не совсем. Подскажите как добавить палубу к кораблю(число к числу в массиве). Код ниже

C++
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
#include <vector>
#include <iostream>
#include<string>
#include <algorithm>
using namespace std;
class ships
{
public:
    int trpd_boat = 1;
    int destroyers = 2;
    int cruisers = 3;
    int battleship = 4;
   
};
class water : public ships
{
public:
    
    void filling()
    {
        int s = 0;
        int Pole[10][10] = {{ 0,0,0,0,0,0,0,0,0,0 }, { 0,0,0,0,0,0,0,0,0,0 }};
        int random[2] = { 1,-1 };
        int r = random[rand() % 2];
        srand(time(NULL));
        for (int i = 0; i < 2; i++)
        {
            for (int j = 0; j < 2; j++) 
            {
                Pole[rand() % 10][rand() % 10] = trpd_boat;                                        
            }
            cout << endl;
        }
        for (int i = 0; i < 2; i++) 
        {
            for (int j = 0; j < 3; j++)
            {
                Pole[rand() % 10][rand() % 10] = destroyers;                  
        } 
        
        for (int i = 0; i < 9; i++) 
        {
            for (int j = 0; j < 9; j++) 
            {
                if (Pole[i][j] == 2 && s<3)
                {
                    Pole[i][j+1] = destroyers;
                    s++;
                }
                else
                { 
                    s = 0;
                }
 
            }
            }
        }
        for (int i = 0; i < 1; i++)
        {
            for (int j = 0; j < 2; j++)
            {
                Pole[rand() % 10][rand() % 10] = cruisers;
            }
        }
        for (int i = 0; i < 1; i++)
        {
            for (int j = 0; j < 1; j++)
            {
                Pole[rand() % 10][rand() % 10] = battleship;
            }
        }
        for (int i = 0; i < 10; i++) {
            for (int j = 0; j < 10; j++) {
                cout << Pole[i][j] << " ";
            }
            cout << endl;
        }
    }
 
};
int main()
{
    
    water water;
    water.filling();
   
    
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.03.2022, 16:51
Ответы с готовыми решениями:

Морской Бой
прошу в помощи написания этой игры ,спасибо

Морской бой
Вопрос.Делаю морской бой на с++.Какие должны быть классы ,для реализации? Можете практически без пояснений(чуть-чуть о функциях).Главное...

Морской бой
Входные данные двумерный массив 10х10, заполненный нолями и единицами, где 0-пустая клетка, а 1-занятая, найти наиболее длинную линию из...

24
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,029
Записей в блоге: 1
11.03.2022, 22:37
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от SmallEvil Посмотреть сообщение
сделать массив из пустых клеток, перемешать их, и оттуда брать их для попытки расстановок кораблей
В этом коде это почти есть, после 50-ти попыток.
Только без отсеивания занятых.
Там изначальные требования были немного необычные, поэтому так.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
11.03.2022, 22:39
alexu_007, по твоим скринам, ощущение, что не рандомно расставляются корабли, а просто по очереди, начиная с верхнего левого угла. (или просто скрин такой )
0
736 / 700 / 110
Регистрация: 29.05.2015
Сообщений: 4,268
11.03.2022, 22:48
Цитата Сообщение от SmallEvil Посмотреть сообщение
поделись своим алгоритмом расстановки, ТСу точно будет интересно, да и мне уже тоже
Пжалста, но у меня корабли "кривые". Вот код и неск. результатов работы этого кода:

C++ (Qt)
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
// установка кораблей компьютером
// ------------------------------
void Widget::set_pole_comp()
{
    int x, y, x1, y1, k;
    int cx, cx_try;
 
 
met_10:
 
    for (int i = 0; i < VHSIZE; i++)
        for (int j = 0; j < VHSIZE; j++)
             pole_comp_2[i][j] = 0;
 
    // установка:
    // 1х5, 2х4, 3х3, 4х2, 5х1
    for(int i = 6; i > 0; i--)
    {
        k = 6 - i;
 
        // установка одного корабля
        for(int j = 0; j < k; j++)
        {
            // случайные координаты 1-й палубы
            x = rand() % VHSIZE;
            y = rand() % VHSIZE;
 
            cx = i; cx_try = 0;
 
            while(cx)
            {
                if(++cx_try > 300) goto met_10;
 
                // случайные координаты продолжения установки
                x1 = 1 - rand() % 3;
                y1 = 1 - rand() % 3;
 
                // угловые клетки игнорируются
                if(x1 && y1) continue;
 
                x1 += x; y1 += y;
 
                // выход за пределы поля
                if(x1 < 0 || x1 == VHSIZE) continue;
                if(y1 < 0 || y1 == VHSIZE) continue;
 
                // здесь защитное поле
                if(pole_comp_2[x1][y1] == 5) continue;
 
                // возврат на уже установленную палубу
                if(pole_comp_2[x1][y1] == 1) cx++;
 
                // установка новой палубы
                pole_comp_2[x1][y1] = 1;
 
                x = x1; y = y1; cx--;
            }
 
        // защитное поле вокруг установленного корабля
        z_pole_comp(pole_comp_2);
        }
    }
 
 
    // удаление защитного поля
    for (int i = 0; i < VHSIZE; i++)
        for (int j = 0; j < VHSIZE; j++)
        {
             if(pole_comp_2[i][j] == 5) pole_comp_2[i][j] = 0;
        }
 
}
Сразу поясню насчёт goto: если его убрать совсем, возможны зависания (см. выше). Если увеличить значение cx_try (сделать вызывания goto совсем редкими), то корабли начинают расставляться по полю более равномерно, что не есть гуд - желательна непредсказуемость.
Миниатюры
Морской бой   Морской бой   Морской бой  

Морской бой   Морской бой  
0
736 / 700 / 110
Регистрация: 29.05.2015
Сообщений: 4,268
11.03.2022, 22:50
Цитата Сообщение от SmallEvil Посмотреть сообщение
alexu_007, по твоим скринам, ощущение, что не рандомно расставляются корабли, а просто по очереди, начиная с верхнего левого угла. (или просто скрин такой )
Скрин, который вы имеете ввиду - это поле человека, и я расставил корабли руками. Это рэндом моей головы...
0
736 / 700 / 110
Регистрация: 29.05.2015
Сообщений: 4,268
11.03.2022, 23:21
Сам морской бой, если кто захочет протестировать.

Кнопка "установка" - установка кораблей человеком.
Поле человека - левое.
Корабли: один 5-ти палубный, 2 - 4х, 3 - 3х, 4 - 2х, 5 - 1х. Корабли не должны касаться друг друга.
После корректной установки становится активной кнопка "игра".
Первым ходит всегда человек.
При попадании ход остаётся у игрока. При промахе ход переходит сопернику.
Вокруг убитых кораблей автоматически создаётся защитное поле. Выстрел туда невозможен.
Ошибочные ходы (туда, куда уже был выстрел ранее) не производятся.
При выигрыше одного из соперников игра останавливается, и становится активной кнопка "установка".
При выигрыше компьютера, он показывает свой корабль (корабли), которые не были убиты.
Ехе-шник в папке bin.
Вложения
Тип файла: zip mboy.zip (14.41 Мб, 4 просмотров)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.03.2022, 23:21
Помогаю со студенческими работами здесь

Морской бой
Решил сделать консольный морской бой, но при расстановке кораблей компьютером, поля где должны располагатся корабли компьтера, уплывают....

Морской бой в С
Прошу,что-бы он был максимально упрощенным .А то я ток начинающий программист)

Морской Бой на C++
Помогите пожалуйста написать морской бой на C++ ,не сильно замороченный, простенький, можно даже с однопалубными кораблями, просто конец...

Морской бой C++
имеется следующий класс Text,в котором два метода drawText(...) который отвечает за прорисовку текста на экране i renderingText() - за...

Морской бой
Есть поле 10 на 10, есть определенной расположение кораблей. Необходимо отобразить/напечатать имеющееся поле с кораблями


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

Или воспользуйтесь поиском по форуму:
25
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru