Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
0 / 0 / 0
Регистрация: 30.10.2019
Сообщений: 3
1

Использование алгоритма на ООП крестики-нолики

07.09.2022, 01:45. Показов 1287. Ответов 2

Author24 — интернет-сервис помощи студентам
Приветствую форумчан. Объясните, а в идеале тыкните носом.
Ситуация такая:
Сделал эту игрульку - с этим сложностей не возникло. Играть сам с собой я смогу подредактировав пару строк кода.
Когда дошло дело до алгоритмов и рекурсий и попытка их реализаций на своем проекте для создания ИИ - я сломал себе голову.
Речь идет об минимаксовом алгоритме. Я читал немало статей как он работает, что применяется для его реализации и т.п, но не пойму то ли мой мозг забит опилками толи еще чего-то, но применить его на практике в своем примере я не могу, хотя вроде как "архитектура", если ее можно назвать таковой, позволяет его осуществить. Проинструктируйте или разберите пожалуйста со мной этот проект. До окончания этого пет-проекта останавливает меня только моё воображение и этот алгоритм =_=

Вот ссылка на гит с сорцами: https://github.com/NarutoPVP1/TTT.git
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.09.2022, 01:45
Ответы с готовыми решениями:

Крестики-нолики, графика, ООП
Здравствуйте, нужно несколько советов, просто не знаю с чего начать. Мне нужно написать курсовую...

ООП. Написать игру крестики-нолики.
Есть вот такое вот задание Написать игру крестики-нолики, используя как можно больше ООП. Общие...

Крестики-Нолики, использование alert
Здравствуйте. У меня следующий вопрос: По завершении игры крестики-нолики должно выводиться...

Переделать крестики нолики через использование классов
Помоги пожалуйста, как переделать этот код через классы? А то я вообще не понимаю.. #include...

Крестики-нолики: плохо прорисовываются "нолики"
Я, наверное, всех уже достал своей игрой, но я опять напоролся на подводный камень. Игра -...

2
7 / 5 / 2
Регистрация: 14.08.2022
Сообщений: 8
07.09.2022, 09:43 2
Лучший ответ Сообщение было отмечено Xamaleon как решение

Решение

Как-то так:
C++ (Qt)
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
int minimax(Matrix<Moves, SIZE_BOARD> &newBoard, PLAYERS currentPlayer, SECTIONS *bestMove = nullptr)
{
    const int PLAYER_WIN = 10;
    const int AI_WIN = -10;
    /*Если выиграно или проиграно*/
    int result = score(newBoard);
    if(result == PLAYER_WIN || result == AI_WIN)
        return result;
 
    /*Если больше нет ходов*/
    auto possibleMoves = emptyID(newBoard);
    if(possibleMoves.empty())
        return result;
 
    int currentScore = currentPlayer == PLAYERS::AI ? PLAYER_WIN+1 : AI_WIN-1; // Начальные значения на 1 хуже поражения
    for(auto &move : possibleMoves) // Перебираем все возможные ходы
    {
        //Делаем ход       
        newBoard.at(move) = {currentPlayer, SECTIONS(move), UNDEFINED_SHAPE};
 
        if(currentPlayer == PLAYERS::PLAYER)
        {
            int result = minimax(newBoard, PLAYERS::AI); //Вызываем рекурсивно для следующего игрока
 
            if(result > currentScore) //Если результат лучше текущего
            {
                currentScore = result; //Обновляем текущий          
 
                if(bestMove) //Если мы в корне: сохраним ход, как лучший
                    *bestMove = SECTIONS(move);
            }
        }
        else
        {
            if(currentPlayer == PLAYERS::AI) 
            {
                int result = minimax(newBoard, PLAYERS::PLAYER);  //Вызываем рекурсивно для следующего игрока
 
                if(result < currentScore)//Если результат лучше текущего
                {
                    currentScore = result;//Обновляем текущий
 
                    if(bestMove)//Если мы в корне: сохраним ход, как лучший
                        *bestMove = SECTIONS(move);
                }
            }
        }
 
        //Убираем ход
        newBoard.at(move) = {PLAYERS::UNDEFINED_PLAYER, UNDEFINED, UNDEFINED_SHAPE};
    }
 
    return currentScore;
}
 
SECTIONS AI_Move(Matrix<Moves, SIZE_BOARD> board)
{
    Matrix<Moves, SIZE_BOARD> localBoard = board;
    SECTIONS bestMove = SECTIONS::UNDEFINED;
    PLAYERS currentPlayer = PLAYERS::AI;
    minimax(localBoard, currentPlayer, &bestMove);
 
    return bestMove;
}
Немного поиграл, вроде работает корректно.
1
0 / 0 / 0
Регистрация: 30.10.2019
Сообщений: 3
08.09.2022, 01:01  [ТС] 3
Спасибо, все работает)
Буду отлаживать и разбираться как все это работает.
0
08.09.2022, 01:01
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.09.2022, 01:01
Помогаю со студенческими работами здесь

Крестики-нолики
Как сделать так, чтобы программа могла определять 3 в ряд в крестиках-ноликах?) Спасибо большое

Крестики-нолики на C++
Здравствуйте, форумчане! Прошу у экспертов помощи в улучшении кода. Недавно перешёл на C/C++,...

Крестики-нолики
Напишите функцию tic_tac_toe(field), которая принимает на вход список списков 3х3 — поле игры в...

Крестики-нолики
Создать программу, играющую с пользователем в «крестики-нолики» на поле 3×3. Программа должна...

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

Крестики-нолики
Написал крестики-нолики. Критику пожалуйста) uses GraphABC; var pole:array of integer; ...


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

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