Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/11: Рейтинг темы: голосов - 11, средняя оценка - 5.00
5 / 4 / 1
Регистрация: 19.10.2019
Сообщений: 55
1

ИИ для морского боя

26.08.2020, 20:19. Показов 2209. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, пишу консольный морской бой и нашёл минус в ИИ. Если расположить корабли по бокам то у ИИ почти нет шансов победить. ИИ написан как в этой статье: https://habr.com/ru/post/181151/
Как это можно исправить?
Если нужно вот мой код:
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
#include "Header.h"
#pragma warning(disable : 4996);
#define fastio                                                 \
                             ios_base::sync_with_stdio(false); \
                             cin.tie(NULL);
#define ll                   long long
#define MOD                  1000000007
#define rep(i, k, n)         for (i = k; i <= n; i++)
#define repp(i, k, n, x)     for (i = k; i <= n; i = i + x)
#define irep(i, k, n)        for (i = k; i >= n; i--)
#define endl                 "\n"
#define cendl(k)             cout << k << endl;
#define cspace(k)            cout << k << " ";
#define No                   cendl("No");
#define Yes                  cendl("Yes");
#define newl                 cout << endl;
#define space                cout << " ";
#define sz(x)                ((ll)x.size())
#define test                 int tests; cin >> tests; while (tests--)
#define MAX(a, b)            ((a) > (b) ? (a) : (b))
#define MIN(a, b)            ((a) < (b) ? (a) : (b))
#define ABS(x)               ((x) < 0 ? - (x) : (x))
#define pmax(a, b)           if(a < b) swap(a, b);      
#define pmin(a, b)           if(a > b) swap(a, b);
#define c                    cout
#define fx                   cerr << "/////";
#define gcd                  __gcd
using namespace std;
extern int w, x, y, xx, yy, k, savex, savey, nap, j, i;
extern bool flag;
char PlayerDefense[100][100];
char PlayerAttack[100][100];
char BotDefense[100][100];
char BotAttack[100][100];
extern bool HAANDL;
bool checktruepos(char pol[100][100]) {
    rep(w, 1, k) {
        if (x <= 9 && x >= 1 && y <= 9 && y >= 1 && pol[x][y] == '.' && pol[x + 1][y] == '.' && pol[x - 1][y] == '.' && pol[x][y + 1] == '.' && pol[x][y - 1] == '.' &&
            pol[x + 1][y + 1] == '.' && pol[x - 1][y - 1] == '.' && pol[x + 1][y - 1] == '.' && pol[x - 1][y + 1] == '.') xx = xx;
        else return false;
        x = x + xx;
        y = y + yy;
    }
    x = savex;
    y = savey;
    rep(w, 1, k) {
        pol[x][y] = k + 48;
        x = x + xx;
        y = y + yy;
    }
    return true;
}
void generateplace(char poll[100][100]) {
    do {
        xx = 0;
        yy = 0;
        flag = true;
        nap = ll(rand()) % 4 + 1;
        if (nap == 1)  xx = -1;
        else if (nap == 2) yy = 1;
        else if (nap == 3) xx = 1;
        else if (nap == 4) yy = -1;
        x = ll(rand()) % 9 + 1;
        y = ll(rand()) % 9 + 1;
        savex = x;
        savey = y;
    } while (checktruepos(poll) != true);
}
void Generate()
{
    fastio;
    srand(time(NULL));
    rep(i, 0, 90) {
        rep(j, 0, 90) {
            PlayerDefense[i][j] = '.';
            BotDefense[i][j] = '.';
        }
    }
    irep(k, 4, 1) {
        rep(i, 1, abs(4 - k + 1)) {
            if (HAANDL) generateplace(PlayerDefense);
            generateplace(BotDefense);
        }
    }
    /*
    rep(i, 1, 9) {
        rep(j, 1, 9) {
            c << PlayerDefense[i][j]; space;
        }
        newl;
    }
    newl;*/
    rep(i, 0, 100) {
        rep(j, 0, 100) {
            BotAttack[i][j] = ' ';
            PlayerAttack[i][j] = ' ';
        }
    }
    /*
    cout << "BotDefense:" << endl;
    rep(i, 1, 9) {
        rep(j, 1, 9) {
            c << BotDefense[i][j]; space;
        }
        newl;
    }*/
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.08.2020, 20:19
Ответы с готовыми решениями:

Написание ИИ для Морского Боя
Добрый день,помогите с написание АИ для морского боя , все сделал кроме АИ)Мы знаем размер поля...

Создать два поля для морского боя
Для практики создайте программу рисующую на экране два поля для морского боя. Первое - игрока,...

Построение квадратного поля для морского боя
Здравствуйте. Такой вопрос - Как сделать так чтобы поле для морского боя было не прямоугольное...

Трудности при написании Морского боя
Пишу курсовик на тему морской бой. в среде VS 2010. проект пишется в Win32. идёт очень плохо по...

10
32 / 28 / 5
Регистрация: 02.08.2020
Сообщений: 132
Записей в блоге: 1
26.08.2020, 20:23 2
TinyColonel, здесь есть преимущество у игрока так как расположение кораблей по бокам даёт минимум инфы второму игроку
но это можно обойти условием если Х клеток примыкают к краям, то нужно делать каждый У выстрелов на края

Добавлено через 1 минуту
типа ии над ии
определение стратегии по типу определения группировки
0
3 / 4 / 3
Регистрация: 24.03.2020
Сообщений: 88
26.08.2020, 20:57 3
Добавь шанс +2 к клеткам которые у края и шанс + 1 которые возле края(1 клетка до края) Тогда бот получится оптимальным.
0
264 / 183 / 87
Регистрация: 03.05.2020
Сообщений: 790
26.08.2020, 21:02 4
если все возможные для стрельбы клетки держать в линейном массиве, то без разницы как расположены корабли
0
3 / 4 / 3
Регистрация: 24.03.2020
Сообщений: 88
26.08.2020, 21:10 5
Цитата Сообщение от AnyKey Посмотреть сообщение
все возможные для стрельбы клетки
И как тогда выбирать оптимальную клетку то? Рандом получается один..
0
1003 / 1858 / 176
Регистрация: 07.05.2013
Сообщений: 3,894
Записей в блоге: 12
26.08.2020, 23:56 6
Вот простенькая стратегия для гарантированного подбития четырехпалубника:

Код
+-+-+-+-+-+-+-+-+-+-+
|x| | | |x| | | |x| | 
+-+-+-+-+-+-+-+-+-+-+
| |x| | | |x| | | |x| 
+-+-+-+-+-+-+-+-+-+-+
| | |x| | | |x| | | | 
+-+-+-+-+-+-+-+-+-+-+
| | | |x| | | |x| | | 
+-+-+-+-+-+-+-+-+-+-+
|x| | | |x| | | |x| | 
+-+-+-+-+-+-+-+-+-+-+
| |x| | | |x| | | |x| 
+-+-+-+-+-+-+-+-+-+-+
| | |x| | | |x| | | | 
+-+-+-+-+-+-+-+-+-+-+
| | | |x| | | |x| | | 
+-+-+-+-+-+-+-+-+-+-+
|x| | | |x| | | |x| | 
+-+-+-+-+-+-+-+-+-+-+
| |x| | | |x| | | |x| 
+-+-+-+-+-+-+-+-+-+-+
При этом велика вероятность зацепить трехпалубники, после этого наложив аналогично сетку против двухпалубников, вам останется только перебрать оставшиеся единичные пустые клетки...

Добавлено через 9 минут
Цитата Сообщение от Userganz Посмотреть сообщение
расположение кораблей по бокам даёт
Вот кстати еще веселенькое расположение:

Код
+-+-+-+-+-+-+-+-+-+-+
|*|*|*|*| |*|*|*| |*| 
+-+-+-+-+-+-+-+-+-+-+
| | | | | | | | | |*| 
+-+-+-+-+-+-+-+-+-+-+
|*|*| |*|*| |*|*| |*| 
+-+-+-+-+-+-+-+-+-+-+
| | | | | | | | | | | 
+-+-+-+-+-+-+-+-+-+-+
| | | | | | | | | | | 
+-+-+-+-+-+-+-+-+-+-+
| |*| | | | | | | | | 
+-+-+-+-+-+-+-+-+-+-+
| | | | | | |*| | | | 
+-+-+-+-+-+-+-+-+-+-+
| | | | | | | | | | | 
+-+-+-+-+-+-+-+-+-+-+
| | |*| | | | | | | | 
+-+-+-+-+-+-+-+-+-+-+
| | | | | | | |*| | | 
+-+-+-+-+-+-+-+-+-+-+
0
661 / 662 / 106
Регистрация: 29.05.2015
Сообщений: 3,966
27.08.2020, 07:06 7
Искусственный интеллект - не слишком ли? Может просто алгоритм игры?
Попробуй поиграй в мой МБ. На картинке пример расстановки кораблей, убитые и раненый корабли. Первым ходит всегда чел:
Миниатюры
ИИ для морского боя  
Вложения
Тип файла: zip mboy.zip (5.09 Мб, 12 просмотров)
0
Параллельный Кот
1905 / 827 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
27.08.2020, 21:01 8
Цитата Сообщение от alexu_007 Посмотреть сообщение
Искусственный интеллект - не слишком ли? Может просто алгоритм игры?
Игровой искусственный интеллект
0
32 / 28 / 5
Регистрация: 02.08.2020
Сообщений: 132
Записей в блоге: 1
28.08.2020, 15:28 9
vantfiles, суть в том чтобы отдать 4х и 3х палубные сразу запоров как можно меньше места то есть такое расположение даст минимум инфы второму игроку и двупалубники и однопалубники проще спрятать

xxxxoxoxxx
oooooxoooo
oooooxoooo

в этом случае у противника будет закрашено 25 клеток против 48 при зрамещении их в "открытых водах" преимущество очевидно
0
1003 / 1858 / 176
Регистрация: 07.05.2013
Сообщений: 3,894
Записей в блоге: 12
28.08.2020, 16:52 10
Userganz, я на второй "картинке" об этом и толкую
0
32 / 28 / 5
Регистрация: 02.08.2020
Сообщений: 132
Записей в блоге: 1
28.08.2020, 16:58 11
vantfiles, первую рассмотрел, на второй в глазах зарябило, но если вторая картинка принципиально то можно размещать с лева с права, отзеркаливать и тп. да и изначальное знание этих позиций даст выигрыш в 7 ходов но потеря в инфе будет несоизмерима
0
28.08.2020, 16:58
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.08.2020, 16:58
Помогаю со студенческими работами здесь

Как разместить два игровых поля морского боя в ряд по горизонтали?
Два квадратика в рядочек) Привет, простенький вопрос. Делаю жалкие попытки написать консольный...

Поле для морского боя
пишу курсач в с++ билдере. подскажите как там можно реализовать поле 10*10 для игры морской бой....

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

ИИ для морского боя
Решил написать морской бой с ИИ, но возникла проблема в алгоритме расстановки кораблей за ИИ,...

АИ для морского боя
Добрый день подскажите как реализовать на C# II для морского боя игровое поле не более 20 шириной...

Создать таблицу для морского боя
Помогите решить задачку. Нужно создать поле для игры в морской бой: просто создать табличку 10х10 и...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru