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

Морской бой. Ф-ция автоматической рассатновки кораблей. - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Составить программу, которая оп- ределяет наименьшую и наибольшую цифру этого числа http://www.cyberforum.ru/cpp-beginners/thread246343.html
1)Дано трехзначное целое число. Составить программу, которая определяет наименьшую и наибольшую цифру этого числа. Число вводить с клавиатуры. 2)Составить программу приближенного вычисления...
C++ НОК Люди, нужно найти НОК n-го количества чисел, числа записаны в массив. НОД я уже написал, но НОК как-то не выходит. Кто-нибудь мог бы написать мне на C (не C++ и C#) очень важно чтобы на чистом С. http://www.cyberforum.ru/cpp-beginners/thread246333.html
Сколько битов потребуется? C++
Сколько битов потребуется для адресации 64560 байтов, 2 мегабайтов, 17 мегабайтов, 5 гигабайтов?
ошибка C++
подскажите где ошибка: Вот задание: Сформировать текстовый файл, записав в него 20 слу- чайных чисел от –10 до +10, по одному на строке. #include <fstream> #include <iostream> #include...
C++ Найти максимальную сумму цифр числа http://www.cyberforum.ru/cpp-beginners/thread246279.html
Составить функцию, аргументом которой является длинное целое число. Возращаемое значение должно быть равно сумме десятичных цифр числа n. Найти максимальную сумму цифр числа среди элементов...
C++ посмотрите Подскажите пожалуйста,правильно-ли составлена блок схема по этой программе? программа: #include <iostream> using namespace std; struct pas подробнее

Показать сообщение отдельно
notgosu
9 / 9 / 1
Регистрация: 16.02.2011
Сообщений: 17

Морской бой. Ф-ция автоматической рассатновки кораблей. - C++

21.02.2011, 17:58. Просмотров 5365. Ответов 3
Метки (Все метки)

Добрый день, ув. форумчане! Есть задание написать консольный морской бой. Есть задача расстановки кораблей компьютера случайным образом. Массив [10][10], заполненный '0' - игровое поле. 'X' - корабль.
В ф-ции расстановки кораблей перед заполнением 'Х' идет проверка на наличие кораблей в случайно выбранном элементе и вокруг него(чтобы корабли не соприкасались). Мною написана ф-ция:
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
void AutoSet(char field[10][10], int  m, int n)
{
    //Расстановка однопалубных кораблей
    srand(time(NULL));
    for(int i=0; i<4; i++){
        m=rand()%10;
        n=rand()%10;
        while (field[m][n]=='X' || field[m][n+1]=='X' || field[m][n-1]=='X' || field[m+1][n]=='X' || field[m-1][n]=='X'
            || field[m+1][n+1]=='X' || field[m+1][n-1]=='X' || field[m-1][n+1]=='X' || field[m-1][n-1]=='X'){
            m=rand()%10;
            n=rand()%10;
        }
        field[m][n]='X';
    }
 
    //Расстановка двохпалубных кораблей
    for(int i=0; i<3; i++){
        int k=rand()%2;
        switch(k){
        case 0://вертикальное расположение корабля
            m=rand()%9;
            n=rand()%10;
            while(field[m][n]=='X' || field[m-1][n-1]=='X' || field[m-1][n]=='X' || field[m-1][n+1]=='X' ||
                  field[m][n-1]=='X' || field[m][n+1]=='X' || field[m+1][n-1]=='X' || field[m+1][n]=='X' ||
                  field[m+1][n+1]=='X' || field[m+2][n-1]=='X' || field[m+2][n]=='X' || field[m+2][n+1]=='X'){
                  m=rand()%9;
                  n=rand()%10;
            }
            field[m][n]='X';
            field[m+1][n]='X';
            break;
        case 1://горизонтальное расположение корабля
            m=rand()%10;
            n=rand()%9;
            while(field[m][n]=='X' || field[m][n+1]=='X' || field[m-1][n-1]=='X' || field[m-1][n]=='X' ||
                field[m-1][n+1]=='X' || field[m-1][n+2]=='X' || field[m][n-1]=='X' || field[m][n+2]=='X' ||
                field[m+1][n-1]=='X' || field[m+1][n]=='X' || field[m+1][n+1]=='X' || field[m+1][n+2]=='X'){
                m=rand()%10;
                n=rand()%9;
            }
            field[m][n]='X';
            field[m][n+1]='X';
            break;
        }   
    }
 
    //Расстановка трехпалубных кораблей
    for (int i=0; i<2; i++){
        int n=rand()%2;
        switch(n){
        case 0://вертикальное положение корабля
            m=rand()%8;
            n=rand()%10;
            while(field[m][n]=='X' || field[m+1][n]=='X' || field[m+2][n]=='X' || field[m-1][n-1]=='X' ||
                field[m-1][n]=='X' || field[m-1][n+1]=='X' || field[m][n-1]=='X' || field[m][n+1]=='X' ||
                field[m+1][n-1]=='X' || field[m+1][n+1]=='X' || field[m+2][n-1]=='X' || field[m+2][n+1]=='X' ||
                field[m+3][n-1]=='X' || field[m+3][n]=='X' || field[m+3][n+1]=='X'){
                m=rand()%8;
                n=rand()%10;
            }
            field[m][n]='X';
            field[m+1][n]='X';
            field[m+2][n]='X';
            break;
        case 1:
            m=rand()%10;
            n=rand()%8;
            while(field[m][n]=='X' || field[m][n+1]=='X' || field[m][n+2]=='X' || field[m-1][n-1]=='X' ||
                field[m-1][n]=='X' || field[m-1][n+1]=='X' || field[m-1][n+2]=='X' || field[m-1][n+3]=='X' ||
                field[m][n-1]=='X' || field[m][n+3]=='X' || field[m+1][n-1]=='X' || field[m+1][n]=='X' ||
                field[m+1][n+1]=='X' || field[m+1][n+2]=='X' || field[m+1][n+3]=='X'){
                m=rand()%10;
                n=rand()%8;
            }
            field[m][n]='X';
            field[m][n+1]='X';
            field[m][n+2]='X';
            break;
        }//switch
    }//for
 
    //Расстановка четырехпалубного корабля
    int l=rand()%2;
    switch(l){
    case 0://вертикальное положение
        m=rand()%7;
        n=rand()%10;
        while(field[m][n]=='X' || field[m+1][n]=='X' || field[m+2][n]=='X' || field[m+3][n]=='X' ||
            field[m-1][n-1]=='X' || field[m-1][n]=='X' || field[m-1][n+1]=='X' || field[m][n-1]=='X' ||
            field[m][n+1]=='X' || field[m+1][n-1]=='X' || field[m+1][n+1]=='X' || field[m+2][n-1]=='X' ||
            field[m+2][n+1]=='X' || field[m+3][n-1]=='X' || field[m+3][n+1]=='X' || field[m+4][n-1]=='X' ||
            field[m+4][n]=='X' || field[m+4][n+1]=='X'){
            m=rand()%7;
            n=rand()%10;
        }
        field[m][n]='X';
        field[m+1][n]='X';
        field[m+2][n]='X';
        field[m+3][n]='X';
        break;
    case 1://горизонтальное положение
        m=rand()%10;
        n=rand()%7;
        while(field[m][n]=='X' || field[m][n+1]=='X' || field[m][n+2]=='X' || field[m][n+3]=='X' ||
            field[m-1][n-1]=='X' || field[m-1][n]=='X' || field[m-1][n+1]=='X' || field[m-1][n+2]=='X' ||
            field[m-1][n+3]=='X' || field[m-1][n+4]=='X' || field[m][n-1]=='X' || field[m][n+4]=='X' ||
            field[m+1][n-1]=='X' || field[m+1][n]=='X' || field[m+1][n+1]=='X' || field[m+1][n+2]=='X' ||
            field[m+1][n+3]=='X' || field[m+1][n+4]=='X'){
            m=rand()%10;
            n=rand()%7;
        }
        field[m][n]='X';
        field[m][n+1]='X';
        field[m][n+2]='X';
        field[m][n+3]='X';
        break;
    }//switch
}
Проблема в расстановке четырехпалубного корабля - иногда консоль появляеться пустой(я так понял безконечный цыкл появляется) и ничего не происходит. Проблема сугубо в коде расстановки четырехпалубного корабля, без него все работает на ура.
Вот код программы, выводящей заполненное поле на экран:
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
#include<iostream>
#include<time.h>
#include<stdlib.h>
using namespace std;
 
void AutoSet(char field[10][10], int m, int n);
 
void main()
{
    setlocale(LC_ALL, "rus");
    const int m=10, n=10;
    char pfield[m][n], efield[m][n], nazv[m]={'A','B','C','D','E','F','G','H','I','J'};
    
    for (int i=0; i<m; i++)     //Заполнение
        for(int j=0; j<n; j++)  //поля игрока
            pfield[i][j]=0;     //нолями
    for (int i=0; i<m; i++)     //Заполнение
        for(int j=0; j<n; j++)  //поля компьютера
            efield[i][j]='0';   //нолями
    
    AutoSet(efield,m,n);
    cout<<"   ";
    for (int i=0; i<10; i++)
        cout<<nazv[i]<<" ";
    cout<<"\n";
    for (int i=0; i<10; i++)
        cout<<" ";
    cout<<"\n";
    for (int i=0; i<m; i++){    
        if (i== 9)
            cout<<(i+1)<<" ";
        else
        cout<<(i+1)<<"  ";
        for(int j=0; j<n; j++){
            cout<<efield[i][j]<<" ";
        }
        cout<<"\n";
    }
    
}
Просьба к коллегам - посмотрите свежей головой где я начудил, а то уже мозги кипят. Проблема 99% что в расстановке четырехпалубного корабля. Заранее благодарен.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.