С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
3 / 3 / 0
Регистрация: 29.03.2023
Сообщений: 112
1

Проблема с симуляцией хода в шахматах

21.05.2024, 01:28. Показов 1484. Ответов 38
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, столкнулся с проблемой.
Есть функция

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
bool canMoveRemoveCheck(int fromIndex, int toIndex, Piece pieces[64], bool isWhite) {
    Piece backupFrom = pieces[fromIndex];
    Piece backupTo = pieces[toIndex];
    
    // Симулируем ход
    pieces[toIndex] = pieces[fromIndex];
    pieces[fromIndex].pieceType = EMPTY;
    
    // Находим индекс короля после хода
    int kingIndex = -1;
    for (int i = 0; i < 64; i++) {
        if ((isWhite && pieces[i].pieceType == WHITE_KING) || (!isWhite && pieces[i].pieceType == BLACK_KING)) {
            kingIndex = i;
            break;
        }
    }
    
    // Проверяем, снимает ли ход шах
    bool stillInCheck = isCheck(kingIndex, pieces, isWhite);
    
    // Восстанавливаем состояние доски
    pieces[fromIndex] = backupFrom;
    pieces[toIndex] = backupTo;
    
    return !stillInCheck;
}
Понимаю, что проблема в симуляции, подскажите как исправить пожалуйста
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.05.2024, 01:28
Ответы с готовыми решениями:

Отмена хода в шахматах
Здравствуйте! Как можно сделать отмену хода в шахматах?

Функция для определения правильности хода коня в шахматах
Напишите функцию horse() для определения правильности хода коня в шахматах. Аргументы функции – две...

Проблема с симуляцией прерываний в AVR Studio 4
Написал очень простой код, прерывание по совпадению канала А таймеров 0,1 и 2 для Atmega644....

Proteus + Mega16, проблема с симуляцией внешних прерываний
Всем привет! Народ! Помогите разобраться с моими граблями. Пытаюсь симулировать в Протеусе внешние...

Проблема с реализацией хода
Добрый вечер! Реализована логика ходов в игре с правилами как в шашках: поле в клетку, на клетках...

38
Вездепух
Эксперт CЭксперт С++
12802 / 6677 / 1797
Регистрация: 18.10.2014
Сообщений: 16,902
21.05.2024, 10:20 2
Цитата Сообщение от Faserty Посмотреть сообщение
Понимаю, что проблема в симуляции, подскажите как исправить пожалуйста
Какая "проблема"? О чем речь вообще? Исправить что?
0
Эксперт функциональных языков программированияЭксперт С++
4271 / 2124 / 965
Регистрация: 01.06.2021
Сообщений: 7,319
21.05.2024, 10:24 3
Цитата Сообщение от Faserty Посмотреть сообщение
bool canMoveRemoveCheck
объясните, что делает данная функция?
посмотрев на код, у меня появились некоторые догадки касательно предназначения этой функции, и если они верны, то вы пишете говнокод
0
3 / 3 / 0
Регистрация: 29.03.2023
Сообщений: 112
22.05.2024, 05:42  [ТС] 4
Royal_X, данная функция ищет возможность закрыться от шаха любой другой фигурой(кроме короля)
Вызывается в функции, которая делает проверку на мат
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
bool isCheckmate(bool isWhite, Piece pieces[64]) {
    // Находим индекс короля
    int kingIndex = -1;
    for (int i = 0; i < 64; i++) {
        if ((pieces[i].pieceType == (isWhite ? WHITE_KING : BLACK_KING))) {
            kingIndex = i;
            break;
        }
    }
 
    if (kingIndex == -1) return false; // Нет короля — не должно случиться
 
    // Проверяем возможные ходы для короля
    int directions[8][2] = { {1, 0}, {-1, 0}, {0, 1}, {0, -1}, {1, 1}, {-1, -1}, {1, -1}, {-1, 1} };
    for (int i = 0; i < 8; i++) {
        int nx = (kingIndex % 8) + directions[i][0];
        int ny = (kingIndex / 8) + directions[i][1];
        if (nx >= 0 && nx < 8 && ny >= 0 && ny < 8) {
            int index = ny * 8 + nx;
            if ((pieces[index].pieceType == EMPTY) || (pieces[index].pieceType * pieces[kingIndex].pieceType < 0)) {
                if (!isCheck(index, pieces, isWhite)) {
                    return false; // Король может уйти от шаха
                }
            }
        }
    }
 
    // Проверяем, может ли любая другая фигура снять шах
for (int i = 0; i < 64; i++) {
    if (pieces[i].pieceType != EMPTY && (isWhite == (pieces[i].pieceType > 0)) && i != kingIndex) {
        for (int j = 0; j < 64; j++) {
            if (canMoveRemoveCheck(i, j, pieces, isWhite)) {
                return false; // Найден ход, который может снять шах
            }
        }
    }
}
 
return true; // Нет ходов, спасающих короля от шахмата, значит шах и мат
}
Проблема следующая:
Когда на доске мат, то он не засчитывается, потому что эта функция находит ход, который может избавить от шаха.
0
Эксперт функциональных языков программированияЭксперт С++
4271 / 2124 / 965
Регистрация: 01.06.2021
Сообщений: 7,319
22.05.2024, 08:20 5
Цитата Сообщение от Faserty
Когда на доске мат, то он не засчитывается, потому что эта функция находит ход, который может избавить от шаха.
Когда на доске мат, то ни одна функция не способна найти ход и от чего-то там избавлять . Мат это конец игры. Вам остаётся лишь вывести результат.
0
3719 / 2648 / 761
Регистрация: 29.06.2020
Сообщений: 9,800
22.05.2024, 19:51 6
Цитата Сообщение от Royal_X Посмотреть сообщение
Когда на доске мат
Тогда только рукопожатия.
Иногда доска верх-тормашками.
У меня такого не было. Но я про такое слышал.

0
3 / 3 / 0
Регистрация: 29.03.2023
Сообщений: 112
23.05.2024, 22:00  [ТС] 7
Royal_X, по сути эта функция и должна проверять есть мат или нет

если она не находит ход, то значит мат, но она каким-то волшебным образом его находит
0
Эксперт функциональных языков программированияЭксперт С++
4271 / 2124 / 965
Регистрация: 01.06.2021
Сообщений: 7,319
23.05.2024, 22:04 8
Цитата Сообщение от Faserty Посмотреть сообщение
но она каким-то волшебным образом его находит
можешь объяснить (словами), как твоя функция работает? Вот, как ты проверяешь, есть ли мат или нет?
0
3 / 3 / 0
Регистрация: 29.03.2023
Сообщений: 112
23.05.2024, 22:14  [ТС] 9
Royal_X, Допустим на доске Шах черным:
функция проверяет каждую черную фигуру на возможный ход, если этот ход избавляет от шаха, то возвращается true, если не избавляет, то возвращается false.

Далее, если функция вернула true, то мат не засчитывается.

Проблема возникла именного из-за того, что она находит "волшебный ход", который избавляет от шаха.
0
3719 / 2648 / 761
Регистрация: 29.06.2020
Сообщений: 9,800
23.05.2024, 22:17 10
Цитата Сообщение от Faserty Посмотреть сообщение
C++
30
    if (pieces[i].pieceType != EMPTY && (isWhite == (pieces[i].pieceType > 0)) && i != kingIndex)
А что это за жесть такая ???
Какой тип у pieces[i].pieceType и почему его величина сравнивается с isWhite ?
0
3 / 3 / 0
Регистрация: 29.03.2023
Сообщений: 112
23.05.2024, 22:20  [ТС] 11
SmallEvil, тип фигуры сравнивается с очередностью хода(проверка на цвет)

Т.е. цвет игрока, который должен ходить сравнивается с типом фигуры (у белых тип положительный, у черных - отрицательный)
0
3719 / 2648 / 761
Регистрация: 29.06.2020
Сообщений: 9,800
23.05.2024, 22:27 12
Цитата Сообщение от Faserty Посмотреть сообщение
тип фигуры сравнивается с очередностью хода(проверка на цвет)
Ну ладно.

А почему вы просто в наглую перетаскиваете фигуру, не глядя, может ли она туда пойти или нет ?
В функции canMoveRemoveCheck
C++
1
2
3
    // Симулируем ход
    pieces[toIndex] = pieces[fromIndex];
    pieces[fromIndex].pieceType = EMPTY;
0
3 / 3 / 0
Регистрация: 29.03.2023
Сообщений: 112
23.05.2024, 22:30  [ТС] 13
SmallEvil, я позже отредачил код и добавил проверку на возможность хода

C++
1
2
3
 if (!isValidMove(fromIndex, toIndex, pieces)) {
        return false; // Если ход недопустим, нет смысла даже пытаться его совершить
    }
Но все равно не помогло
0
1123 / 235 / 37
Регистрация: 15.03.2010
Сообщений: 724
23.05.2024, 22:37 14
Цитата Сообщение от Faserty Посмотреть сообщение
функция проверяет каждую черную фигуру на возможный ход, если этот ход избавляет от шаха, то возвращается true, если не избавляет, то возвращается false.
Сгенерируй все легальные ходы в позиции. Дальше проверь, если легальных ходов 0 и король под шахом это мат, если шаха нет это пат. Если легальные коды есть, то игра продолжается.
0
Эксперт функциональных языков программированияЭксперт С++
4271 / 2124 / 965
Регистрация: 01.06.2021
Сообщений: 7,319
23.05.2024, 22:40 15
Цитата Сообщение от Faserty Посмотреть сообщение
функция проверяет каждую черную фигуру на возможный ход
ты уверен, что перебор возможных ходов осуществляется правильно? возможно, во время перебора выполняется нелегальный ход из-за какого-нибудь бага
0
3 / 3 / 0
Регистрация: 29.03.2023
Сообщений: 112
23.05.2024, 22:42  [ТС] 16
Royal_X, а вот об этом я не подумал
SlavaRus, а подскажете как? т.е. что значит "легальные ходы"?
0
459 / 246 / 15
Регистрация: 29.10.2014
Сообщений: 1,079
23.05.2024, 22:47 17
Цитата Сообщение от Faserty Посмотреть сообщение
// Симулируем ход
    pieces[toIndex] = pieces[fromIndex];
Но "toIndex" должна быть константой. Или код неполный?
0
Эксперт функциональных языков программированияЭксперт С++
4271 / 2124 / 965
Регистрация: 01.06.2021
Сообщений: 7,319
23.05.2024, 22:48 18
Faserty, ты же сам сказал, что если находится ход, спасающий от мата, то выдает true. Если же мат в реальности есть, но у тебя true, то значит найденный ход нелегальный. А это означает, что проверка на легальные ходы у тебя глючная.
0
3 / 3 / 0
Регистрация: 29.03.2023
Сообщений: 112
23.05.2024, 22:52  [ТС] 19
commun, toIndex не должна быть константой это универсальная переменная.

По сути "делается" ход, потом его "конечная точка" становится "начальной" и записывается в toIndex
0
Эксперт функциональных языков программированияЭксперт С++
4271 / 2124 / 965
Регистрация: 01.06.2021
Сообщений: 7,319
23.05.2024, 22:53 20
Faserty, чёт я уверен, что у тебя реализована "детская" проверка на легальность ходов, без учета всяких рокировок, взятий на проходе, превращений пешек, правила 50 ходов, троекратного повторения, проверки на пат...
ты хотя бы взятия учитываешь? или у тебя легальность хода проверяется всего лишь занятостью поля?
0
23.05.2024, 22:53
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.05.2024, 22:53
Помогаю со студенческими работами здесь

Проблема определения правильности хода конем
Шахматы (Время: 1 сек. Память: 16 Мб Сложность: 23%) Шахматы Совсем недавно Вася занялся...

Обнулить клетку начала хода, и перезаписать шашку в клетку конца хода.
Добрый день! Казалось бы простая функция записи массива (позиции) расстановки шашек. Есть функция...

Темп хода часов на движущемся объекте и темп хода часов стороннего наблюдателя зависят от скорости движения объекта?
Здравствуйте. VSI, удалите, пожалуйста, старую тему...

Не сходится решение задачи по законам Кирхгофа с симуляцией в Мультисим и Матлаб
Баланс мощностей сходится, а результаты с матлабом и мультисимом не сходятся. Правила форума: ...

Рокировка в шахматах
Нужно реализовать рокировку в шахматах. Все работало до того момента, как начались сдвиги фигур....

Кандибобер в шахматах
Шахматная фигура Кандибобер ходит как конь, если она стоит на белой клетке, и как слон, если на...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Что такое CQRS и как это реализовать на C# с MediatR
InfoMaster 15.01.2025
Концепция CQRS и её роль в современной разработке В современном мире разработки программного обеспечения архитектурные паттерны играют ключевую роль в создании масштабируемых и поддерживаемых. . .
Как настроить CI/CD с Azure DevOps
InfoMaster 15.01.2025
CI/ CD, или непрерывная интеграция и непрерывное развертывание, представляет собой современный подход к разработке программного обеспечения, который позволяет автоматизировать и оптимизировать процесс. . .
Как настроить CI/CD с помощью Jenkins
InfoMaster 15.01.2025
Введение в CI/ CD и Jenkins В современной разработке программного обеспечения непрерывная интеграция (CI) и непрерывная доставка (CD) стали неотъемлемыми элементами процесса создания качественных. . .
Как написать микросервис на Go/Golang с Kafka и GitHub CI/CD
InfoMaster 14.01.2025
Определение микросервиса, преимущества использования Go/ Golang Микросервис – это архитектурный подход к разработке программного обеспечения, при котором приложение состоит из небольших, независимо. . .
Как написать микросервис с нуля на C# с RabbitMQ, CQRS и CI/CD
InfoMaster 14.01.2025
В современном мире разработки программного обеспечения микросервисная архитектура стала стандартом де-факто для создания масштабируемых и гибких приложений. Этот архитектурный подход предполагает. . .
Как создать интернет-магазин на PHP и JavaScript
InfoMaster 14.01.2025
В современном мире электронная коммерция стала неотъемлемой частью бизнеса. Создание собственного интернет-магазина открывает широкие возможности для предпринимателей, позволяя достичь большей. . .
Как написать Тетрис на Ассемблере
InfoMaster 14.01.2025
Тетрис – одна из самых узнаваемых и популярных компьютерных игр, созданная в 1984 году советским программистом Алексеем Пажитновым. За прошедшие десятилетия она завоевала симпатии миллионы людей по. . .
Как создать игру "Танчики" на Unity3d и C#
InfoMaster 14.01.2025
Разработка игр – это увлекательный процесс, сочетающий в себе творчество и технические навыки. В этой статье мы рассмотрим создание классической игры "Танчики" с использованием Unity3D и языка. . .
Организую платный онлайн микро-курс по доработке Android-клиента Telegram
_Ivana 14.01.2025
Официальная версия и распространенные форки не полностью устраивают? Сделай свою кастомную версию клиента! 4 занятия по 2 часа (2 недели пн, ср 19:00-21:00 по Москве). Первое вводное занятие. . .
Как создать приложение для фитнеса для iOS/iPhone на Kotlin
InfoMaster 14.01.2025
Создание собственного фитнес-приложения — это не только захватывающий, но и полезный процесс, ведь оно может стать вашим верным помощником на пути к здоровому и активному образу жизни. В современных. . .
Как создать приложение магазина для iOS/iPhone на Swift
InfoMaster 14.01.2025
Введение в разработку iOS-приложений Разработка приложений для iPhone и других устройств на базе iOS открывает огромные возможности для создания инновационных мобильных решений. В данной статье мы. . .
Это работает. Скорость асинхронной логики велика. Вопрос видимо останется в стабильности. Плата - огонь!
Hrethgir 13.01.2025
По прошлому проекту в Logisim Evolution https:/ / www. cyberforum. ru/ blogs/ 223907/ blog8781. html прилагаю файл архива проекта в Gowin Eda. Восьмибитный счётчик из сумматора+ генератор сигнала. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru