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

Морской бой

10.03.2022, 16:51. Показов 1735. Ответов 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
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 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
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,316
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
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,316
11.03.2022, 22:50
Цитата Сообщение от SmallEvil Посмотреть сообщение
alexu_007, по твоим скринам, ощущение, что не рандомно расставляются корабли, а просто по очереди, начиная с верхнего левого угла. (или просто скрин такой )
Скрин, который вы имеете ввиду - это поле человека, и я расставил корабли руками. Это рэндом моей головы...
0
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,316
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
Ответ Создать тему
Новые блоги и статьи
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась. Первый вариант. . .
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2. Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
rest api anylogic - выполнение модели на своём русском сайте
anaschu 02.07.2026
Как подружиться с AnyLogic Cloud API, победить провайдеров и развернуться Java-бэкенд в Docker на бесплатном хостинге: Двухдневный лог борьбы Всем привет! Хочу поделиться свежим (и довольно. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru