0 / 0 / 0
Регистрация: 25.12.2020
Сообщений: 6
1

Морской бой

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

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

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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.03.2022, 16:51
Ответы с готовыми решениями:

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

Морской бой
Вопрос.Делаю морской бой на с++.Какие должны быть классы ,для реализации? Можете практически без...

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

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

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

24
Неэпический
17869 / 10634 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
11.03.2022, 22:37 21
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от SmallEvil Посмотреть сообщение
сделать массив из пустых клеток, перемешать их, и оттуда брать их для попытки расстановок кораблей
В этом коде это почти есть, после 50-ти попыток.
Только без отсеивания занятых.
Там изначальные требования были немного необычные, поэтому так.
0
2800 / 2310 / 701
Регистрация: 29.06.2020
Сообщений: 8,549
11.03.2022, 22:39 22
alexu_007, по твоим скринам, ощущение, что не рандомно расставляются корабли, а просто по очереди, начиная с верхнего левого угла. (или просто скрин такой )
0
660 / 661 / 106
Регистрация: 29.05.2015
Сообщений: 3,964
11.03.2022, 22:48 23
Цитата Сообщение от 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
660 / 661 / 106
Регистрация: 29.05.2015
Сообщений: 3,964
11.03.2022, 22:50 24
Цитата Сообщение от SmallEvil Посмотреть сообщение
alexu_007, по твоим скринам, ощущение, что не рандомно расставляются корабли, а просто по очереди, начиная с верхнего левого угла. (или просто скрин такой )
Скрин, который вы имеете ввиду - это поле человека, и я расставил корабли руками. Это рэндом моей головы...
0
660 / 661 / 106
Регистрация: 29.05.2015
Сообщений: 3,964
11.03.2022, 23:21 25
Сам морской бой, если кто захочет протестировать.

Кнопка "установка" - установка кораблей человеком.
Поле человека - левое.
Корабли: один 5-ти палубный, 2 - 4х, 3 - 3х, 4 - 2х, 5 - 1х. Корабли не должны касаться друг друга.
После корректной установки становится активной кнопка "игра".
Первым ходит всегда человек.
При попадании ход остаётся у игрока. При промахе ход переходит сопернику.
Вокруг убитых кораблей автоматически создаётся защитное поле. Выстрел туда невозможен.
Ошибочные ходы (туда, куда уже был выстрел ранее) не производятся.
При выигрыше одного из соперников игра останавливается, и становится активной кнопка "установка".
При выигрыше компьютера, он показывает свой корабль (корабли), которые не были убиты.
Ехе-шник в папке bin.
Вложения
Тип файла: zip mboy.zip (14.41 Мб, 4 просмотров)
0
11.03.2022, 23:21
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.03.2022, 23:21
Помогаю со студенческими работами здесь

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

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

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

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

Морской бой С++
Помогите пожалуйста.Нужно сделать так,чтобы обрисовало выстрелами все(вокруг убитого корабля) ...


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

Или воспользуйтесь поиском по форуму:
25
Ответ Создать тему
Опции темы

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