Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.80/25: Рейтинг темы: голосов - 25, средняя оценка - 4.80
1 / 1 / 0
Регистрация: 19.12.2017
Сообщений: 105

Морской бой. Первая программа

25.01.2020, 11:11. Показов 6139. Ответов 66

Студворк — интернет-сервис помощи студентам
Здравствуйте.
Я начинающий в С++. Занимаюсь около 2 месяцев.
Попробовал написать впервые игру "Морской бой".
Пошел по пути применения функций. Без указателей. Хочу, пока, разобраться для себя так.
На лишние подключения в начале программы (до Маин) прошу не обращать внимание (такой у меня шаблон перед созданием всех проектов) потом уберу лишнее.

Интуитивно вижу, что кода слишком много.
Буквы слева по вертикали от полей поставить смог, но пока не ставлю, для удобности ввода координат при тестах.

Пока реализовал только:
- функции автоматической и ручной расстановки кораблей;
- функции вывода на экран полей противников;
- не повторение выстрелов Компьютера в одни и те же точки;
- завершение программы после набора 20 попаданий одним из противников....

Работаю над:
- внешним видом кода;
- внешним видом игры;
- функцией обстрела Компьютером только ближних точек вокруг последнего попадания;
- другими недоработками.

Буду признателен за критику (которой, чувствую, будет много) и за рекомендации.
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
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
#include "pch.h"
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <fstream>
#include <time.h>
#include <windows.h>
#pragma warning(disable : 4996)
using namespace std;
 
// Все массивы созданы размером 14 х 14 ячеек. Хотя работа происходит только с участком 10х10. Это сделано для того, что бы программа не заступала на поля с противоположной стороны.
// Например, при проверка занятых полей, программа проверяет поле (а - 1) или (b - 1), при том, что a или b равны 0.
// В данном случае проверяется поле 10, а там может стоять другой корабли и решение будет ошибочным.
// Массив больших размеров специально заполнен 0, что бы при выходе за границы массива, программа видела только 0.
 
void Print(int mas[14][14]); // Функция печати поля с кораблями
void ARastan(int mas[14][14]); // Функция Автоматической расстановки
void RRastan(int mas[14][14]); // Функция ручной расстановки
 
int main()
{
    srand(time(NULL));
    int DMK[14][14];
    int DMI[14][14];
 
    cout << "   \nOTKROYTE OKNO POLNOSTYU.\n" << endl; // Просьба открыть окно консоли полностьб для удобства
    system("pause");
    system("cls");
 
    cout << "\n    KOMPUTER RASSTAVIL KORABLI I GOTOV K IGRE.\n ";
    ARastan(DMK);    // Автоматическая расстановка кораблей Компьютера
    Print(DMK);
 
    cout << "\n    POLE IGROKA:  1 - RUCHNAYA RASSTANOVKA,   2 - AVTOMATICHESKAYA RASSTANOVKA.\n";
    int VRI=3;      // Вариант расстановки кораблей Игрока ( Ручная / Автоматическая)   
    while (VRI !=1 && VRI !=2)
    { 
        cin >> VRI;     //Только 1 или 2
    }
    system("cls");
    if (VRI == 1) RRastan(DMI);     // Ручная расстановка кораблей Игрока 
    if (VRI == 2) ARastan(DMI);     // Автоматическая расстановка кораблей Игрока
    cout << "\n\n    POLE IGROKA:\n ";    
    Print(DMI);
    system("pause");
    system("cls");
 
    int DMS[14][14]; // Заполнение нолями поля стрельбы Игрока
    for (int i = 0; i < 13; i++)
    {
        for (int j = 0; j < 13; j++) DMS[i][j] = 0;
    }
    int a = 0, b = 0, c, d, countK = 1, countI = 1, indpi = 1, indpk = 1, indikranil = 0, indikubil = 0, VV, tc, td, countPK=0, countPI=0;
 
    while ((countK == 1 && countI == 1) && (a != 777 || b != 777)) // Основное тело программы
    {
        system("pause");
        system("cls");
        cout << "    POLE IGROKA: \n";      // Вывод на экран поля Игрока
        Print(DMI);
        cout << "\n    POLE KOMPUTERA: \n";     // Вывод на экран поля стрельбы Игрока
        Print(DMS);
 
        while (indpi == 1)
        {
            int start = 1;
            while (start == 1) // Цикл проверки ввода толлько допустимых значений координат выстрела или выхода из игры
            {
                cout << "    VISTREL IGROKA (PERVAYA CIFRA 1 - 10 - VISOTA, VTORAYA 1 - 10 - DLINA). ILI 777,777 - EXIT " << endl;
                cin >> a >> b;
                if (a >= 1 && a <= 10 && b >= 1 && b <= 10 || a == 777 || b == 777) start = 0;
                else start = 1;
            }
            a--;    // Уменьшение на 1 значений введенных координат
            b--;
            system("cls");
            // Корабли противников обозначены на карте 1, попадания обозначены 2, промахи - 5
            if (DMK[a][b] == 1)     // Если попал
            {
                DMK[a][b] = 2;
                DMS[a][b] = 2;
                cout << "    POLE IGROKA: \n";
                Print(DMI);
                cout << "\n    POLE KOMPUTERA: \n";
                Print(DMS);
                if (DMK[a - 1][b] == 1 || DMK[a + 1][b] == 1 || DMK[a][b - 1] == 1 || DMK[a][b + 1] == 1)
                {
                    cout << "\n    REZULTATI STRELBI IGROKA: POPAL - RANIL \n ";
                }
                else cout << "\n    REZULTATI STRELBI IGROKA: POPAL - UBIL \n";
                indpi = 1;
                countPI++; // Счетчик попаданий Игрока (не более 20)
                if (countPI == 20) break;
            }
 
            else     // Если промахнулся
            {
                DMS[a][b] = 5;
                DMK[a][b] = 5;
                cout << "    POLE IGROKA: \n";
                Print(DMI);
                cout << "\n    POLE KOMPUTERA: \n";
                Print(DMS);
                cout << "\n    REZULTATI STRELBI IGROKA: NE POPAL \n";
                indpi = 0;
            }
        }
        indpi = 1; // Индикатор попадания Игроком
 
        cout << "\n    SLIEDUUSHIY HOD KOMPUTERA " << endl;
 
 
        // Здесь начнется ход компьютера
 
        while (indpk == 1)
        {
            cout << "   VISTREL KOMPUTERA  " << endl;
            int indpovt = 1;
 
            while (indpovt == 1)
            {
                indpovt = 0;
                c = rand() % 10;     //  Компьютер делает первые выстрелы полностью случайными
                d = rand() % 10;
                if (DMI[c][d] == 2 || DMI[c][d] == 5) indpovt = 1;
            }
 
            system("pause");
            system("cls");
 
            if (DMI[c][d] == 1)     // В случае попадания
            {
                DMI[c][d] = 2;
                cout << "    POLE IGROKA: \n";
                Print(DMI);
                cout << "\n    POLE KOMPUTERA: \n";
                Print(DMS);
                if (DMI[c - 1][d] == 1 || DMI[c + 1][d] == 1 || DMI[c][d - 1] == 1 || DMI[c][d + 1] == 1)
                {
                    cout << "\n    REZULTATI STRELBI KOMPUTERA: POPAL - RANIL \n ";
                }
                else
                {
                    cout << "\n    REZULTATI STRELBI KOMPUTERA: POPAL - UBIL \n";
                }
                indpk = 1;
                countPK++;
                if (countPK == 20) break;
            }
 
            else    //  В случае промаха
            {
                DMI[c][d] = 5;
                cout << "    POLE IGROKA: \n";
                Print(DMI);
                cout << "\n    POLE KOMPUTERA: \n";
                Print(DMS);
                cout << "\n    REZULTATI STRELBI KOMPUTERA: NE POPAL \n";
                indpk = 0;
            }
        }
        indpk = 1; // Индикатор попадания Компьютером
        countK = 0;
        countI = 0;
        for (int l = 0; l < 10; l++)
        {
            for (int m = 0; m < 10; m++)
            {
                if (DMK[l][m] == 1) countK = 1;    // НЕ работает выход из игры по концу кораблей....
                if (DMI[l][m] == 1) countI = 1;
            }
        }
            if (countPK == 20)
            {
                  cout << "\n    IGRA OKONCHENA   POBEDIL KOMPUTER \n\n";
                  system("pause");
                  countK = 0;
            }
            if (countPI == 20)
            {
                  cout << "\n    IGRA OKONCHENA   POBEDIL IGROK \n\n";
                  system("pause");
                  countI = 0;
            }            
    }
}
 
void RRastan(int masi[14][14])
{
    for (int i = 0; i < 10; i++) { // Расстановка нолей
        for (int j = 0; j < 10; j++)
            masi[i][j] = 0;
    }
 
    cout << endl;
 
    Print(masi);
 
    cout << "\n    RAZMESTITE KORABLI : 1 - 4xPALUBI, 2 - 3xPALUBI, 3 - 2xPALUBI, 4 - 1xPALUBI\n";
    cout << "\n    KOORDINATI A, B, C, D, E, F, G, H, I, J i ciframi 1, 2, 3, 4, 5, 6, 7, 8, 9, 10\n";
 
 
    int sign4 = 0, sign3 = 0, sign2 = 0, sign1 = 0;
    while (sign4 != 1 && sign3 != 2 && sign2 != 3 && sign1 != 4)
    {
        int count4 = 0;
        while (sign4 != 1)  // Заполнение четырехпалубными
        {
            cout << "\n    VVOD 4xPALUBNOGO - 1 SHT.: " << endl; // Расстановка 4 палубного
            cout << "    NAPRAVLENIE KORABLYA (1 - VPRAVO, 2 - VNIZ): ";
            int NAPR = 0, i = 0, j = 0, ti = 0, tj = 0, a, b;
            cin >> NAPR;
            cout << "    KOORDINATI PERVOY PALUBI: ";
            cin >> i >> j;
            i--;
            j--;
            ti = i;
            tj = j;
            sign4 = 0;
 
            if (NAPR == 1)
            {
                count4 = 0;
                for (int i = ti - 1; i <= ti + 1; i++)
                {
                    for (int j = tj - 1; j <= tj + 4; j++)
                    {
                        if ((masi[i][j] != 1) || (i < 0 || i>9 || j < 0 || j>9))  count4++;
                    }
                }
 
                if (count4 == 18 && j < 7) {
                    masi[i][j] = 1;
                    masi[i][j + 1] = 1;
                    masi[i][j + 2] = 1;
                    masi[i][j + 3] = 1;
                    sign4 = 1;
                }
            }
 
            if (NAPR == 2)
            {
                count4 = 0;
                for (int i = ti - 1; i <= ti + 4; i++)
 
                    for (int j = tj - 1; j <= tj + 1; j++)
                    {
                        if ((masi[i][j] != 1) || (i < 0 || i>9 || j < 0 || j>9)) count4++;
                    }
 
                if (count4 == 18 && i < 7) {
                    masi[i][j] = 1;
                    masi[i + 1][j] = 1;
                    masi[i + 2][j] = 1;
                    masi[i + 3][j] = 1;
                    sign4 = 1;
                }
            }
            system("cls");
            Print(masi);
        }
 
        int sign3 = 0;
        int count3 = 0;
        while (sign3 != 2)  // Заполнение трехпалубными
        {
            cout << "\n    VVOD 3xPALUBNOGO - 2 SHT.: " << endl; // Расстановка 3 палубных
            cout << "    NAPRAVLENIE KORABLYA (1 - VPRAVO, 2 - VNIZ): ";
            int NAPR = 0, i = 0, j = 0, ti = 0, tj = 0;
            cin >> NAPR;
            cout << "\n    KOORDINATI PERVOY PALUBI: " << endl;
            cin >> i >> j;
            i--;
            j--;
            ti = i;
            tj = j;
 
            if (NAPR == 1)
            {
                count3 = 0;
                for (int i = ti - 1; i <= ti + 1; i++)
                    for (int j = tj - 1; j <= tj + 3; j++)
                    {
                        if ((masi[i][j] != 1) || (i < 0 || i>9 || j < 0 || j>9)) count3++;
                    }
 
                if (count3 == 15 && j < 8) {
                    masi[i][j] = 1;
                    masi[i][j + 1] = 1;
                    masi[i][j + 2] = 1;
                    sign3++;
                }
            }
 
            if (NAPR == 2)
            {
                count3 = 0;
                for (int i = ti - 1; i <= ti + 3; i++)
                    for (int j = tj - 1; j <= tj + 1; j++)
                    {
                        if ((masi[i][j] != 1) || (i < 0 || i>9 || j < 0 || j>9)) count3++;
                    }
                if (count3 == 15 && i < 8)
                {
                    masi[i][j] = 1;
                    masi[i + 1][j] = 1;
                    masi[i + 2][j] = 1;
                    sign3++;
                }
            }
            system("cls");
            Print(masi);
        }
 
        int sign2 = 0;
        int count2 = 0;
        while (sign2 != 3)  // Заполнение двухпалубными
        {
            cout << "\n    VVOD 2xPALUBNOGO - 3 SHT.: " << endl; // Расстановка 2 палубного
            cout << "    NAPRAVLENIE KORABLYA (1 - VPRAVO, 2 - VNIZ): ";
            int NAPR = 0, i = 0, j = 0, ti = 0, tj = 0;
            cin >> NAPR;
            cout << "\n    KOORDINATI PERVOY PALUBI: " << endl;
            cin >> i >> j;
            i--;
            j--;
            ti = i;
            tj = j;
 
            if (NAPR == 1)
            {
                count2 = 0;
                for (int i = ti - 1; i <= ti + 1; i++)
                    for (int j = tj - 1; j <= tj + 2; j++)
                    {
                        if ((masi[i][j] != 1) || (i < 0 || i>9 || j < 0 || j>9)) count2++;
                    }
                if (count2 == 12 && j < 9) {
                    masi[i][j] = 1;
                    masi[i][j + 1] = 1;
                    sign2++;
                }
            }
 
            if (NAPR == 2)
            {
                count2 = 0;
                for (int i = ti - 1; i <= ti + 2; i++)
                    for (int j = tj - 1; j <= tj + 1; j++)
                    {
                        if ((masi[i][j] != 1) || (i < 0 || i>9 || j < 0 || j>9)) count2++;
                    }
 
                if (count2 == 12 && i < 9) {
                    masi[i][j] = 1;
                    masi[i + 1][j] = 1;
                    sign2++;
                }
            }
            system("cls");
            Print(masi);
        }
 
        int sign1 = 0;
        int count1 = 0;
        while (sign1 != 4)  // Заполнение однопалубными
        {
            cout << "\n    VVOD 1xPALUBNOGO - 4 SHT.: " << endl; // Расстановка 1 палубного
 
            int NAPR = 0, i = 0, j = 0, ti = 0, tj = 0;
 
            cout << "\n    KOORDINATI PALUBI: " << endl;
            cin >> i >> j;
            i--;
            j--;
            ti = i;
            tj = j;
            count1 = 0;
            for (int i = ti - 1; i <= ti + 1; i++)
                for (int j = tj - 1; j <= tj + 1; j++)
                {
                    if ((masi[i][j] != 1) || (i < 0 || i>9 || j < 0 || j>9)) count1++;
                }
 
            if (count1 == 9 && j < 10) {
                masi[i][j] = 1;
                sign1++;
            }
            system("cls");
            Print(masi);
        }
    }
    system("cls");
 
}
 
 
void Print(int mas[14][14])     //  Функция печати полей Игроков
{
    cout << endl;
    cout << "   1 2 3 4 5 6 7 8 9 10" << endl;
    for (int i = 0; i < 10; i++)
    {   
        if (i == 9) cout<< i+1 << " ";
        if (i!=9) cout << " "<< i+1 <<" ";
        for (int j = 0; j < 10; j++) {
            
            if (mas[i][j] == 0) cout << (char)176 << (char)176;
            if (mas[i][j] == 1) cout << (char)219 << (char)219;
            if (mas[i][j] == 2) cout << "XX";
            if (mas[i][j] == 5) cout << "--";
        }
        cout << endl;
    }
    cout << endl;   
}
 
void ARastan(int masi[14][14]) // Автоматическая расстановка кораблей
{
    Sleep(1000);
    srand(time(NULL));
    for (int i = 0; i < 13; i++) {
        for (int j = 0; j < 13; j++)
            masi[i][j] = 0;
    }
    
    int i, ti, j, tj;
    int count4 = 0;
    int sign4 = 0, sign3 = 0, sign2 = 0, sign1 = 0;
    while (sign4 != 1 && sign3 != 2 && sign2 != 3 && sign1 != 4)
    {
 
        while (sign4 != 1)  // Заполнение четырехпалубными
        {
            i = rand() % 10;
            j = rand() % 10;
            ti = i;
            tj = j;
            sign4 = 0;
            int NAPR = (rand() % 2) + 1;
 
            if (NAPR == 1)
            {
                count4 = 0;
                for (int i = ti - 1; i <= ti + 1; i++)
                    for (int j = tj - 1; j <= tj + 4; j++) if (masi[i][j] != 1) count4++;
 
                if (count4 == 18 && j < 7) {
                    masi[i][j] = 1;
                    masi[i][j + 1] = 1;
                    masi[i][j + 2] = 1;
                    masi[i][j + 3] = 1;
                    sign4 = 1;
                }
            }
 
            if (NAPR == 2) {
                count4 = 0;
                for (int i = ti - 1; i <= ti + 4; i++)
                    for (int j = tj - 1; j <= tj + 1; j++) if (masi[i][j] != 1) count4++;
                if (count4 == 18 && i < 7) {
                    masi[i][j] = 1;
                    masi[i + 1][j] = 1;
                    masi[i + 2][j] = 1;
                    masi[i + 3][j] = 1;
                    sign4 = 1;
                }
            }
        }
 
        int sign3 = 0;
        int count3 = 0;
        while (sign3 != 2)  // Заполнение трехпалубными
        {
            i = rand() % 10;
            j = rand() % 10;
            ti = i;
            tj = j;
 
            int NAPR = (rand() % 2) + 1;
 
            if (NAPR == 1)
            {
                count3 = 0;
                for (int i = ti - 1; i <= ti + 1; i++)
                    for (int j = tj - 1; j <= tj + 3; j++) if (masi[i][j] != 1) count3++;
 
                if (count3 == 15 && j < 8) {
                    masi[i][j] = 1;
                    masi[i][j + 1] = 1;
                    masi[i][j + 2] = 1;
                    sign3++;
                }
            }
 
            if (NAPR == 2)
            {
                count3 = 0;
                for (int i = ti - 1; i <= ti + 3; i++)
                    for (int j = tj - 1; j <= tj + 1; j++) if (masi[i][j] != 1) count3++;
                if (count3 == 15 && i < 8)
                {
                    masi[i][j] = 1;
                    masi[i + 1][j] = 1;
                    masi[i + 2][j] = 1;
                    sign3++;
                }
            }
        }
 
        int sign2 = 0;
        int count2 = 0;
        while (sign2 != 3)  // Заполнение двухпалубными
        {
            i = rand() % 10;
            j = rand() % 10;
            ti = i;
            tj = j;
 
            int NAPR = (rand() % 2) + 1;
 
            if (NAPR == 1)
            {
                count2 = 0;
                for (int i = ti - 1; i <= ti + 1; i++)
                    for (int j = tj - 1; j <= tj + 2; j++)  if (masi[i][j] != 1) count2++;
                if (count2 == 12 && j < 9) {
                    masi[i][j] = 1;
                    masi[i][j + 1] = 1;
                    sign2++;
                }
            }
 
            if (NAPR == 2)
            {
                count2 = 0;
                for (int i = ti - 1; i <= ti + 2; i++)
                    for (int j = tj - 1; j <= tj + 1; j++) if (masi[i][j] != 1) count2++;
                if (count2 == 12 && i < 9) {
                    masi[i][j] = 1;
                    masi[i + 1][j] = 1;
                    sign2++;
                }
            }
        }
 
        int sign1 = 0;
        int count1 = 0;
        while (sign1 != 4)  // Заполнение однопалубными
        {
            i = rand() % 10;
            j = rand() % 10;
            ti = i;
            tj = j;
 
            count1 = 0;
            for (int i = ti - 1; i <= ti + 1; i++)
                for (int j = tj - 1; j <= tj + 1; j++) if (masi[i][j] != 1) count1++;
            if (count1 == 9 && j < 10) {
                masi[i][j] = 1;
                sign1++;
 
            }
        }
    }
 
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.01.2020, 11:11
Ответы с готовыми решениями:

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

Морской бой
Входные данные двумерный массив 10х10, заполненный нолями и единицами, где 0-пустая клетка, а 1-занятая, найти наиболее длинную линию из...

Морской Бой
Люди прошу помогите....курсовую надо сдавать, а как решить задачу я не знаю... Вот такое условие: Дан двумерный массив размером 8х8,...

66
фрилансер
 Аватар для Алексей1153
6479 / 5703 / 1132
Регистрация: 11.10.2019
Сообщений: 15,194
07.02.2020, 12:57
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Mesteriis Посмотреть сообщение
Я крутой програмер и хочу зп в 400к))
одобряю
0
Just Do It!
 Аватар для XLAT
4215 / 2675 / 656
Регистрация: 23.09.2014
Сообщений: 9,099
Записей в блоге: 3
07.02.2020, 13:09
Mesteriis,
Цитата Сообщение от Mesteriis Посмотреть сообщение
не я про то
ок.

давайте сюды ВАШИ три пункта в ТЗ.

пункт номер 9 я уже предложил:
9. наличие в проге две(минимум) подсистемы : 1. логика и 2. графика.

Добавлено через 8 минут
апдейт:
Цитата Сообщение от Mesteriis Посмотреть сообщение
что надо кошерно оборачивать все в классы и прочие
сорян,

вот так тогда:

ТЗ
1. OOП С++03.
...
9. наличие в проге две(минимум) подсистемы : 1. логика и 2. графика.

с вас ещё хотя бы пару пунктиков.
0
 Аватар для Mesteriis
599 / 237 / 69
Регистрация: 08.08.2015
Сообщений: 1,637
07.02.2020, 13:36
Цитата Сообщение от XLAT Посмотреть сообщение
с вас ещё хотя бы пару пунктиков.
Вариант выбора сложности игры,
и вариант игры поо сети

Добавлено через 6 минут
Можно дописать еще систему очивок, сервер так и быть у себя подниму на хосте)))

Добавлено через 18 минут
Ну и коль про сеть заговорили то и чатик
0
Just Do It!
 Аватар для XLAT
4215 / 2675 / 656
Регистрация: 23.09.2014
Сообщений: 9,099
Записей в блоге: 3
07.02.2020, 15:18
Цитата Сообщение от Mesteriis Посмотреть сообщение
Вариант выбора сложности игры,
и вариант игры поо сети
ok.
ТЗ
1. OOП С++11.
2. минимум констант в настройках(все параметры могут конфигурироваться)
+ все массивы динамические то бишь std::vector(или подходящий STL контейнер.)
...

чуть-чуть про ООП

Code
1
2
3
4
5
1. когда то в эпоху динозавров все писали ассемблером на перфокартах.
2. потом изобрели колесо и появились                   : процедуры.
3. затем пришёл Дейкстра и принёс                      : структуры.
4. исследования в атомной физике - в атоме был обнаружен ООП
5. и вот, наконец то, был построен адронный коллайдер  : ATD
Прогноз: 2030 год: в С++30 появится std::game
Предлагаю не ждать это событие так долго!

0
 Аватар для Mesteriis
599 / 237 / 69
Регистрация: 08.08.2015
Сообщений: 1,637
07.02.2020, 15:27
Цитата Сообщение от XLAT Посмотреть сообщение
минимум констант
Я бы вообще без них обошелса бы, все настройки в ini|plist файлах
0
Just Do It!
 Аватар для XLAT
4215 / 2675 / 656
Регистрация: 23.09.2014
Сообщений: 9,099
Записей в блоге: 3
07.02.2020, 15:34
Второй пункт очень даже отличный пункт,
поможет исключить споры между участниками о конкретных параметрах программы.

мда, возможно понадобиться некоторый свод правил(кодекс)
дающий понять участникам общую идеалогию процесса, хм
например:
(это не ТЗ!)
...
5. Проект не ограничен никакими сроками завершения, (т.е движение к совершенству бесконечно.)
6. У проекта нет главного.(но наличие самомодерации, фиг это знает как организовать - голосованием?)
...

Шестой пункт как бы подразумевает существование критериев качества кода.
Собсно, эти критерии, тогда надо бы как то расписать.

Добавлено через 2 минуты
Цитата Сообщение от Mesteriis Посмотреть сообщение
Я бы вообще без них обошелса бы,
необязательно,
я допускаю что дефолтные значения просто обязаны быть константами ..
0
 Аватар для Mesteriis
599 / 237 / 69
Регистрация: 08.08.2015
Сообщений: 1,637
07.02.2020, 15:36
Цитата Сообщение от XLAT Посмотреть сообщение
Собсно, эти критерии, тогда надо бы как то расписать.
да они как бы существуют, SOLID или Google style Code
0
Just Do It!
 Аватар для XLAT
4215 / 2675 / 656
Регистрация: 23.09.2014
Сообщений: 9,099
Записей в блоге: 3
07.02.2020, 16:50
Цитата Сообщение от Mesteriis Посмотреть сообщение
Google style Code
я не совсем про форматирование, хотя это тоже важно

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

по названиям переменных наверное должен быть словарик
для локальных всё просто:
i - индекс
it - итератор
p - указатель
r - индекс строки таблицы(и тп)
с - индекс столбца таблицы(и тп)
t - временная переменная
и т.д..

для свойств и методов тут конеш сложнее:
нужно договариваться, но есть уже и устоявшиеся термины.

SOLID да. конеш это да!
блин, но я постоянно его заменяю здравым смыслом

Добавлено через 8 минут
оффтоп
щас пробежался по всем пяти в вики.
о да, как это не странно я никогда не думаю про cуществование SOLID,
но почти все пять применяю разумеется по необходимости и даже без необходимости,
по каждому могу показать пруф здесь на форуме, какой когда и где применил.


например OCP
не желая "портить" уже когда то созданный класс,
просто унаследовал его, и там уже был на стадии готовности программы всего лишь список инициализации.
+ одни метод в одну строчку. И я до сих пор горжусь что не повёлся на то,
что бы добавить эти мелочи в базовый класс.
0
9949 / 2949 / 497
Регистрация: 05.10.2013
Сообщений: 8,024
Записей в блоге: 242
10.02.2020, 16:53
Цитата Сообщение от Mesteriis Посмотреть сообщение
Ну и коль про сеть заговорили то и чатик
Если у вас получится сделать клиента для чата, который бы через интернет соединялся с вашим сервером удалённо, то, опишите, пожалуйста краткую инструкцию, как решали проблемы, с которыми встретились. Я читал когда-то про серые и белые IP, про статический адрес, который нужно взять (или создать) у провайдера. На практике я только по локальной сети делал чат, а по интернету не пробовал (за исключением Node.js/вебсокетов). Если получится, то поделитесь личным опытом, как решали возникшие проблемы, а если не получится, то напишите, в какой тупик попали. Или опишите, какую-то одну самую главную проблему. Можно здесь в теме или в блоге создайте запись и дайте ссылку за запись блога. Либо, если нашли отличную пошаговую инструкцию, то дайте ссылку на неё.

Если совсем сложно с соединением клиента и сервера через интернет, то можно пока отложить глобальную сеть и остановиться пока на локальной. Локально можно играть, если придти к другу в гости с ноутбуком и crossover-кабелем. Этот вариант необходим, если в данный момент нет выхода в интернет, или нет необходимости в нём, а сетевые задержки по локальной сети минимальны - для случая разработки игровых серверов для Real Time игр.

Цитата Сообщение от Mesteriis Посмотреть сообщение
сервер так и быть у себя подниму на хосте)))
Если у вас компьютер работает круглосуточно, то это вариант. Я свой иногда выключаю. Я пробовал найти бесплатный VPS, но пока не нашёл. Можно взять платный, но я не хочу платить на данный момент. Зальём сервер для морского боя на бесплатный VPS и он будет всегда доступен. Никому не попадался бесплатный VPS?

Ещё один большой вопрос: что взять в качестве сервера на C++? Вариантов - большое множество:
  • Например, можно взять SFML или SDL2. Эти библиотеки помимо работы с сетью включают ещё и работу с графикой, клавиатурой/мышью, звуком, текстом и т.д.
  • Так же есть вариант взять Qt. В его составе есть примеры для чата. Если есть пример чата, то переправлять сообщения в морском бое можно по тому же принципу, что и в чате.
  • Boost включает в себя работу с TCP сокетами. Boost это тоже кроссплатформа, как все выше перечисленные варианты.
  • Если хостинг будет только на Windows, то можно взять WinSock. WinSock - это работа с сетью через WinAPI. Этот способ очень подробно описан в книге на русском: Многопользовательские игры. Разработка сетевых приложений
  • Можно написать сервер на JavaScript (или TypeScript) на Node.js и развернуть на бесплатном хостинге Heroku. Клиента на C++ можно соединить с сервером на Node.js через вебсокеты
0
 Аватар для Mesteriis
599 / 237 / 69
Регистрация: 08.08.2015
Сообщений: 1,637
10.02.2020, 18:49
Цитата Сообщение от 8Observer8 Посмотреть сообщение
про статический адрес,
Отваришь ну обижаете естественно они есть причем целых 3, выберите любой, в iptablet пропишу форварды.
Цитата Сообщение от 8Observer8 Посмотреть сообщение
в блоге создайте запись и дайте ссылку за запись блога.
Пометил. Но если вкраце то со стороны разработки там не каких трудностей нет. Больше администрирование сети. Для кода все равно на какой адрес подключатся (127.0.0.1 \ 192.168.xxx.xxx или внешний) главное что бы он был доступен и имел открытый порт. Даже можно в виде домена sh-inc.ru Просто в настройках маршрутизации потом указывается куда адресовать поток.


Цитата Сообщение от 8Observer8 Посмотреть сообщение
Если у вас компьютер работает круглосуточно, то это вариант.
У меня стойка, с кластером из 4х ibm 3550m2, (честно позаимественная с прежней работы). Винда не вариант, там крутсятся CentOS и ClearOS. Другого не держим. Так что или Qt (сервер сам соберу с блэкджеком и путинами на проблемка.) или Node, тут потребуется ваша помощь только изучаю эту технологию.
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Никому не попадался бесплатный VPS?
не разу не видел бесплатный.

Добавлено через 5 минут
Цитата Сообщение от Mesteriis Посмотреть сообщение
VPS?
с виндой будет стоить чуть меньше крыла от боинга
1
9949 / 2949 / 497
Регистрация: 05.10.2013
Сообщений: 8,024
Записей в блоге: 242
10.02.2020, 19:41
Цитата Сообщение от Mesteriis Посмотреть сообщение
или Node, тут потребуется ваша помощь только изучаю эту технологию.
Я постараюсь сегодня начать писать сервер для морского боя на Node.js, TypeScript и socket.io (это более удобная обёртка над чистым WebSockets API). Но для клиента я возьму C# и OpenGL3/OpenTK для Desktop. Вторая версия клиента будет на TS/WebGL. Я изучаю 3D моделирование в Blender, поэтому корабли буду делать сам в 3D. По Node.js я если не собаку, то щенка съел. На Heroku удобно, то что можно с GitHub разворачивать по кнопке в Heroku или автоматически (по git push на GitHub). Обращайтесь - помогу, чем смогу. Лучшее, что мне попадалось для старта на русском: https://metanit.com/web/nodejs/
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
10.02.2020, 19:41
Цитата Сообщение от XLAT Посмотреть сообщение
9. наличие в проге две(минимум) подсистемы : 1. логика и 2. графика.
При чем можно наверное графику сделать сменной, типа шкурок. (ООП, стратегии, фабрики)
1
9949 / 2949 / 497
Регистрация: 05.10.2013
Сообщений: 8,024
Записей в блоге: 242
10.02.2020, 23:14
Для сетевого морского боя первой задачей может быть - подсоединиться к серверу, сервер при присоединении клиента высылает сообщение клиенту, а клиент отображает это сообщение. У меня уже была такая заготовка. Я просто создал новое приложение на Heroku. Данная подзадача решена: https://sea-battle-network-web... kuapp.com/ Хостинг бесплатный, поэтому если 30 минут нет никакой активности, то сервер засыпает, а чтобы его разбудить нужно подождать 10 секунд. Сообщение от сервера отображается внизу, потому что выше расположен элемент <canvas>, то есть холст для рисования графики - он белого цвета, поэтому его не видно. Здесь же на страничке будет расположена ссылка для скачивания EXE, то есть клиента для Windows. Я бы мог собрать клиентов для Mac и Linux, но нет этих OC. Пока EXE и Web будет достаточно, потому что Web-версия запустится на любой ОС.

Как логически организовать такую систему, чтобы я мог поиграть с другом? То есть, я хочу поиграть с другом. Допустим, можно сделать такую систему. Я открываю клиент. В клиенте есть кнопку "Создать ключ" - это hash-значение. Я посылаю это hash-значение другу, он его вводит и нажимает кнопку "Присоединиться к игре". Нормально, или есть проще логика, как поиграть конкретным человеком? Позже можно будет добавить кнопку "Искать соперника". Здесь понятно, что нажимаем и ждём, что кто-то тоже нажмёт. Либо есть такая идея, я подсмотрел ещё на сервере игры Го (KGS Go Server) В этой игре человек заходит под гостём или логинится, создаёт комнату. Список комнат виден всем. Те кто играет и те кто ждёт. Те кто ждут выделены жирным. Другие заходят в комнату для ожидания и человеку, который создал комнату, выкидываются сообщения, а он принимает или отклоняет. Это более интуитивно понятно, но требует больше времени от разработчика. Какие у вас есть варианты организации поиска партнёра для игры?
0
Just Do It!
 Аватар для XLAT
4215 / 2675 / 656
Регистрация: 23.09.2014
Сообщений: 9,099
Записей в блоге: 3
10.02.2020, 23:22
Цитата Сообщение от 8Observer8 Посмотреть сообщение
варианты организации поиска партнёра для игры
без вариантов:
мальчиков соединять с девочками.
0
Джоуи
 Аватар для Joey
1083 / 645 / 240
Регистрация: 05.05.2015
Сообщений: 3,559
Записей в блоге: 2
11.02.2020, 00:20
Цитата Сообщение от Mesteriis Посмотреть сообщение
я свое первое детище переписывал 5-6 раз))))
Я свое второе (и самое классное для меня) уже в 6 раз с нуля переписываю у меня видимо бесконечный цикл в этом месте
Цитата Сообщение от XLAT Посмотреть сообщение
5. гоуту пункт 3.
Добавлено через 1 минуту
Цитата Сообщение от Joey Посмотреть сообщение
уже в 6 раз с нуля переписываю
Хотя пользуюсь до сих пор первым вариантом, потому как хоть его довел до ума (и даже до 4 версии)

Добавлено через 15 минут
Цитата Сообщение от Mencey Посмотреть сообщение
https://github.com/psqq/battleship-game-cpp
У меня только один совет пока: в readme исправьте очепятку, вместо "writen" напишите "written", у меня все
0
736 / 702 / 110
Регистрация: 29.05.2015
Сообщений: 4,293
11.02.2020, 06:38
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Как логически организовать такую систему, чтобы я мог поиграть с другом?
Движок как для танков нужен. Сотни чел ждут в очереди, что-бы рубануться в МБ. Компутер расставляет пары по рейтингу. Корабли больше двухпалубных продавать. За отдельную плату можна "подглядеть в листочек" к противнику.

Если у кого ещё есть бизнес-идеи - предлагайте!
1
9949 / 2949 / 497
Регистрация: 05.10.2013
Сообщений: 8,024
Записей в блоге: 242
11.02.2020, 16:10
Да, предлагайте ещё варианты. Я решил для начала остановиться на следующей модели, которая мне кажется наиболее простой и быстрой для реализации. В верхнем правом углу будет отображаться список имён игроков. Когда человек только запустил игру, ему предлагается ввести имя. Напротив каждого имени игрока в списке будет кнопка "Предложить сыграть". Пользователь нажимает эту кнопку, сервер получает сообщение и отправляет сообщение о предложении сыграть выбранному пользователю. Пользователь получает сообщение и нажимает кнопку: "Принять" или "Отклонить". Сервер получает сообщение или либо создаёт игру и уведомляет обоих пользователей, либо отправляет первому пользователю сообщение, что второй пользователь отклонил предложение. В игре должна быть возможность создать "открытую" и "закрытую" игру. В открытую могут заходить другие пользователи и наблюдать за игрой. Должен быть общий чат и в каждой комнате свой чат.
0
 Аватар для Mesteriis
599 / 237 / 69
Регистрация: 08.08.2015
Сообщений: 1,637
11.02.2020, 19:41

Не по теме:

Цитата Сообщение от Joey Посмотреть сообщение
Я свое второе
что хоть за софт?


8Observer8, с сервером пока кодирование не включай, потом прикрутим.
и какое окружение сейчас у тебя на сервере, NodeJS с экспресом? и какая версия ноды, я пока контейнер соберу и клиент начну пилить
0
9949 / 2949 / 497
Регистрация: 05.10.2013
Сообщений: 8,024
Записей в блоге: 242
11.02.2020, 20:41
Цитата Сообщение от Mesteriis Посмотреть сообщение
какое окружение сейчас у тебя на сервере, NodeJS с экспресом?
Node.js вроде недавно обновлял. Если ввести в консоли команду "npm -v", то выдаёт номер версии 6.12.1

Вот такие пакеты установил:
JSON
1
2
3
4
5
6
7
8
9
10
11
12
  "dependencies": {
    "express": "^4.17.1",
    "jasmine": "^3.4.0",
    "socket.io": "^2.2.0"
  },
  "devDependencies": {
    "@types/express": "^4.17.0",
    "@types/jasmine": "^3.3.13",
    "@types/requirejs": "^2.1.31",
    "@types/socket.io": "^2.1.2",
    "@types/socket.io-client": "^1.4.32"
  }
В данный момент я осваиваю выделение 3D частей кораблей с помощью мыши на WebGL клиенте, чтобы в редакторе расстановки кораблей выделять секцию корабля и перемещать. Пока что секции будут кубиками, а потом можно будет заменять кубики на более привлекательные 3D модели. Я начинающий в 3D моделировании, поэтому будут примитивные модели кораблей, не то что показывали на видео на предыдущей странице. Надо сделать настолько просто насколько получится, но довести до конца, то есть до играбельной версии. Выделение объекта, то есть, рамочку вокруг выделенного объекта, делаю по туториалу: https://learnopengl.com/Advanc... il-testing

Добавлено через 12 минут
Mesteriis, мне интересно, если ты сервер будешь писать на Node.js, а клиента на C++/Qt, то какую библиотеку ты возмёшь для работы с вебсокетами? Как тебе этот вариант: Socket.IO C++ Client? Там написано, что в комплекте есть пример для Qt. Правда, примеру на Qt уже 5 лет, но возможно он вполне рабочий.

Добавлено через 3 минуты
Здесь пошаговая инструкция, как сделать чат на Qt и socket.io: https://socket.io/blog/socket-io-cpp/
0
 Аватар для Mesteriis
599 / 237 / 69
Регистрация: 08.08.2015
Сообщений: 1,637
11.02.2020, 21:08
Цитата Сообщение от 8Observer8 Посмотреть сообщение
npm -v"
набери node -v

Цитата Сообщение от 8Observer8 Посмотреть сообщение
если ты сервер будешь писать на Node.js, а клиента на C++/Qt, то какую библиотеку ты возмёшь для работы с вебсокетами? Как тебе этот вариант: Socket.IO C++ Client? Там написано, что в комплекте есть пример для Qt. Правда, примеру на Qt уже 5 лет, но возможно он вполне рабочий.
Там много вариантов, надо просто договорится о формате и протоколе обмена да и все.

Добавлено через 2 минуты
с сокетайо не работал, поковыряю его на этой недели. В целом у меня план написать все прототипы клиента на этой недели, до воскресенья. Может чатик запилить в слак?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.02.2020, 21:08
Помогаю со студенческими работами здесь

Морской бой
Здравствуйте.Прошу помочь. Задался целью написать морской бой под консолью. Для начала решил рандомно заполнить поле игрока тремя...

Морской Бой
как лучше организовать алгоритм хода компа в морском бое?

Морской бой C++
имеется следующий класс Text,в котором два метода drawText(...) который отвечает за прорисовку текста на экране i renderingText() - за...

Морской Бой на C++
Помогите пожалуйста написать морской бой на C++ ,не сильно замороченный, простенький, можно даже с однопалубными кораблями, просто конец...

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


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Нейросеть на алгоритме "эстафета хвоста" как перспектива.
Hrethgir 06.05.2026
На десерт, когда запущу сервер. Статья тут https:/ / habr. com/ ru/ articles/ 1030914/ . Автор я сам, нейросеть только помогает в вопросах которые мне не известны - не знаю людей которые знали-бы. . .
Асинхронный приём данных из COM-порта
Argus19 01.05.2026
Асинхронный приём данных из COM-порта Купил на aliexpress термопринтер QR701. Он оказался странным. Поключил к Arduino Nano. Был очень удивлён. Наотрез отказывается печатать русские буквы. Чтобы. . .
попытка написать игровой сервер на C++
pyirrlicht 29.04.2026
попытка написать игровой сервер на плюсах с открытым бесконечным миром. возможно получится прикрутить интерпретатор питон для кастомизации игровой логики. что есть на текущий момент:. . .
Контроль уникальности выбранного документа-основания при изменении реквизита
Maks 28.04.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРемонтСпецтехники", разработанного в КА2. Задача: уведомлять пользователя, если указанная заявка (документ-основание). . .
Благородство как наказание
Maks 24.04.2026
У хорошего человека отношения с женщинами всегда складываются трудно. А я человек хороший. Заявляю без тени смущения, потому что гордиться тут нечем. От хорошего человека ждут соответствующего. . .
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru