Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/16: Рейтинг темы: голосов - 16, средняя оценка - 4.63
 Аватар для Robesper3411
20 / 19 / 3
Регистрация: 20.02.2012
Сообщений: 535
Записей в блоге: 1

Игра "Морской бой" Рассстановка кораблей

22.07.2012, 16:47. Показов 3619. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пишу игру "Морской бой". Нужно пока что только расставить корабли. На данный момент логика следующая. Все поле забито нулями (ноль - пустая ячейка).
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0

Если начинаю строить корабль, то сначала рэндомно выбираю координаты и тут же рассчитываю (в зависимости от количества палуб и направления), нет ли "по соседству" других кораблей, т.е. проверяю (отмечено иксами, где большие иксы - предполагаемое положение корабля)

0 0 0 0 0 0 0 0 0 0
0 х х х х х 0 0 0 0
0 х Х Х Х х 0 0 0 0
0 х х х х х 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0

В нижеприведенном коде не получается кое-что сделать. На данный момент не получается поставить корабли, чтобы они не прикасались друг к другу
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
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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
#include <iostream>
#include <time.h>
#include <stdlib.h>
#include <Windows.h>
 
 
using namespace std;
 
//Класс "Пустое поле", т.е. забитое нулями
class A
{
private:
    int i,j;
public:
    int n[10][10];
    int s[12][12];
    A()
    {
        for (i=0; i < 12; i++)
        {   
            for(j=0; j < 12; j++)
            {
                s[i][j] = 0;
            }
        }
        for (i=0; i < 10; i++)
        {   
            for(j=0; j < 10; j++)
            {
                n[i][j] = s[i+1][j+1];
            }
        }
    }
};
 
 
class B: public A
{
public:
    int x, y, z, i ,j, k, s;
        int str(int palub, int c)
        {
            int z = 0;
            if (c==0)
            {
                z = 9 - palub;
            }
            else
                z = 9;
            srand(int (time(NULL)));
            Sleep(10);
            x = rand()%z;
            return x;
        }
        int stb(int palub, int c)
        {
            int z = 0;
            if (c!= 0)
            {
                z = 9 - palub;
            }
            else
                z = 9;
            srand(int (time(NULL)));
            Sleep(10);
            y = rand()%z;
            return y;
        }
        int napr()
        {
            srand(int (time(NULL)));
            Sleep(10);
            z = rand()%2;
            return z;
        }
        int proverka_n(int a, int b, int palub, int c)
        {
            int k = 0;
            int temp = 0;
            int temp_a = 0;
            int temp_b = 0;
            if (c == 0)
            {
                temp_b = palub + 2;
                temp_a = 2;
            }
            else
            {
                temp_a = palub + 2;
                temp_b = 2;
            }
 
            for(i = a - 1; i < a + temp_b; i++)
            {
                for(j = b - 1; j < b + temp_a; j++)
                {
                    k += n[i][j];
                }
            }
            return k;
        }
        int fun(int palub)
        {
            int c=napr();
            int a=str(palub, c);
            int b=stb(palub, c);
            k = proverka_n(a,b,palub,c);
            if(k==0)
            {
                for(i = 0; i < palub; i++)
                {
                    n[a][b] = 1;
                    if(c==0)
                    {
                        b++;
                    }
                    else
                    {
                        a++;
                    }
                }
            }
            else 
            {
                a,b,c;
                fun(palub);
            }
            return 0;
        }
 
        int fun5()
        {
            for (i=0; i < 10; i++)
            {
                for(j=0; j < 10; j++)
                {
                    cout << n[i][j] << ' ';
                }
                cout << endl;
            }
            return 0;
        }   
};
 
 
int main()
{
    B b;
    for(int i=0;i<1;i++)
    {
        b.fun(4);
    }
    for(int i=0;i<2;i++)
    {
        b.fun(3);
    }
    for(int i=0;i<3;i++)
    {
        b.fun(2);
    }
    for(int i=0;i<4;i++)
    {
        b.fun(1);
    } 
    b.fun5();
    return 0;
}
То есть получается все время что-то типа этого
0 0 0 0 0 0 0 0 0 0
0 1 0 0 1 0 0 1 0 0
0 1 0 0 1 0 0 0 0 0
0 1 0 0 0 0 1 1 1 1
0 1 1 1 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
1 0 0 0 1 0 1 0 1 0
1 0 0 0 1 0 0 0 0 0
0 0 0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 0 0 0
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.07.2012, 16:47
Ответы с готовыми решениями:

Расстановка кораблей (морской бой)
Доброго времени суток, при расстановке 2х палубных кораблей возникает проблема... При выборе точки уже занятой, система ломается и...

Консольный морской бой. Расстановка кораблей
Добрый вечер, уважаемые форумчане. Хочу написать консольный морской бой. Начал с функции автоматической расстановки кораблей. Весь...

Морской бой. Ф-ция автоматической рассатновки кораблей.
Добрый день, ув. форумчане! Есть задание написать консольный морской бой. Есть задача расстановки кораблей компьютера случайным образом....

10
14 / 14 / 4
Регистрация: 08.11.2010
Сообщений: 172
22.07.2012, 17:40
попробовал запустить, у меня вообще не работает, ничего не выводит
0
59 / 59 / 8
Регистрация: 29.06.2012
Сообщений: 188
22.07.2012, 17:41
разбирается конечно в коде без комментариев слишком долго.. отмечу не по теме факт
C++
1
int x, y, z, i ,j, k, s;
так писать члены класса - это же просто непонимание ООП.. это же не объявление каких-то переменных как в функции. Это должны быть свойства, то есть переменные относящиеся к объекту. А эти i и j .. к ним никак не относится, их нужно объявлять в самой функции..
0
 Аватар для Robesper3411
20 / 19 / 3
Регистрация: 20.02.2012
Сообщений: 535
Записей в блоге: 1
22.07.2012, 17:55  [ТС]
Цитата Сообщение от rudeeeboy Посмотреть сообщение
попробовал запустить, у меня вообще не работает, ничего не выводит
просто он долго выводит. Нужно подождать С этой проблемой тоже нужно разобраться...

Добавлено через 1 минуту
Цитата Сообщение от Leomana Посмотреть сообщение
разбирается конечно в коде без комментариев слишком долго.. отмечу не по теме факт
C++
1
int x, y, z, i ,j, k, s;
так писать члены класса - это же просто непонимание ООП.. это же не объявление каких-то переменных как в функции. Это должны быть свойства, то есть переменные относящиеся к объекту. А эти i и j .. к ним никак не относится, их нужно объявлять в самой функции..
да, согласен, пока в ООП слабоват(минусы заочного обучения налицо). Ну а касательно поставленного вопроса?
0
14 / 14 / 4
Регистрация: 08.11.2010
Сообщений: 172
22.07.2012, 18:02
через раз выводит, это от вашего рандома

Добавлено через 3 минуты
у меня всё нормально вывело, кроме четырех палубного, попробуй не рандомно сделать, и со своими координатами
0
 Аватар для Robesper3411
20 / 19 / 3
Регистрация: 20.02.2012
Сообщений: 535
Записей в блоге: 1
22.07.2012, 18:06  [ТС]
Цитата Сообщение от rudeeeboy Посмотреть сообщение
через раз выводит, это от вашего рандома

Добавлено через 3 минуты
у меня всё нормально вывело, кроме четырех палубного, попробуй не рандомно сделать, и со своими координатами
а если не рэндомно, то как? Мне необходимо каждый раз генерировать уникальное расположение кораблей.
0
14 / 14 / 4
Регистрация: 08.11.2010
Сообщений: 172
22.07.2012, 18:13
ну к примеру вводи координаты с клавиатуры, и делай проверку
0
59 / 59 / 8
Регистрация: 29.06.2012
Сообщений: 188
22.07.2012, 19:09
у меня этот код ошибку при выполнении выдает.. о том что стек переполнен.. и хз почему.. скорее всего из-за глубокой рекурсии, то есть
C++
1
if(k==0)
это условие не может выполнится.. советую по другому попробовать продумать алгоритм

Добавлено через 19 минут
Цитата Сообщение от Robesper3411 Посмотреть сообщение
просто он долго выводит. Нужно подождать С этой проблемой тоже нужно разобраться...
а зачем Вам Sleep(10) ?
0
 Аватар для Robesper3411
20 / 19 / 3
Регистрация: 20.02.2012
Сообщений: 535
Записей в блоге: 1
22.07.2012, 19:12  [ТС]
Цитата Сообщение от rudeeeboy Посмотреть сообщение
ну к примеру вводи координаты с клавиатуры, и делай проверку
просто это получится не совсем правильно. В результате все равно придется прийти к рэндому, но за совет спасибо.

Добавлено через 2 минуты
Цитата Сообщение от Leomana Посмотреть сообщение
у меня этот код ошибку при выполнении выдает.. о том что стек переполнен.. и хз почему.. скорее всего из-за глубокой рекурсии, то есть
C++
1
if(k==0)
это условие не может выполнится.. советую по другому попробовать продумать алгоритм
ок. попробую - спасибо за замечание. Довольно ценное

Цитата Сообщение от Leomana Посмотреть сообщение
а зачем Вам Sleep(10) ?
если его убираю сразу выдает ошибку... Но эт косяк я согласен.
0
59 / 59 / 8
Регистрация: 29.06.2012
Сообщений: 188
22.07.2012, 19:19
Цитата Сообщение от Robesper3411 Посмотреть сообщение
если его убираю зразу выдает ошибку... Но эт косяк я согласен.
ошибка? Что за ошибка такая ?
0
 Аватар для Robesper3411
20 / 19 / 3
Регистрация: 20.02.2012
Сообщений: 535
Записей в блоге: 1
22.07.2012, 19:41  [ТС]
Цитата Сообщение от Leomana Посмотреть сообщение
ошибка? Что за ошибка такая ?
типа того: в приложении обнаржена ошибка и оно будет закрыто.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.07.2012, 19:41
Помогаю со студенческими работами здесь

Проверить правильность расстановки кораблей. Морской бой
Есть матрица NxM, где расставлены корабли. Корабли не стоят на краю матрицы, кол-во 4-х клеточных кораблей - 1, 3-х клет. - 2, 2-х...

Морской бой - программа зацикливается на расстановке кораблей
Нужно написать курсовую(игру). Решила написать морской бой(пока что консольно). Написала программу для расстановки кораблей. Не могу...

Морской бой.Обработка массива. Расстановка кораблей
Пытаюсь написать морской бой. Свою карту я подгружаю из файла. Проблема в том, что у меня не получается корректно проверить, соприкасаются...

Морской бой: расставляется кораблей больше, чем положено
Здравствуйте! Пишу игру &quot;Морской бой&quot; в консоли, и попалась одна неприятная ситуация. Есть функция заполнения поля случайными кораблями,...

Создать класс, реализующий хранилище кораблей для игрока в «Морской бой»
Всем привет. Это задача по теме контейнерные классы. Не бейте только за глупый вопрос. Но в данной задаче нужно создавать сам класс? Прост...


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

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