Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/29: Рейтинг темы: голосов - 29, средняя оценка - 4.72
3 / 3 / 1
Регистрация: 14.02.2015
Сообщений: 23
1

Как сделать ИИ для игры "Крестики-нолики"?

01.03.2015, 19:34. Показов 6026. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
как сделать ИИ для крестиков ноликов? напишите какой нибудь алгоритм или сам код, пожалуйста)
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.03.2015, 19:34
Ответы с готовыми решениями:

Подскажите как сделать блок схему к алгоритму игры крестики-нолики?
Using System; using System.Collections.Generic; using System.ComponentModel; using System.Data;...

ИИ для игры Крестики-Нолики
Пытаюсь сделать ИИ для игры "Крестики-Нолики" Список values содержит в себе числа, чем больше...

Мозг для игры крестики нолики
Добрый вечер уважаемые. Написал Игру крестики нолики. Компьютер играет рандомно. Может кто то...

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

Class для игры в Крестики-Нолики
Предлагаю вашему вниманию небольшой класс, ваши предложения, идеи будут приветствоваться Public...

7
Падаван С++
447 / 261 / 89
Регистрация: 11.11.2014
Сообщений: 916
01.03.2015, 21:38 2
Лучший ответ Сообщение было отмечено hash как решение

Решение

Можно чисто на рандоме, а можешь в ручную просчитать пару комбинаций, там довольно таки не сложно, к примеру если комп ходит первый то всегда в центр ставь, потом в любой из углов а дальше проверяй на победные комбинации если они есть у врага или у компа то ставит туда если нет то можно на рандом опятьже сделать.
Ходов там не так уж и много Если комп ходит первый к примеру то всего 5 ходов с его стороны и там нужно будет просчитывать только 3 и 4 , потому что 1 ход в центр 2 в любой угол потом просчет комбинаций а если уже 5 ход у компа ( 9 в общем ), то просто в последнюю клетку пихаешь, если комп 2 ходит то там только 1 ход в любой из углов, а дальше просчет, если найду скину код, но там он довольно таки приметывный и всегда одинакойвый алгоритм.
P.S зато всегда в ничью играл или победа если враг тупит
1
1487 / 1414 / 240
Регистрация: 19.02.2010
Сообщений: 3,915
01.03.2015, 22:53 3
hash, в гугл забейте "tic tac toe c source code" - огромная выдача, разбирайтесь.
0
3 / 3 / 1
Регистрация: 14.02.2015
Сообщений: 23
02.03.2015, 03:09  [ТС] 4
obivan, ну я так и начал писать ,просто у меня вышло в строк 50 если не больше,думал может как то по короче,вбил в гугле ,а там сложные с приоритетом клетки и уровнями сложности ,пока сложновато осознать,а рандом так и не придумал как реализовать корректно
1
117 / 33 / 14
Регистрация: 13.02.2015
Сообщений: 793
03.03.2015, 14:45 5
Цитата Сообщение от hash Посмотреть сообщение
рандом так и не придумал как реализовать корректно
Вот пример простенькой программы, которая случайно ставит крестик на поле 3*3. Пустые клетки поля для наглядности показаны точками.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
 
int main ()
{
    char A[9];
    int value;
 
    memset (A, '.', 9);
    srand(time(0));
    value=(rand())%9;
    A[value]='x';
    printf ("%c %c %c\n", A[0], A[1], A[2]);
    printf ("%c %c %c\n", A[3], A[4], A[5]);
    printf ("%c %c %c\n", A[6], A[7], A[8]);
 
    return 0;
}
1
Падаван С++
447 / 261 / 89
Регистрация: 11.11.2014
Сообщений: 916
03.03.2015, 16:07 6
hash, вообщем на плюсах
Кликните здесь для просмотра всего текста

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
#include <iostream>
#include <conio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
 
using std::cout;
using std::cin;
using std::endl;
 
static char X[3][3];
 
static void wait()
{
    cout << "Calculating  ";
    for (int i = 0; i < 2; i++)
    {
        Sleep(300);
        cout << "\b.";
        Sleep(300);
        cout << ".";
        Sleep(300);
        cout << ".";
        Sleep(300);
        cout << "\b ";
        Sleep(300);
        cout << "\b\b ";
        Sleep(300);
        cout << "\b\b ";
    }
}
static bool instruction(char a[], char b[])
{
    cout << "\t\tКрестики нолики." << endl;
    cout << "-Вы можете играть с другим игроком или против компьютера." << endl;
    cout << "-Ход осуществляеться вводом цифр от 1 до 9 которые соответствуют полю" << endl;
    cout << "-Побеждает тот кто сделает победную комбинацию." << endl;
    cout << "-Победная комбинация это линия X или 0 по диагоналям, верикалям или горизонталям" << endl;
    cout << "\nПоле :\n";
 
    int l = 0;
    int c;
    for (int i = 0; i < 3; i++)
    {
        cout << "\t";
        for (int j = 0; j < 3; j++)
        {
            X[i][j] = char(49 + l);
            l++;
            cout << " | " << X[i][j];
        }
        cout << " |" <<endl;
    }
 
    cout << "Вы хотите играть вдвоем или с компьютером ?" << endl;
    cout << "1.Вдвоем  2.Компьютер" << endl;
    cout << "Выбор : ";
    cin >> c;
 
    switch (c)
    {
    case 1:
        system("cls");
        fflush(stdin);
        cout << "Введите имя 1го игрока : ";
        cin.getline(a,15);
        cout << "Введите имя 2го игрока : ";
        cin.getline(b, 15);
        return true;
    case 2:
        system("cls");
        fflush(stdin);
        cout << "Введите ваше имя : ";
        cin.getline(b, 15);
        return false;
    }
}
static bool choose()
{
    if (rand() & 1 == 1)
        return true;
    else
        return false;
}
static bool swap(bool a)
{
    if (a==true)
        return false;
    else
        return true;
}
static bool win()
{
    if (X[0][0] == 'X' && X[1][1] == 'X' && X[2][2] == 'X' || X[0][0] == '0' && X[1][1] == '0' && X[2][2] == '0')
        return true;
    else
    {
        if (X[0][2] == 'X'  && X[1][1] == 'X'  && X[2][0] == 'X' || X[0][2] == '0'  && X[1][1] == '0'  && X[2][0] == '0')
            return true;
        else
        {
            if (X[0][0] == 'X'  && X[0][1] == 'X'  && X[0][2] == 'X' || X[0][0] == '0'  && X[0][1] == '0'  && X[0][2] == '0')
                return true;
            else
            {
                if (X[1][0] == 'X' && X[1][1] == 'X' && X[1][2] == 'X' || X[1][0] == '0' && X[1][1] == '0' && X[1][2] == '0')
                    return true;
                else
                {
                    if (X[2][0] == 'X' && X[2][1] == 'X' && X[2][2] == 'X' || X[2][0] == '0' && X[2][1] == '0' && X[2][2] == '0')
                        return true;
                    else
                    {
                        if (X[0][0] == 'X' && X[1][0] == 'X' && X[2][0] == 'X' || X[0][0] == '0' && X[1][0] == '0' && X[2][0] == '0')
                            return true;
                        else
                        {
                            if (X[0][1] == 'X' && X[1][1] == 'X' && X[2][1] == 'X' || X[0][1] == '0' && X[1][1] == '0' && X[2][1] == '0')
                                return true;
                            else
                            {
                                if (X[0][2] == 'X' && X[1][2] == 'X' && X[2][2] == 'X' || X[0][2] == '0' && X[1][2] == '0' && X[2][2] == '0')
                                    return true;
                            }
                        }
                    }
                }
            }
        }
    }
}
static void step(char a[],char b[],bool c)
{
    system("cls");
 
    int l;
    bool d = false;
 
    if (c == true)
        cout << "Ходит " << a  << " (Крестики)" << endl;
    else
        cout << "Ходит " << b << " (Нолики)" << endl;
 
    for (int i = 0; i < 3; i++)
    {
        cout << "\t";
        for (int j = 0; j < 3; j++)
        {
            cout << " | " << X[i][j];
        }
        cout << " |" << endl;
    }
 
    do
    {
        do
        {
            fflush(stdin);
            cout << "Ход : " << endl;
            cin >> l;
            if (l<1 || l>9)
                cout << "Ошибка повторите ввод" << endl;
        } while (l<1 || l>9);
 
        for (int i = 0; i < 3; i++)
        {
            for (int j = 0; j < 3; j++)
            {
                if (X[i][j] == char(48 + l) && X[i][j] != 'X' && X[i][j] != '0')
                {
                    if (c == true)
                    {
                        X[i][j] = 'X';
                        d = true;
                    }
                    else
                    {
                        X[i][j] = '0';
                        d = true;
                    }
                }
            }
        }
 
        if (d == false)
            cout << "Эта позиция занята повторите ввод" << endl;
    } while (d == false);
 
    system("cls");
    for (int i = 0; i < 3; i++)
    {
        cout << "\t";
        for (int j = 0; j < 3; j++)
        {
            cout << " | " << X[i][j];
        }
        cout << " |" << endl;
    }
}
static void easyii(char a[], char b[], bool c)
{
    system("cls");
 
    int l;
    bool d = false;
 
    if (c == true)
        cout << "Ходит " << a << endl;
    else
        cout << "Xодит " << b << endl;
 
    for (int i = 0; i < 3; i++)
    {
        cout << "\t";
        for (int j = 0; j < 3; j++)
        {
            cout << " | " << X[i][j];
        }
        cout << " |" << endl;
    }
 
    if (c == true)
        wait();
    
    do
    {
        do
        {
            if (c == true)
            {
                fflush(stdin);
                l = 1 + rand() % (10 - 1);
            }
            else
            {
 
                fflush(stdin);
                cout << "Ход : " << endl;
                cin >> l;
                if (l<1 || l>9&&c==false)
                    cout << "Ошибка повторите ввод" << endl;
            }
        } while (l<1 || l>9);
 
        for (int i = 0; i < 3; i++)
        {
            for (int j = 0; j < 3; j++)
            {
                if (X[i][j] == char(48 + l) && X[i][j] != 'X' && X[i][j] != '0')
                {
                    if (c == true)
                    {
                        X[i][j] = 'X';
                        d = true;
                    }
                    else
                    {
                        X[i][j] = '0';
                        d = true;
                    }
                }
            }
        }
 
        if (d == false&&c==false)
            cout << "Эта позиция занята повторите ввод" << endl;
    } while (d == false);
 
    system("cls");
    for (int i = 0; i < 3; i++)
    {
        cout << "\t";
        for (int j = 0; j < 3; j++)
        {
            cout << " | " << X[i][j];
        }
        cout << " |" << endl;
    }
 
}
 
int main(int argc,char *argv[])
{
    setlocale(LC_ALL, "Russian");
    srand(time(NULL));
    char Name1[30], Name2[30], Computer[] = "Computer";
    bool turn;
 
    if (instruction(Name1, Name2) == true)
    {
        turn = choose();
 
        for (int i = 0; i < 9; i++)
        {
            step(Name1, Name2, turn);
            if (win() == true)
            {
                if (turn == true)
                {
                    cout << "Победил " << Name1 << endl;
                    _getch();
                    return 0;
                }
                else
                {
                    cout << "Победил " << Name2 << endl;
                    _getch();
                    return 0;
                }
            }
            turn = swap(turn);
        }
 
 
        if (win() != true)
        {
            system("cls");
            cout << "Ничья !!!" << endl;
        }
 
    }
    else
    {
        turn = choose();
 
        for (int i = 0; i < 9; i++)
        {
            easyii(Computer, Name2, turn);
            if (win() == true)
            {
                if (turn == true)
                {
                    cout << "Победил " << Computer << endl;
                    _getch();
                    return 0;
                }
                else
                {
                    cout << "Победил " << Name2 << endl;
                    _getch();
                    return 0;
                }
            }
            turn = swap(turn);
        }
 
        if (win() != true)
        {
            system("cls");
            cout << "Ничья !!!" << endl;
        }
    }
    _getch();
    return 0;
}

Это был первый опыт, с хорошим компом так и не нашел, но если тебе сильно надо могу написать.
0
117 / 33 / 14
Регистрация: 13.02.2015
Сообщений: 793
03.03.2015, 16:34 7
obivan, вместо:
C
1
2
3
4
5
6
7
static bool swap(bool a)
{
    if (a==true)
        return false;
    else
        return true;
}
Проще использовать:
C
1
2
3
4
bool swap(bool a)
{
    return !a;
}
Весь код, конечно же, не анализировал, но это уж слишком бросается в глаза.
И проверьте 1,3,4 варнинги, возможно, при каких-то особенных входных данных, ваша программа будет работать неверно.
C
1
2
3
4
1>c:\users\user1\documents\visual studio 2012\projects\крестики-нолики\крестики-нолики\исходный код.cpp(80): warning C4554: &: проверьте порядок применения операторов на наличие ошибки; для четкого задания порядка используйте скобки
1>c:\users\user1\documents\visual studio 2012\projects\крестики-нолики\крестики-нолики\исходный код.cpp(285): warning C4244: аргумент: преобразование "time_t" в "unsigned int", возможна потеря данных
1>c:\users\user1\documents\visual studio 2012\projects\крестики-нолики\крестики-нолики\исходный код.cpp(77): warning C4715: instruction: значение возвращается не при всех путях выполнения
1>c:\users\user1\documents\visual studio 2012\projects\крестики-нолики\крестики-нолики\исходный код.cpp(131): warning C4715: win: значение возвращается не при всех путях выполнения
1
Падаван С++
447 / 261 / 89
Регистрация: 11.11.2014
Сообщений: 916
03.03.2015, 20:47 8
evgr, Благодарю, попробую исправить.
0
03.03.2015, 20:47
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.03.2015, 20:47
Помогаю со студенческими работами здесь

Бот для игры крестики-нолики
Написал программу крестики-нолики, но у меня игрок против игрока , как добавить бота, самого...

Массив для игры крестики-нолики
2. Имеется пустой двумерный символьный массив размера 3 х 3. На вход программе подаются два...

Логика для игры крестики нолики
Здравствуйте. Есть программа крестики нолики. Не могу выполнить задание чтобы, вместо 2 игроков был...

Простая логика для игры «Крестики-Нолики»
всем доброго дня! решаю сложнейшую задачу по программированию крестиков-ноликов столкнулся с...

Формальная постановка для игры крестики и нолики
Доброго времени суток. Написал игру крестики и нолики размерностью 4х4. Нужно написать к этой игре...


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

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