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

Морской бой - программа зацикливается на расстановке кораблей

10.04.2015, 17:04. Показов 893. Ответов 4
Метки нет (Все метки)

Нужно написать курсовую(игру). Решила написать морской бой(пока что консольно). Написала программу для расстановки кораблей. Не могу понять, почему код зацикливается..
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
#include "stdafx.h"
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
 
void Init(int **Pole)
{
    int X, Y;
    for (X = 0; X < 10; X++)
    for (Y = 0; Y < 10; Y++) //заполняем массивы -1
    {
        
        Pole[X][Y] = -1;
    }
}
 
bool free(int x, int y, int **Pole)
{
    int D[8][2] = { { 0, 1 }, { 1, 0 }, { 0, -1 }, { -1, 0 }, { 1, 1 }, { -1, 1 }, { 1, -1 }, { -1, -1 } };
    int i, dx, dy;
    
    
    if ((x > 0) && (x < 10) && (y > 0) && (y < 10))
        if (Pole[x][y] = -1)
    {
        for (int i = 0; i < 8; i++)
        {
        dx = x + D[i][1];
        dy = y + D[i][2];
        
        if ((dx > 0) && (dx < 10) && (dy > 0) && (dy < 10))
            if  (Pole[dx][dy] > -1)
            {
                return false;
                 break;
            }
        }
    return true;
    }
    else 
        return false;
    
}
 
void ships(int **Pole)
{
    srand(time(NULL));
    int N, M, i, j, x, y, kx, ky;
    bool B;
 
    Init(Pole);
    
    for (N = 3; N >= 0; N--)
    
    for (M = 0; N <= 3 - N; M++)
    do
    {
        srand(time(NULL));
        x = rand() % 9 + 1 ;
        y = rand() % 9 + 1;
        kx = rand() % 2; //random (2) : 1, 0
        if (kx == 0)
            ky = 1;
        else
            ky = 0;
        B = true;
        for (i = 0; i <= N; i++)
        if (free(x + kx * i, y + ky * i, Pole) == false)
            B = false;
 
        if (B == true)
        for (j = 0; j <= N; j++)
        if (((x + kx*j) < 10) && ((y + ky*j) < 10))
        {
 
            cout << x + kx*j << " " << y + ky*j; // в этом месте код зацикливается - выводит бесконечное количество рандомных чисел
            Pole[x + kx*j][y + ky*j] = 0;
        }
    }
 
    while (B == true);
 
    
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    srand(time(NULL));
    int P1[10][10];
    
    
    int **P2, i, j;
    P2 = new int*[10];
    for (i = 0; i<10; i++)
        P2[i] = new int[10];
 
    Init(P2);
    ships(P2);
 
    cout << endl << endl;
 
    for (i = 0; i < 10; i++)
    {
        for (j = 0; j < 10; j++) // вывод чистого поля
        {
            if (P2[i][j] == -1)
                cout << P2[i][j] << " ";
            else
                cout << P2[i][j] << "  ";
        }
        cout << endl;
    }
 
    system("pause");
 
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.04.2015, 17:04
Ответы с готовыми решениями:

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

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

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

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

4
2098 / 1619 / 690
Регистрация: 27.07.2012
Сообщений: 4,853
10.04.2015, 17:08 2
C++
1
for (M = 0; N <= 3 - N; M++)
Ну и как тут выйти из цикла?

Возможно, имелось в виду:
C++
1
for (M = 0; M <= 3 - N; M++) // <-- в условии M, а не N
1
0 / 0 / 0
Регистрация: 26.12.2014
Сообщений: 40
10.04.2015, 17:14  [ТС] 3
Да, действительно.. тут ошибка, спасибо, но от этого зацикливание не прекратилось..)
0
2098 / 1619 / 690
Регистрация: 27.07.2012
Сообщений: 4,853
10.04.2015, 17:28 4
Запусти в отладчике, поставь точку останова где-нибудь в функции ships и смотри, какое из условий выхода из цикла не выполняется.

ПС. И расставь нормально отступы и {} скобки. Код невозможно читать.

Добавлено через 7 минут
C++
1
2
    for (N = 3; N >= 0; N--)
        for (M = 0; M <= 3 - N; M++)
Сразу:
1) внешний цикл: N = 3
2) внутренний цикл: начальное значение M = 0,
условие выхода: M <= N - 3 т.е. M <= 3 - 3 ... M <= 0,
далее M только увеличивается, а значит никогда не будет меньше нуля.

Вот и зацикливание.
0
0 / 0 / 0
Регистрация: 26.12.2014
Сообщений: 40
10.04.2015, 18:26  [ТС] 5
Зацикливание ушло, как только я взяла выражение N-3 в скобки
C++
1
for (M = 0; M <= (3 - N); M++)
И еще, на сколько я понимаю, это не условие выхода (M <= (N - 3)), а условие, что цикл работает, пока выполняется это неравенство, так что пока что менять его не вижу смысла.

Добавлено через 31 минуту
Только вот алгоритм все-равно не правильный...)) Буду благодарна, если кто-нибудь поможет его исправить))
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
#include "stdafx.h"
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
 
void Init(int **Pole)
{
    int X, Y;
    for (X = 0; X < 10; X++)
    for (Y = 0; Y < 10; Y++) //заполняем массивы -1
    {
        
        Pole[X][Y] = -1;
    }
}
 
bool free(int x, int y, int **Pole)
{
    int D[8][2] = { { 0, 1 }, { 1, 0 }, { 0, -1 }, { -1, 0 }, { 1, 1 }, { -1, 1 }, { 1, -1 }, { -1, -1 } };
    int i, dx, dy;
    
    if ((x > 0) && (x < 10) && (y > 0) && (y < 10) && (Pole[x][y] == -1))
        
    
        for (int i = 0; i < 8; i++)
        {
        dx = x + D[i][1];
        dy = y + D[i][2];
        
        if ((dx > 0) && (dx < 10) && (dy > 0) && (dy < 10) && (Pole[dx][dy] > -1))
        {
            return false;
        }
    return true;
    }
    else 
        return false;
    
}
 
void ships(int **Pole)
{
    srand(time(NULL));
    int N, M, i, j, x, y, kx, ky;
    bool B;
 
    Init(Pole);
    
    for (N = 3; N >= 0; N--)
    {
        for (M = 0; M <= (3 - N); M++)
        {
 
            do
            {
                srand(time(NULL));
                x = rand() % 10 + 1;
                y = rand() %  10 + 1;
 
                kx = rand() % 2; //random (2) : 1, 0
                if (kx == 0)
                    ky = 1;
                else
                    ky = 0;
                B = true;
                for (i = 0; i <= N; i++)
                {
                    if (free(x + kx * i, y + ky * i, Pole) == false)
                        B = false;
                }
 
                if (B == true)
                {
                    for (i = 0; i <= N; i++)
                    {
                            Pole[x + kx*i][y + ky*i] = 0;
                    }
                }
            }
 
            while (B == true);
        }
    }
    
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    srand(time(NULL));
    int P1[10][10];
    
    
    int **P2, i, j;
    P2 = new int*[10];
    for (i = 0; i<10; i++)
        P2[i] = new int[10];
 
    Init(P2);
    ships(P2);
 
    cout << endl << endl;
 
    for (i = 0; i < 10; i++)
    {
        for (j = 0; j < 10; j++) // вывод чистого поля1
        {
            if (P2[i][j] == -1)
                cout << P2[i][j] << " ";
            else
                cout << P2[i][j] << "  ";
        }
        cout << endl;
    }
 
    system("pause");
 
    return 0;
}
Добавлено через 8 минут
Более аккуратно оформленный код)
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
#include "stdafx.h"
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
 
void Init(int **Pole)
{
    int X, Y;
    for (X = 0; X < 10; X++)
        for (Y = 0; Y < 10; Y++) //заполняем массивы -1
        {
        Pole[X][Y] = -1;
        }
}
 
bool free(int x, int y, int **Pole)
{
    int D[8][2] = { { 0, 1 }, { 1, 0 }, { 0, -1 }, { -1, 0 }, { 1, 1 }, { -1, 1 }, { 1, -1 }, { -1, -1 } };
    int i, dx, dy;
    
    if ((x > 0) && (x < 10) && (y > 0) && (y < 10) && (Pole[x][y] == -1))
    {
        for (int i = 0; i < 8; i++)
        {
            dx = x + D[i][1];
            dy = y + D[i][2];
 
            if ((dx > 0) && (dx < 10) && (dy > 0) && (dy < 10) && (Pole[dx][dy] != -1))
            {
                return false;
                break;
            }
        }
            return true;
    }
    else 
        return false;
    
}
 
void ships(int **Pole)
{
    srand(time(NULL));
    int N, M, i, j, x, y, kx, ky;
    bool B;
 
    Init(Pole);
    
    for (N = 3; N >= 0; N--)
    {
        for (M = 0; M <= (3 - N); M++)
        {
 
            do
            {
                srand(time(NULL));
                x = rand() % 10 + 1;
                y = rand() %  10 + 1;
 
                kx = rand() % 2; //random (2) : 1, 0
                if (kx == 0)
                    ky = 1;
                else
                    ky = 0;
                B = true;
                for (i = 0; i <= N; i++)
                {
                    if (free(x + kx * i, y + ky * i, Pole) == false)
                        B = false;
                }
 
                if (B == true)
                {
                    for (i = 0; i <= N; i++)
                    {
                            Pole[x + kx*i][y + ky*i] = 0;
                    }
                }
            }
            while (B == true);
        }
    }
    
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    srand(time(NULL));
    int P1[10][10];
    
    
    int **P2, i, j;
    P2 = new int*[10];
    for (i = 0; i<10; i++)
        P2[i] = new int[10];
 
    Init(P2);
    ships(P2);
 
    cout << endl << endl;
 
    for (i = 0; i < 10; i++)
    {
        for (j = 0; j < 10; j++) // вывод чистого поля1
        {
            if (P2[i][j] == -1)
                cout << P2[i][j] << " ";
            else
                cout << P2[i][j] << "  ";
        }
        cout << endl;
    }
 
    system("pause");
 
    return 0;
}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.04.2015, 18:26
Помогаю со студенческими работами здесь

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

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

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

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


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

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

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