Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.79/34: Рейтинг темы: голосов - 34, средняя оценка - 4.79
 Аватар для Abomination_25
4 / 4 / 0
Регистрация: 13.12.2016
Сообщений: 246

ASCII генератор карт в консоле

26.01.2018, 12:01. Показов 7472. Ответов 47
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет,пытаюсь написать небольшой генератор карт на С++ , для отображения использую консоль. Планирую перенести всё это дело в Unity. Сейчас есть небольшая программа, генерирующая только комнаты, но теперь проблема появилась такая:
Соединить всё это дело коридорами.
Когда комнаты создаются, то я записываю значения в массив( координаты и размеры). После я хочу отсортировать эти данные, но вот тут проблема, как лучше поступить... Может глянет кто, подскажет как лучше сделать?
Да, и программа иногда фризится почему-то без ошибок вообще. Либо в процессе, либо еще до начала...
Вот код:
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
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
#include <iostream>
#include <conio.h>
#include <stdlib.h>
#include <windows.h>
#include <ctime>
 
using namespace std;
 
bool step=true; // Включить или выключить поэтапную рисовку карты
bool stop=false;
int speed=100; // Скорость воспроизведения: 100 - Макс, 0 - Мин
const int number=15; // Число комнат
int RoomX[number];
int RoomW[number];
int RoomH[number];
int RoomY[number];
int currentRoom;
int x;
int y;
int w;
int h;
bool splitH;
int Min=3; // Минимальная ширина и высота
int Max=6; // Максимальная ширина и высота
 
const int N=20; // Размеры карты по Y (в коде x)
const int M=40; // Размеры карты по Х (в коде y)
 
char grid[N][M];
 
char border='#';
char freeSpace='\0';
char prefab = 'x';
 
void Draw();
bool around(int X,int Y,int W,int H);
bool checkTile(int X,int Y,int W,int H);
void GenerateBorders();
void GenerateRoom();
void GenerateCoridors();
void Sort();
 
int main()
{
    srand(time(0));
    do
    {
        GenerateBorders();
        GenerateRoom();
        if(!step)
            Draw();
 
    }while(_getch()!='x');
    return 0;
}
 
void GenerateBorders(){
 
    for (int i = 0; i < N; i++) {
            for (int j = 0; j < M; j++) {
                if (i == 0 || i ==N-1) {
                    grid [i] [j] = border;
                }
                else if (j == 0 || j == M-1) {
                    grid [i] [j] = border;
                }
                else grid [i] [j] = freeSpace;
            }
        }
 
}
 
void Draw(){
    system("cls");
    for (int i = 0; i < N; i++) {
            for (int j = 0; j < M; j++) {
                    if(j==M-1)
                        cout << grid[i][j] << endl;
                    else cout << grid[i][j];
            }
    }
    if(step){
    cout << "Number of Rooms:" << number << "\nCurrent Room:" << currentRoom;
    cout << "\nSplitH=" << splitH;
    cout << "\nCurrent Width=" << w << "\nCurrent Height=" << h << endl;
 
    }
    if(!step || stop){
    for(int i=0;i<number;i++)
        {
            cout <<i+1 << " Room Coordinates: (X=" << RoomX[i] << " ;Y=" << RoomY[i] << ")"
            <<  " Room Sizes: (W=" << RoomW[i] << " :H=" << RoomH[i] << ")" <<  endl;
        }
    }
    if(stop){
    cout << "Press Any Key to Re-Create Map and X - to Exit";
    }
    if(speed>100)
    {
        speed=100;
    }
    else if(speed<0)
        speed=0;
    Sleep(100-speed);
 
}
 
void GenerateRoom()
{
    for(int a=0;a<number;a++)
    {
    splitH=rand()%100>50;
 
    w=rand()%(Max+1-Min)+Min;
    h=rand()%(Max+1-Min)+Min;
 
    x=rand()%(N-3-w)+1;
    y=rand()%(M-3-h)+1;
 
    if(!splitH)
    {
       int temp;
       temp=w;
       w=h;
       h=temp;
    }
 
    if(checkTile(x,y,w,h) && around(x,y,w,h))
    {
    currentRoom++;
    RoomX[a]=x;
    RoomY[a]=y;
    RoomH[a]=h;
    RoomW[a]=w;
    for(int i=x;i<w+x;i++)
    {
        for(int j=y;j<h+y;j++)
        {
 
            grid[i][j]=prefab;
            if(j==h+y-1 && i==w+x-1 && a==number-1)
                stop=true;
            if(step)
                Draw();               //Расскоментировать, если нужно поэтапная рисовка карты.
        }
    }
    }else a--;
}
currentRoom=0;
 
}
 
bool around(int X,int Y,int W,int H)
{
    bool check;
    for(int i=Y;i<H+Y;i++)
    {
       if(grid[X-1][i]==freeSpace)
            check=true;
        else return false;
    }
    for(int i=Y;i<H+Y;i++)
    {
       if(grid[X+W+1][i]==freeSpace)
            check=true;
        else return false;
    }
    for(int i=X;i<W+X;i++)
    {
       if(grid[i][Y-1]==freeSpace)
            check=true;
        else return false;
    }
    for(int i=X;i<W+X;i++)
    {
       if(grid[i][Y+H+1]==freeSpace)
            check=true;
        else return false;
    }
    return true;
}
 
bool checkTile(int X,int Y,int W,int H)
{
    bool check;
    for(int i=X;i<X+W;i++)
    {
        for(int j=Y;j<Y+H;j++)
        {
            if(grid[i][j]==prefab)
                return false;
            else continue;
        }
    }
    return true;
}
 
void GenerateCoridors()
{
 
 
}
 
void Sort()
{
 
}
Добавлено через 9 минут
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
void Draw(){
    system("cls");
    for (int i = 0; i < N; i++) {
            for (int j = 0; j < M; j++) {
                    if(j==M-1)
                        cout << grid[i][j] << endl;
                    else cout << grid[i][j];
            }
    }
    if(step){
    cout << "Number of Rooms:" << number << "\nCurrent Room:" << currentRoom;
    cout << "\nSplitH=" << splitH;
    cout << "\nCurrent Width=" << w << "\nCurrent Height=" << h << endl;
 
    }
    if(!step || stop){
    for(int i=0;i<number;i++)
        {
            cout <<i+1 << " Room Coordinates: (X=" << RoomX[i] << " ;Y=" << RoomY[i] << ")"
            <<  " Room Sizes: (W=" << RoomW[i] << " :H=" << RoomH[i] << ")" <<  endl;
        }
    }
    if(!step || stop){
    cout << "Press Any Key to Re-Create Map and X - to Exit";
    }
    if(speed>100)
    {
        speed=100;
    }
    else if(speed<0)
        speed=0;
    Sleep(100-speed);
 
}
Небольший фикс функции, не успел отредактировать выше

Добавлено через 14 минут
Модератор, можешь пожалуйста весь код, который я ниже приложу, использовать выше? То есть всё, что выше заменить на этот: А то, я пока уже ошибки в программе нашел, а править нельзя) Спасибо
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
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
#include <iostream>
#include <conio.h>
#include <stdlib.h>
#include <windows.h>
#include <ctime>
 
using namespace std;
 
bool step=false; // Включить или выключить поэтапную рисовку карты
bool stop=false;
int speed=100; // Скорость воспроизведения: 100 - Макс, 0 - Мин
const int number=45; // Число комнат
int RoomX[number];
int RoomW[number];
int RoomH[number];
int RoomY[number];
int currentRoom;
int x;
int y;
int w;
int h;
bool splitH;
int Min=3; // Минимальная ширина и высота
int Max=8; // Максимальная ширина и высота
 
const int N=40; // Размеры карты по Y (в коде x)
const int M=100; // Размеры карты по Х (в коде y)
 
char grid[N][M];
 
char border='#';
char freeSpace='\0';
char prefab = 'x';
 
void Draw();
bool around(int X,int Y,int W,int H);
bool checkTile(int X,int Y,int W,int H);
void GenerateBorders();
void GenerateRoom();
void GenerateCoridors();
void Sort();
 
int main()
{
 
    srand(time(0));
    do
    {
        GenerateBorders();
        GenerateRoom();
        if(!step)
            Draw();
 
    }while(_getch()!='x');
    return 0;
}
 
void GenerateBorders(){
 
    for (int i = 0; i < N; i++) {
            for (int j = 0; j < M; j++) {
                if (i == 0 || i ==N-1) {
                    grid [i] [j] = border;
                }
                else if (j == 0 || j == M-1) {
                    grid [i] [j] = border;
                }
                else grid [i] [j] = freeSpace;
            }
        }
 
}
 
void Draw(){
    system("cls");
    for (int i = 0; i < N; i++) {
            for (int j = 0; j < M; j++) {
                    if(j==M-1)
                        cout << grid[i][j] << endl;
                    else cout << grid[i][j];
            }
    }
    if(step){
    cout << "Number of Rooms:" << number << "\nCurrent Room:" << currentRoom;
    cout << "\nSplitH=" << splitH;
    cout << "\nCurrent Width=" << w << "\nCurrent Height=" << h << endl;
 
    }
    if(!step || stop){
    for(int i=0;i<number;i++)
        {
            if(i%2!=0)
            {
            cout <<i+1 << " Room Coordinates: (X=" << RoomX[i] << " ;Y=" << RoomY[i] << ")"
            <<  " Room Sizes: (W=" << RoomW[i] << " :H=" << RoomH[i] << ")" <<  endl;
            }
            else cout <<i+1 << " Room Coordinates: (X=" << RoomX[i] << " ;Y=" << RoomY[i] << ")"
            <<  " Room Sizes: (W=" << RoomW[i] << " :H=" << RoomH[i] << ")" << "  ";
        }
    }
    if(!step || stop){
    cout << "\n\nPress Any Key to Re-Create Map and X - to Exit";
    }
    if(speed>100)
    {
        speed=100;
    }
    else if(speed<0)
        speed=0;
    Sleep(100-speed);
 
}
 
void GenerateRoom()
{
    for(int a=0;a<number;a++)
    {
    splitH=rand()%100>50;
 
    w=rand()%(Max+1-Min)+Min;
    h=rand()%(Max+1-Min)+Min;
 
    x=rand()%(N-3-w)+1;
    y=rand()%(M-3-h)+1;
 
    if(!splitH)
    {
       int temp;
       temp=w;
       w=h;
       h=temp;
    }
 
    if(checkTile(x,y,w,h) && around(x,y,w,h))
    {
    currentRoom++;
    RoomX[a]=x;
    RoomY[a]=y;
    RoomH[a]=h;
    RoomW[a]=w;
    for(int i=x;i<w+x;i++)
    {
        for(int j=y;j<h+y;j++)
        {
 
            grid[i][j]=prefab;
            if(j==h+y-1 && i==w+x-1 && a==number-1)
                stop=true;
            if(step)
                Draw();               //Расскоментировать, если нужно поэтапная рисовка карты.
        }
    }
    }else a--;
}
currentRoom=0;
 
}
 
bool around(int X,int Y,int W,int H)
{
    bool check;
    for(int i=Y;i<H+Y;i++)
    {
       if(grid[X-1][i]==freeSpace)
            check=true;
        else return false;
    }
    for(int i=Y;i<H+Y;i++)
    {
       if(grid[X+W+1][i]==freeSpace)
            check=true;
        else return false;
    }
    for(int i=X;i<W+X;i++)
    {
       if(grid[i][Y-1]==freeSpace)
            check=true;
        else return false;
    }
    for(int i=X;i<W+X;i++)
    {
       if(grid[i][Y+H+1]==freeSpace)
            check=true;
        else return false;
    }
    return true;
}
 
bool checkTile(int X,int Y,int W,int H)
{
    bool check;
    for(int i=X;i<X+W;i++)
    {
        for(int j=Y;j<Y+H;j++)
        {
            if(grid[i][j]==prefab)
                return false;
            else continue;
        }
    }
    return true;
}
 
void GenerateCoridors()
{
 
 
}
 
void Sort()
{
 
}
Добавлено через 9 часов 51 минуту
Теперь проблема, почему-то при маленьких размерах карт, плитки друг на друга наезжают, хотя я проверку делаю, перед тем как их рисовать.. Запустит кто, потестить? При больших картах - такого не наблюдал.
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
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
#include <iostream>
#include <conio.h>
#include <stdlib.h>
#include <windows.h>
#include <ctime>
 
using namespace std;
 
bool step=true; // Включить или выключить поэтапную рисовку карты
bool stop=false;
bool seeFirst=true; // Левый верхний угол комнаты - включить для отображения
int speed=100; // Скорость воспроизведения: 100 - Макс, 0 - Мин
const int number=5; // Число комнат
int RoomX[number];
int RoomW[number];
int RoomH[number];
int RoomY[number];
int currentRoom;
int x;
int y;
int w;
int h;
bool splitH;
int Min=2; // Минимальная ширина и высота
int Max=3; // Максимальная ширина и высота
 
int distanceX;
int RaycastDir;
int distanceY;
int RaycastStartX;
int RaycastStartY;
 
const int N=10; // Размеры карты по Y (в коде x)
const int M=20; // Размеры карты по Х (в коде y)
 
char grid[N][M];
 
char border='#'; // границы
char freeSpace='\0'; // свободное место
char first='O'; // символ отображения левого верхнего угла комнаты
char prefab = 'X'; // пол
 
int test=0;
 
void Draw();
bool around(int X,int Y,int W,int H);
bool checkTile(int X,int Y,int W,int H);
void GenerateBorders();
void GenerateRoom();
void GenerateCoridors();
void Sort();
void RayCast();
 
int main()
{
    if(number*Min*Max>=N*M)
        exit(0);
    srand(time(0));
    do
    {
        GenerateBorders();
        GenerateRoom();
        RayCast();
        if(!step)
        {
            Draw();
            test=0;
        }
 
    }while(_getch()!='x');
    return 0;
}
 
void GenerateBorders(){
 
    for (int i = 0; i < N; i++) {
            for (int j = 0; j < M; j++) {
                if (i == 0 || i ==N-1) {
                    grid [i] [j] = border;
                }
                else if (j == 0 || j == M-1) {
                    grid [i] [j] = border;
                }
                else grid [i] [j] = freeSpace;
            }
        }
 
}
 
void Draw(){
    system("cls");
    for (int i = 0; i < N; i++) {
            for (int j = 0; j < M; j++) {
                    if(j==M-1)
                        cout << grid[i][j] << endl;
                    else cout << grid[i][j];
                    if(grid[i][j]==freeSpace)
                        test++;
            }
    }
    if(step){
    cout << "Number of Rooms:" << number << "\nCurrent Room:" << currentRoom;
    cout << "\nSplitH=" << splitH;
    cout << "\nCurrent Width=" << w << "\nCurrent Height=" << h << endl;
 
 
    }
    if(!step || stop){
    for(int i=0;i<number;i++)
        {
            if(i%2!=0)
            {
            cout <<i+1 << " Room Coordinates: (X=" << RoomX[i] << " ;Y=" << RoomY[i] << ")"
            <<  " Room Sizes: (W=" << RoomW[i] << " :H=" << RoomH[i] << ")" <<  endl;
            }
            else cout <<i+1 << " Room Coordinates: (X=" << RoomX[i] << " ;Y=" << RoomY[i] << ")"
            <<  " Room Sizes: (W=" << RoomW[i] << " :H=" << RoomH[i] << ")" << "  ";
        }
    }
    if(!step || stop){
    cout << "\nRaycast's X:" << RaycastStartX << " Raycast's Y:" << RaycastStartY << " Raycast's Direction - "<< RaycastDir;
    cout << "\nFree Space now is " << test;
    cout << "\n\nPress Any Key to Re-Create Map and X - to Exit";
    }
    if(speed>100)
    {
        speed=100;
    }
    else if(speed<0)
        speed=0;
    Sleep(100-speed);
 
}
 
void GenerateRoom()
{
    for(int a=0;a<number;a++)
    {
    splitH=rand()%100>50;
 
    w=rand()%(Max+1-Min)+Min;
    h=rand()%(Max+1-Min)+Min;
 
    x=rand()%(N-3-w)+1;
    y=rand()%(M-3-h)+1;
 
    if(!splitH)
    {
       int temp;
       temp=w;
       w=h;
       h=temp;
    }
 
    if(checkTile(x,y,w,h) && around(x,y,w,h))
    {
    currentRoom++;
    RoomX[a]=x;
    RoomY[a]=y;
    RoomH[a]=h;
    RoomW[a]=w;
    for(int i=x;i<w+x;i++)
    {
        for(int j=y;j<h+y;j++)
        {
            if(i==x && j==y && seeFirst)
            {
                grid[i][j]=first;
            }
            else grid[i][j]=prefab;
            if(j==h+y-1 && i==w+x-1 && a==number-1)
                stop=true;
            if(step)
            {
                Draw();               //Расскоментировать, если нужно поэтапная рисовка карты.
                test=0;
            }
        }
    }
    }else a--;
}
currentRoom=0;
 
}
 
bool around(int X,int Y,int W,int H)
{
    bool check;
    for(int i=Y;i<H+Y;i++)
    {
       if(grid[X-1][i]==freeSpace)
            check=true;
        else return false;
    }
    for(int i=Y;i<H+Y;i++)
    {
       if(grid[X+W+1][i]==freeSpace)
            check=true;
        else return false;
    }
    for(int i=X;i<W+X;i++)
    {
       if(grid[i][Y-1]==freeSpace)
            check=true;
        else return false;
    }
    for(int i=X;i<W+X;i++)
    {
       if(grid[i][Y+H+1]==freeSpace)
            check=true;
        else return false;
    }
    return true;
}
 
bool checkTile(int X,int Y,int W,int H)
{
    bool check;
    for(int i=X;i<X+W;i++)
    {
        for(int j=Y;j<Y+H;j++)
        {
            if(grid[i][j]==prefab)
                return false;
            else continue;
        }
    }
    return true;
}
 
void GenerateCoridors()
{
 
 
}
 
void RayCast()
{
    RaycastDir=rand()%3+1;
    int range=0;
    switch(RaycastDir)
    {
    case 1:
        {
            RaycastStartX=RoomX[0];
            range=rand()%RoomH[0];
            RaycastStartY=RoomY[0]+range;
            break;
        }
    case 2:
        {
            RaycastStartY=RoomY[0];
            range=rand()%RoomW[0];
            RaycastStartX=RoomX[0]+range;
            break;
        }
    case 3:
        {
            RaycastStartX=RoomX[0]+RoomW[0]-1;
            range=rand()%RoomH[0];
            RaycastStartY=RoomY[0]+range;
            break;
        }
    case 4:
        {
            RaycastStartY=RoomY[0]+RoomH[0]-1;
            range=rand()%RoomW[0];
            RaycastStartX=RoomX[0]+range;
            break;
        }
    }
    grid[RaycastStartX][RaycastStartY]='@';
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
26.01.2018, 12:01
Ответы с готовыми решениями:

Генератор карт в консоли, с ASCII симолами
Сделал свой первый небольшой, но интересный проект, генератор карт в консоли. Генератор генерирует комнаты и коридоры, которые соединяют...

Вывод мастей карт через ASCII
Здравствуйте, имеется такой код: // Random_cards.cpp: определяет точку входа для консольного приложения. // #include...

Написать генератор карт для игры «сапёр».
Написать генератор карт для игры «сапёр». Карта размером NxM. Формат ввода Каждая строка содержит два натуральных числа разделённых...

47
13 / 15 / 5
Регистрация: 16.10.2016
Сообщений: 206
26.01.2018, 12:29
Вопрос почему иногда программа перестает работать, даже если нажал не на х а на f?
QtCreator
0
 Аватар для Abomination_25
4 / 4 / 0
Регистрация: 13.12.2016
Сообщений: 246
26.01.2018, 12:33  [ТС]
Вы о чём?
0
13 / 15 / 5
Регистрация: 16.10.2016
Сообщений: 206
26.01.2018, 12:35
Цитата Сообщение от Abomination_25 Посмотреть сообщение
splitH
Что делает эта переменная?

Добавлено через 43 секунды
Цитата Сообщение от Abomination_25 Посмотреть сообщение
Вы о чём?
об этом, не заметил сначала что вы уже писали об этой проблеме
Цитата Сообщение от Abomination_25 Посмотреть сообщение
Да, и программа иногда фризится почему-то без ошибок вообще
0
 Аватар для Abomination_25
4 / 4 / 0
Регистрация: 13.12.2016
Сообщений: 246
26.01.2018, 12:42  [ТС]
Радостная величина 50 на 50. Меняет местами ширину и высоту.

Добавлено через 2 минуты
Я понимаю, что программа не идеал, и нужно продумать все условия ещё, что бы не было фризов, то есть максимальное значение комнат и их габариты, в зависимости от размера карты. Пока что у меня при размерах карты маленьких порядка 10х20 и комнатах равных 5. Происходит накоадывание друг на друга, хотя даже при размерах 60х100 такого не было. Функция, которая проверяет на пересечение - checkTiles()

Добавлено через 37 секунд
Лол, не "Радостная", а рандомная величина

Добавлено через 1 минуту
Я сделал пока только небольшую проверку вначале, но она точно не может предсказать фриз
0
13 / 15 / 5
Регистрация: 16.10.2016
Сообщений: 206
26.01.2018, 12:43
Я думаю фриз может происходить из-за бесконечного цикла. Скоре всего где то, там где цикл зависит от рандомной переменной, так как фризится рандомно.
0
 Аватар для Abomination_25
4 / 4 / 0
Регистрация: 13.12.2016
Сообщений: 246
26.01.2018, 12:48  [ТС]
Ну split точно не влияет, так координаты начальные учитывают ширину и высоту. То есть проблема не знаю в чём, я могу прокомментировать любую часть кода, если нужно. Там можно пробовать разные параметры вверху ставить перед запуском

Добавлено через 1 минуту
То есть сначала генерируется ширина и высота, в только потом уже в зависимости от этих параметров начинается поиск координат, при которых такую комнату можно построить,

Добавлено через 42 секунды
Если что, код берите из последнего апдейтв, где я про фризы указал, так я уже наложил туда несколько кодов
0
13 / 15 / 5
Регистрация: 16.10.2016
Сообщений: 206
26.01.2018, 13:24
Код беру из последнего апдейта.
Если сможете напишете комментарии которые всеми коду, я пока что тоже новичок, а больше вам никто не помогает, так что будем вместе разбираться)

Добавлено через 22 минуты
Нашел проблему фриза.
Фриз происходит при рисовании последней комнаты. Если рандом генерирует комнату, но она не может поместиться, то он не может ее вместить и зависает. Я вижу в вашем коде есть проверка на то если комната не помещается, то он генерирует заново, в ней нужно что-то исправить, посмотрите, я просто в вашем коде пока-что не разобрался

Добавлено через 9 минут
Нашел проблему почему пересекаются комнаты:
В функции checkTile:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
bool checkTile(int X,int Y,int W,int H)
{
    bool check;
    for(int i=X;i<X+W;i++)
    {
        for(int j=Y;j<Y+H;j++)
        {
            if(grid[i][j]==prefab || grid[i][j] == first) // я добавил нужную проверку
                return false;
            else continue;
        }
    }
    return true;
}
Вы проверяете на то плитка == Х или нет, но забыли проверить на == О, поэтому всегда проблема была только с верхним углом.
0
 Аватар для Abomination_25
4 / 4 / 0
Регистрация: 13.12.2016
Сообщений: 246
26.01.2018, 13:40  [ТС]
Ого, спасибо, я вчера ночью писал его, уже видимо совсем про все условия проверки забыл, давайте вместе разбираться) Я сейчас не дома, но как приду - внесу фикс в свой код, и останется провести коридоры между комнат, пока думаю как реализовать это, и да, я перепишу весь код с комментариями для вас и скину, но увы только, как буду дома)
0
13 / 15 / 5
Регистрация: 16.10.2016
Сообщений: 206
26.01.2018, 13:42
Всегда рад помочь!))
Буду ждать вашего кода
0
 Аватар для Abomination_25
4 / 4 / 0
Регистрация: 13.12.2016
Сообщений: 246
26.01.2018, 13:48  [ТС]
Ааа, проблема понятна, вчера её не было, только потому, что не было ещё этого символа first Я его для себя добавил, что различать начальную координаты комнаты) видимо, я добавил это символ в отрисовку, а в исключение забыл) Я сейчас думаю, как же можно все дело соединить между собой... Думал пускать как бы луч, в случайном направлении, и в зависимости о направления отправлю точку брать как одну из четырёх границ (граней комнаты) и от туда на дистанцию равную расстоянию до границ карты пускать. Если пересечение было, то выстроить новый символ по этому пути.., но тогда коридоры будут только прямыми, без букв ""г"

Добавлено через 1 минуту
Сейчас функция Raycast() только для первой комнаты работает и рисует точку, откуда нужно пускать луч

Добавлено через 25 секунд
Только код я ещё не запостил вроде (
0
13 / 15 / 5
Регистрация: 16.10.2016
Сообщений: 206
26.01.2018, 13:56
не очень понял ваше обьяснения, конечно, но думаю разберемся)
0
 Аватар для Abomination_25
4 / 4 / 0
Регистрация: 13.12.2016
Сообщений: 246
26.01.2018, 16:45  [ТС]
Я позже объясню, сейчас комментарии написал, как дома буду - скину

Добавлено через 1 час 59 минут
Update: Теперь буду думать как соединить эти комнаты...
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
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
#include <iostream>
#include <conio.h>
#include <stdlib.h>
#include <windows.h>
#include <ctime>
 
using namespace std;
 
bool step=0;                // Включить или выключить поэтапную рисовку карты
bool stop=false;            // Переменая, которая позволяет выводить определенный текст только после последней итерации для последней комнаты
bool seeFirst=true;         // Левый верхний угол комнаты - включить для отображения
 
int speed=100;              // Скорость воспроизведения: 100 - Макс, 0 - Мин
 
int test=0;             // Вспомогательный счётчик для отображения свободного места на карте
 
const int N=60;         // Размеры карты по Y (в коде x)
const int M=100;         // Размеры карты по Х (в коде y)
char grid[N][M];        // Массив карты из символов
 
const int number=25;    // Число комнат
 
int Min=5;              // Минимальная ширина и высота комнаты
int Max=11;              // Максимальная ширина и высота комнаты
 
 
struct Room
{
    int X;                // Структура комнаты. Для хранения данных о комнате.
    int Y;
    int W;
    int H;
};
 
 
Room room[number];        // Создание массива Room в зависимости от числа комнат
 
int currentRoom;           // Счетчик для отображение, какая комната сейчас рисуется( для поэтапного рисования)
 
int x;                     // Временные кординаты и габариты комнаты( в будущем можно почистить код и убрать лишнее)
int y;
int w;
int h;
 
bool splitH;                // Переменная, которая с вероятностью 50 на 50 меняет значения габаритов между собой.
 
 
int distanceX;  // Переменные, которые будут использоваться для текущего расстояния до границы карты '#';
int distanceY;
 
int RaycastDir;      // Направление луча ( рандомно генерируется )
int RaycastStartX;   // Стартовая позиция для луча по Х
int RaycastStartY;   // Стартовая позиция для луча по Y
 
// Символы для отображения:
 
char border='#'; // границы
char freeSpace='\0'; // свободное место
char first='O'; // символ отображения левого верхнего угла комнаты
char prefab = 'X'; // пол
 
 
 
void Draw();                                      // Функция отрисовка карты
bool around(int X,int Y,int W,int H);  // Проверка на минимальное расстояния, чтобы комнат были на расстояния минимум 1 клетки
bool checkTile(int X,int Y,int W,int H);          // Проверка на пересечение текущей комнаты , с уже созданными
void GenerateBorders();                     // Генерация границ карты и пустого места внутри границ
void GenerateRoom();                        // Генерация комнат
void GenerateCoridors();                    // Генерация коридоров ( пока не реализовано :D
void Sort();                                // Думал отсортировать массив Room[number], чтобы уже потом соединить комнаты, но пока
void RayCast();         // Функция бросания луча
 
int main()
{
    if(number*Min*Max>=N*M )    // Пока что только такое условия проверки, чтобы совсем уж диких чисел вначале польщователь не задал
        exit(0);
    srand(time(0));            // Строка пощволяет генерировать каждый раз новые числа ( иначе буду повторения );
    do
    {
        GenerateBorders();     // Главный цикл программы
        GenerateRoom();
        RayCast();
        if(!step)              // Проверка на истинность. Если step=1 => Включается поэтапная рисовка, else => срабатывает этот код ниже
        {
            Draw();
            test=0;            // сбрасывание счётчка Свободного места
        }
 
    }while(_getch()!='x');      // Цикл работает до тех пор, пока не будет нажата клавиша X в анлийской раскладке
    return 0;
}
 
void GenerateBorders(){                            // Функция генерации границ карты и пустого места внутри
 
    for (int i = 0; i < N; i++) {
            for (int j = 0; j < M; j++) {
                if (i == 0 || i ==N-1) {
                    grid [i] [j] = border;
                }
                else if (j == 0 || j == M-1) {
                    grid [i] [j] = border;
                }
                else grid [i] [j] = freeSpace;
            }
        }
 
}
 
void Draw(){                          // Функция отрисовки карты
    system("cls");
    for (int i = 0; i < N; i++) {
            for (int j = 0; j < M; j++) {
                    if(j==M-1)
                        cout << grid[i][j] << endl;
                    else cout << grid[i][j];
                    if(grid[i][j]==freeSpace)
                        test++;                         // Заполнение счётчика, если текушая клетка совпала с пустой клеткой
            }
    }
    if(step){       // Выводится,только если включена поэтапная рисовка
    cout << "Number of Rooms:" << number << "\nCurrent Room:" << currentRoom;
    if(splitH)
    cout << "\nSplitH is true";
    else cout << "\nSplitH is false";
    cout << "\nCurrent Width=" << w << "\nCurrent Height=" << h << endl;
 
 
    }
    if(!step || stop){           // Выводится, только если выключена поэтапная рисовка или в конце программы
    for(int i=0;i<number;i++)
        {
            if(i%2!=0)
            {
            cout <<i+1 << " Room Coordinates: (X=" << room[i].X << " ;Y=" << room[i].Y << ")"
            <<  " Room Sizes: (W=" << room[i].W << " :H=" << room[i].H << ")" <<  endl;
            }
            else cout <<i+1 << " Room Coordinates: (X=" << room[i].X << " ;Y=" << room[i].Y << ")"
            <<  " Room Sizes: (W=" << room[i].W << " :H=" << room[i].H << ")" << "  ";
        }
    }
    if(!step || stop){          // Выводится, только если выключена поэтапная рисовка или в конце программы
    cout << "\nRaycast's X:" << RaycastStartX << " Raycast's Y:" << RaycastStartY << " Raycast's Direction - "<< RaycastDir;
    cout << "\nFree Space now is " << test;
    cout << "\n\nPress Any Key to Re-Create Map and X - to Exit";
    }
    if(speed>100)
    {
        speed=100;         // Фиксация максимаильной и минимальной скорости
    }
    else if(speed<0)
        speed=0;
    Sleep(100-speed);           // Функция, задерживающий экран
 
}
 
void GenerateRoom()              // Функция генерации комнат
{
    for(int a=0;a<number;a++)    // Гланвый цикл функции - рабоает number-1 раз
    {
    splitH=rand()%100>50;        // 50 на 50, что габариты поменяеются местами
 
    w=rand()%(Max+1-Min)+Min;    // Рандомные значение для ширины и высоты
    h=rand()%(Max+1-Min)+Min;
 
    x=rand()%(N-3-w)+1;         // в зависимости от габаритов создаются такие координаты, которые позволят разместить комнату
    y=rand()%(M-3-h)+1;         // с заданными выше габаритами
 
    if(!splitH)                 // Меняем местами габариты
    {
       int temp;
       temp=w;
       w=h;
       h=temp;
    }
 
    if(checkTile(x,y,w,h) && around(x,y,w,h)) // Проверка на свободное место вокруг будущей команты и проверка на пересечение
    {                                         // с уже имеющимися комнатами
    currentRoom++;        // увеличиваем счётчик комнат
    room[a].X=x;
    room[a].Y=y;          // Записываем текущие координат и габариты в массив Room
    room[a].H=h;
    room[a].W=w;
    for(int i=x;i<w+x;i++)     // Генерируем саму комнату по вычисленным выше параметрам
    {
        for(int j=y;j<h+y;j++)
        {
            if(i==x && j==y && seeFirst)       // Отрисовка первой координаты команты
            {
                grid[i][j]=first;
            }
            else grid[i][j]=prefab;
            if(j==h+y-1 && i==w+x-1 && a==number-1)
                stop=true;
            if(step)            // Поэтапная рисовка карты
            {
                Draw();
                test=0;         // Обнуление счётчика
            }
        }
    }
    }else a--; // Если не прошло условие проверки, то уменьшаем переменную счётчик цикла for
}              // чтобы количество комнат совпало с заданным в number
currentRoom=0; // Обнуляем счётчик текущей комнаты
 
}
 
bool around(int X,int Y,int W,int H) // Функция проверки на свободное место вокруг будущей комнаты
{
    bool check;
    for(int i=Y;i<H+Y;i++)
    {
       if(grid[X-1][i]==freeSpace)
            check=true;
        else return false;
    }
    for(int i=Y;i<H+Y;i++)
    {
       if(grid[X+W+1][i]==freeSpace)
            check=true;
        else return false;
    }
    for(int i=X;i<W+X;i++)
    {
       if(grid[i][Y-1]==freeSpace)
            check=true;
        else return false;
    }
    for(int i=X;i<W+X;i++)
    {
       if(grid[i][Y+H+1]==freeSpace)
            check=true;
        else return false;
    }
    return true;
}
 
bool checkTile(int X,int Y,int W,int H) // Функция проверки на пересчение с уже имеющимися комнатами
{
    bool check;
    for(int i=X;i<X+W;i++)
    {
        for(int j=Y;j<Y+H;j++)
        {
            if(grid[i][j]==prefab || grid[i][j] == first)
                return false;
            else continue;
        }
    }
    return true;
}
 
void GenerateCoridors()  // Пока тут ничего
{
 
 
}
 
void RayCast()        // Пускание лучей
{
    RaycastDir=rand()%3+1;
    int range=0;
    switch(RaycastDir)
    {
    case 1:
        {
            RaycastStartX=room[0].X;
            range=rand()%room[0].H;
            RaycastStartY=room[0].Y+range;
            break;
        }
    case 2:
        {
            RaycastStartY=room[0].Y;
            range=rand()%room[0].W;
            RaycastStartX=room[0].X+range;
            break;
        }
    case 3:
        {
            RaycastStartX=room[0].X+room[0].W-1;
            range=rand()%room[0].H;
            RaycastStartY=room[0].Y+range;
            break;
        }
    case 4:
        {
            RaycastStartY=room[0].Y+room[0].H-1;
            range=rand()%room[0].W;
            RaycastStartX=room[0].X+range;
            break;
        }
    }
    grid[RaycastStartX][RaycastStartY]='@';
}
0
13 / 15 / 5
Регистрация: 16.10.2016
Сообщений: 206
26.01.2018, 18:53
Посмотрел ваш код, полностью разобрался, есть моменты которые заинтересосвали:
1. В функции Draw()
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
for(int i=0;i<numberOfRooms;i++) {
        if(i%2!=0) {
            cout << i+1
                << " Room Coordinates: (X="
                << room[i].X
                << " ;Y="
                << room[i].Y
                << ")"
                << " Room Sizes: (W="
                << room[i].W
                << " :H="
                << room[i].H
                << ")"
                << endl;
        } else cout << i+1
                << " Room Coordinates: (X="
                << room[i].X
                << " ;Y="
                << room[i].Y
                << ")"
                << " Room Sizes: (W="
                << room[i].W
                << " :H="
                << room[i].H
                << ")"
                << "  ";
        }
    }
Зачем нужен if если код идентичен и в if и в else?

2. Функция RayCast(),
C++
1
RaycastDir=rand()%3+1;
здесь генерируются числа только от 1 до 3, а не до 4.
Может быть я не правильно понял?

-------------------------------------------------------------------------------------------------------------------------------------

Мои улучшения:
1. Улучшил проверку в main, теперь не должно быть фриза из-за бесконечного цикла
C++
1
2
3
4
if((numberOfRooms*Max*2) + (numberOfRooms * Max * 4)>=N*M ) { // Добавил в проверку подсчет пустого пространства тоже
        cout << "Слишком большие числа numberOfRooms, Max";
        return 0;
    }
На счет коридоров пока идей нету.
0
 Аватар для Abomination_25
4 / 4 / 0
Регистрация: 13.12.2016
Сообщений: 246
26.01.2018, 20:05  [ТС]
Сейчас гляну, как только комп включу)

Добавлено через 1 час 8 минут
1) два if - только потому, что бы сильно текст вниз не уходил, я перенос делаю после написания двух комнат подряд. Иначе бы список комнат вниз очень сильно уходил и карту почти не видно было бы
2)По поводу rand()%3+1 - я очень сильно запутался с этим, по идеи rand()%a - дает числа от 0 до a. То есть по логике rand()%3 дает от 0 до 3, и смещаем всё на 1? Я не прав? Просто на всех сайтах про rand() так, хотя когда тестил, тоже заметил, что 4 никогда не попадается.
3)Вот про проверку спасибо) Очень выручили с этим условием, еще бы научить программу выставлять минимальные значения, а не выходить из программы,если условие не выполняется)
4) Про коридоры:
Было две идеи: От сортировать координаты комнат, а потом последовательно их соединять или же как я пытался, пускать как невидимые лучи на расстояние и если пересечение с комнатой было, то строить путь по этому лучу.

Не объясните формулу для проверки программы вначале ?
0
13 / 15 / 5
Регистрация: 16.10.2016
Сообщений: 206
26.01.2018, 20:18
1.Перенос можно сделать проще
C++
1
"Какой-то текст" << "\t\n"[i%2!=0]
Выражение внутри квадратных скобок вычисляется и используется как индекс строки "\t\n", и если выражение даёт false то 0 элемент строки, а если true, то 1 элемент.
2.rand() генерирует число от 0 до RAND_MAX (константа указана в том же файле что и функция rand(), ее значение не помню)
Потом мы берём остаток от деления этого числа на 3, Например (11%3=3 остаток 2). Короче считайте чтобы получить число от a до b вам нужна формула
C++
1
rand()%(a+1) +b
3. Минимальные значения задать можно ввиде любых устраивающих вас констант и в else устанавливать значения из этих констант.
4. На счёт соединений комнат, подумаю как это сделать, может сегодня, может завтра отпишусь.
P.S. можем обменяться контактными данными, чтобы учиться вместе, ведь так продуктивнее)
0
 Аватар для Abomination_25
4 / 4 / 0
Регистрация: 13.12.2016
Сообщений: 246
26.01.2018, 20:35  [ТС]
Я так понимаю, логичнее всего будет сортировка + как я почитал - графы или очереди реализовать. Только сортировка по Х делать или же по Y? Мне надо слево сверху направо вниз реализовать скорее всего, а дальше уже графы или очереди
P.S Можно обменяться, только чем конкретно?) Skype, или что-то еще?
Да, а формулу не подскажете как получили эту?
C++
1
2
3
4
if((numberOfRooms*Max*2) + (numberOfRooms * Max * 4)>=N*M ) { // Добавил в проверку подсчет пустого пространства тоже
        cout << "Слишком большие числа numberOfRooms, Max";
        return 0;
    }
Добавлено через 15 минут
Я так понимаю, логичнее всего будет сортировка + как я почитал - графы или очереди реализовать. Только сортировка по Х делать или же по Y? Мне надо слево сверху направо вниз реализовать скорее всего, а дальше уже графы или очереди
P.S Можно обменяться, только чем конкретно?) Skype, или что-то еще?
Да, а формулу не подскажете как получили эту?
C++
1
2
3
4
if((numberOfRooms*Max*2) + (numberOfRooms * Max * 4)>=N*M ) { // Добавил в проверку подсчет пустого пространства тоже
        cout << "Слишком большие числа numberOfRooms, Max";
        return 0;
    }

У меня проверка была на самый худший случай То есть Число комнат умноженная на площадь комнаты с максимальными габаритами. То есть number*pow(Max,2) - еще ведь для каждый комнаты нужно учесть вокруг свободные клетки, то есть (Max+1)*4?; Я понял почему у вас второе слагаемое такое, только мне кажется Max+2 даже, ведь чтобы обойти вокруг комнату, нужно снести координаты на 1 во все стороны.

Как бы так:

oooo
oxxo
oxxo
oooo

ooooo
oxxxo
oxxxo
oxxxo
ooooo


Было Max=2; А длина свободного пространства(символ o) уже равна..хммм... (Max+2)*2+Max*2?? Ой запутался...
А первое слагаемое это ведь должна быть сама комната? То есть в худшем случае равна number*pow(Max,2);

То есть финальная формула: Правда только для квадратов, потому, что для разных длин уже другая формула нужна будет
C++
1
2
3
4
5
 if(number*pow(Max,2)+(Max+2)*2+Max*2 > N*M)       
{
cout << "Change Max or Number value" << endl;
return 0; // или exit(0);
}
0
13 / 15 / 5
Регистрация: 16.10.2016
Сообщений: 206
26.01.2018, 20:42
Я ни графы, ни очереди пока что не знаю. Но есть чуток другая идея.
У каждой комнаты может быть или два или один коридора,
Бежим по карте сверху вниз и ищем О(начало первой комнаты) потом ищем следующую комнату. Берём рандоиные стороны этих комнат и соединяем. (Над реализацией надо ещё подумать, но зато можно попробовать сделать не только прямые коридоры)

Формула:
Сначала вычисляю общую площадь которую занимают комнаты: количество комнат * максимальная высота/ширина комнаты * 2(ведь максимально большая комната квадратная),
Потом вычисляю количество свободного пространства вокруг каждой комнаты которое должно остаться (в вашем случае вы сделали по 1 клетке с каждой стороны) получается 4 стороны * максимальную длину комнату * количество комнат)

Контакты: Viber, telegram - +992987632082, Skype (пока нету но могу зарегистрироваться), Пользуетесь ли вы Slack?
0
 Аватар для Abomination_25
4 / 4 / 0
Регистрация: 13.12.2016
Сообщений: 246
26.01.2018, 21:25  [ТС]
Нет, но сейчас создал, думаю подойдет для этого: alicewithalex.slack.com

Добавлено через 3 минуты
Можно, но тогда, раз прямые коридоры, то координаты этих двух комнат, то есть те места, где будет коридор начинаться - должны быть равны. Кстати, координаты "O" Уже есть у меня в массиве Room, только их бы отсортировать... Тогда поиском можно не заниматься, а просто соединять. Можно попробовать, Лишь бы смотрелось внешне это еще, ведь мне это потом в Unity переносить
0
13 / 15 / 5
Регистрация: 16.10.2016
Сообщений: 206
26.01.2018, 21:34
Отправьте мне приглашение в ваше рабочее пространство в Slack.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.01.2018, 21:34
Помогаю со студенческими работами здесь

Генератор карт через структуру (список), странная ошибка, не понимаю в чём дело
Есть значит у меня структура, в которой храниться Id, вес карты, и ссылка на картинку в программе. Я её запоняю, сразу в функции...

Колода карт из 36 карт, сколькими способами можно достать 5 карт?
Колода карт из 36 карт. Сколькими способами можно достать 5 карт так, чтобы среди них были пиковые карты?

Из колоды карт (36 карт) наудачу берут пять карт
Здравствуйте! С теорией вероятностей всегда имел проблему, не могу никак сообразить. Задание такое: Из колоды карт (36 карт) наудачу...

Сложный проект "Генератор карт для Valve Hammer Editor"
:yahoo: ну... сложный для меня :) хотел сразу c++ использовать , но мне повезло и проект C++ не захотел создаваться...

В урне 10 белых,3 черных и 5 красных шаров // Из колоды карт,в которой 36 карт
1. В урне 10 белых,3 черных и 5 красных шаров. Наугад вынимают 2 шара. Какова вероятность того, что среди них нет белых шаров? 2. Из...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru