Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.67
Robesper3411
17 / 17 / 1
Регистрация: 20.02.2012
Сообщений: 440
Записей в блоге: 1
#1

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

22.07.2012, 16:47. Просмотров 1657. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.07.2012, 16:47
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Игра "Морской бой" Рассстановка кораблей (C++):

Случайное распределение кораблей по полю в игре "морской бой" - C++
Привет всем кто читал мой предыдущий пост про векторы в морском боем, в той же фунции появилась новая проблема :) После починки...

Найти и исправить ошибки (игра "Морской бой") - C++
Ребят. На с++ пишу недавно. Решил сделать простенькую игру: &quot;Морской бой&quot;. Игра будет происходит только на одном поле. Вы вводите...

Игра "Морской бой" - C++
задание такое Запрограммировать игру двух игроков в “Морской бой”. Сначала, по-сле запуска программы, игроки совместно вводят размер...

Игра "Морской бой" - C++
Всем привет, помогите пожалуйста разобраться с задачей. Нужно написать код, и если можете с пояснениями=) 1. Перечисления. Игра Морской...

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

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

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

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

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

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

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

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

Цитата Сообщение от Leomana Посмотреть сообщение
а зачем Вам Sleep(10) ?
если его убираю сразу выдает ошибку... Но эт косяк я согласен.
0
Leomana
59 / 59 / 5
Регистрация: 29.06.2012
Сообщений: 188
22.07.2012, 19:19 #10
Цитата Сообщение от Robesper3411 Посмотреть сообщение
если его убираю зразу выдает ошибку... Но эт косяк я согласен.
ошибка? Что за ошибка такая ?
0
Robesper3411
17 / 17 / 1
Регистрация: 20.02.2012
Сообщений: 440
Записей в блоге: 1
22.07.2012, 19:41  [ТС] #11
Цитата Сообщение от Leomana Посмотреть сообщение
ошибка? Что за ошибка такая ?
типа того: в приложении обнаржена ошибка и оно будет закрыто.
0
22.07.2012, 19:41
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.07.2012, 19:41
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.