О проекте "Шахматы"

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

Весь процесс создания программы проходил в три этапа. В самом начале была создана простая программа, работающая под DOS и не использующая графического интерфейса, а также не наделенная возможностью установки режима игры "Человек-компьютер".

На втором этапе был реализован графический интерфейс в DOS-среде (большую помощь в этом нам оказали разработчики Адов О.В. и Дудоров Е.П - спасибо им за это!) и реализован алгоритм генерации компьютерных ходов, позволивший привести программу к практически законченному виду. Эта часть работы была завершена в июле 2001 года.

После длительного перерыва, вызванного острой нехваткой времени, в августе 2002 года был начат последний этап работы над программой - перевод ее на платформу Windows, устранение массы обнаруженных в ходе эксплуатации DOS-версии ошибок и реализация новых возможностей, осуществимых только в Windows-среде. На этом этапе Михеевым А.А. было произведено многоуровневое тестирование, в результате чего обнаружено и устранено 137 только сравнительно серьезных ошибок; в частности, был исправлен алгоритм генерации компьютерного хода.

В феврале 2003 года, после того, как программа приобрела достойный вид, она была выложена на данный сайт.

Все алгоритмы данной программы разработаны нами и являются оригинальными.

Что представляет собой данная программа

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

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

Данная программа, несомненно, будет полезна всем - как неопытным пользователям, только начинающим играть в шахматы, так и профессионалам, стремящимся углубить и расширить свои знания, используя генерируемые компьютерным алгоритмом ходы и их совокупности.

Программа "Шахматы для профессионалов" разрабатывалась под внутренним названием "ChessPro". Программа написана на языке программирования C++ в интегрированной оболочке Microsoft Visual Studio 6.0 и нуждается для функционирования в операционной системе Windows 98. Более старая версия операционной системы программе не подойдет, в частности, из-за файла помощи в формате Windows 98.

Программа предназначена для:

Функциональные ограничения:

Программа и библиотеки к ней

Здесь вы можете скачать себе игру вместе с файлом помощи в формате Windows 98:
ChessPro Version 1.34, отладочная 8.28 (RAR-архив, 151 Кбайт)
Если у вас нет какой-либо из нижеперечисленных библиотек, скачайте их Здесь:

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

Фрагменты исходных текстов

В данной программе нами разработаны уникальные алгоритмы определения возможных ходов фигур, основанные на использовании функциональных зависимостей. Некоторые из этих алгоритмов приведены ниже.

Функция слона

int GetBishop(int START)
{int X; //Переменная-счётчик главного цикла функции,содержащего в себе
//4 цикла просмотра полей,лежащих:ниже и правее,выше и правее,ниже
//и левее,выше и левее
int CYC; //Переменная-счетчик 4-х внутренних циклов
int cur_field=0; //Переменная,характеризующая номер ячейки в массиве
//Array_Move_Figure,в которую будет помещаться информа-
//ция о поле;если в этой ячейке будет номер поля,поле
//доступно для хода
int a,b; //Переменные,в которые будут помещаться текущие номера
//строки и столбца
How_Many_Checking_Fields=13; //Присваиваем глобальной переменной,определяю-
//щей количество максимально возможных ходов
//у выбранной пользователем фигуры,значение 13
//Анализируем поля,лежащие ниже и правее,выше и правее,ниже и левее,выше и левее
for(X=0;X<4;X++)
{for(CYC=START,a=(START/8),b=(START%8);(a*(1-2*(X%2))<(7-7*(X%2)))&&(b*(1-2*(X/2))<(7-7*(X/2)));a+=(1-2*(X%2)),b+=(1-2*(X/2)))
{CYC+=(9+30*(X/2)-16*X);
cur_field++;
//Если проверка текущего поля,лежащего ниже и правее(и др.),показала,что
//оно занято своей или чужой фигурой,завершаем выполнение цикла(поля,рас-
//положенные ниже и правее(и т.п.)занятого,анализировать не имеет смысла -
//слон через фигуры не прыгает).См.также комментарии к функции ForFuncBishop
if(ForFuncBishop(START,CYC,cur_field)==0)
break;
}
}
...........................................................................
}

Функция,определяющая,имеет ли смысл продолжать анализ полей,лежащих на траекториях ходов слона или ферзя.Получает начальное поле,текущее анализируемое поле и номер заполняемой ячейки глобального массива возможных ходов

int ForFuncBishop(int START,int CYC,int cur_field)
{//Если слон(ферзь) черный,а фигура,стоящая на текущем поле,белая,или наоборот,
//(т.е выполняются условия макро BORW для слона или ферзя),то заносим это
//поле в массив возможных ходов(фигуру другого цвета можно съесть) и воз-
//вращаем в функцию слона(ферзя) 0,что означает-прекратить выполнение цикла
//анализа текущей траектории(фигура заслоняет все поля,расположенные за ней)
if(BORW(BL_BISHOP,WH_BISHOP)||BORW(BL_QUEEN,WH_QUEEN))
{Array_Move_Figure[cur_field]=CYC;
return 0;
}
//Если же и слон(ферзь),и фигура текущего поля белые(черные),(т.е.выполняются
//условия макро WORB для слона или ферзя),то просто прекращаем выполнение
//текущего цикла(свою фигуру съесть нельзя,и все поля за ней недоступны)
else if(WORB(BL_BISHOP,WH_BISHOP)||WORB(BL_QUEEN,WH_QUEEN))
return 0;
else
............................................................................
}

Функция коня

int GetKnight(int START)
{ int ISFIELDS=0; //Переменная-счётчик цикла проверки наличия полей
//возможных ходов у коня
How_Many_Checking_Fields=8; //Присваиваем глобальной переменной,определяю-
//щей количество максимально возможных ходов
//у выбранной пользователем фигуры,значение 8
int a,b; //Переменные,которые будут определять номера текущих строки и
//столбца
int i=0; //Переменная,принимающая значения от 0 до 7(всего возможных ходов
//у коня в лучшем случае 8,и ячеек в глобальном массиве ходов под
//них отведено 8;изменение переменной i от 0 до 7 и обеспечивает
//заполнение всех ячеек массива)
//Иными словами,в цикле ниже происходит процесс прибавления к исходным
//номерам строки и столбца всевозможных пар типа:(1,2),(2,1),(-1,2),(-2,1),
//(-2,-1),(-2,1) и т.д.
for(i=0;i<8;i++)
{ a=(START/8)+(1+i/4)*(1-2*((i/2)%2)); //К номеру строки прибавляем 2(или -2)
b=(START%8)+(2-i/4)*(1-2*(i%2)); //К номеру столбца - 1(или -1)
//Если номера строки и столбца не вышли за пределы доски
if(a>=0&&a<=7&&b>=0&&b<=7)
//И при этом на анализируемом конечном поле нет фигуры или стоит чужая
{if((Chess_Board[a*8+b]%2!=Chess_Board[START]%2)||Chess_Board[a*8+b]==0)
//Это поле доступно для хода,и мы можем занести его в массив ходов
//коня(глобальный массив ходов сейчас заполняется возможными ходами
//коня)
................................................................
}
}

Часть служебного отчета о работе над программой

----------------------------- CHES0772 (7.72) ------------ 09.11.02 ---------

Начата работа по изменению схемы сохранения позиции в файле (концепция сохранения позиции игры заменена на концепцию сохранения контекста игры, включающего в себя позицию, а также файлы человеческой и компьютерной нотации). Реализовано сохранение позиции и ее восстановление (не в полном объеме). При открытии контекста позиции производится проверка существования файлов нотаций и, если хотя бы один из них не существует, счетчик ходов и флаг выбранного поля обнуляются.

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

Создано новое диалоговое окно CSelectOptions для настройки параметров интерфейса игры; в это окно помещена панель CTabCtrl с закладками. Прежнее диалоговое окно настройки интерфейса CSelectFeatures помещено на указанную панель в качестве одной из закладок; для этого изменены его свойства (убрана граница, а само окно сделано дочерним).

Изменен функция обеспечения доступа к файлу (убрана строка вывода в стандартный поток ошибок).

Индексы иконок, выводимых в окно информации о программе, заменены на индексы, соответствующие новому набору иконок.

Функции сохранения и востановления позиции внесены в класс CChessProDlg.

Реализована функция выделения из полного пути к файлу непосредственно имени (без расширения). Выходная строка этой функции сравнивается с использовавшимся ранее именем файлов контекста игры.

----------------------------- CHES0773 (7.73) ------------ 10.11.02 ---------

Удален запрос на сохранение позиции перед переходом в обучающий режим. Теперь позиция при переходе в этот режим сохраняется, а при выходе из него - восстанавливается автоматически.

Добавлено занесение массива ходов выбранной фигуры в файл позиции при сохранении (для реализации подсветки этих полей в случае, если пользователь сохранил позицию при выбранном начальном поле).

Удалены действия по созданию файлов нотаций в случае их отсутствия (эти файлы будут созданы при первом же ходе пользователя).

Добавлено удаление всех ходов из списка нотации при загрузке сохраненной игры.

Начата реализация вывода всех ходов из загруженного файла человеческой нотации в экранный список.

----------------------------- CHES0774 (7.74) ------------ 11.11.02 ---------

Вместо обнуления счетчика ходов при загрузке контекста игры без файлов нотаций реализован вывод диалогового окна, извещающего о невозможности загрузки игры, с последующим возвратом в текущую позицию.

Концепция сохранения контекста игры в файле изменена в очередной раз. Теперь после сохранения позиции полный путь сохраняется в отдельной переменной, а файлы нотаций ведутся под старыми именами. При сохранении позиции к полному пути прибавляются имена с соответствующими расширениями. Ввиду быстрого осознавания ненадежности этого алгоритма решено полностью изменить схему ведения нотации...

........................................................................

----------------------------- CHES0775 (7.75) ------------ 12.11.02 ---------

Реализована совершенно иная, нежели в предыдущих версиях, схема сохранения контекста игры. Теперь файлы нотаций в ходе игры не ведутся вообще, а создаются при сохранении контекста совместно с файлом позиции *.chp. При этом полный путь к файлам контекста сохраняется в специальной строковой переменной и при повторном сохранении игры (или загрузке новой) именно он отображается в диалоговом окне открытия-сохранения.

В связи с введением новой схемы в программу внесены следующие изменения...

........................................................................

Михеевым А.предоставлен 5-й отчет о тестировании версии 7.70, содержащий 5 найденных ошибок из 30, обнаружение которых планировалось к 13.11.02. Содержание 5-го отчета Михеева А. (дословно):
"Глюк №52:
Белая пешка стоит под ударом черн.ферзя,прикрывая короля
Щелкаю на нее - не выбирается.Щелкаю на коня g1-он мо-
жет походить на поле f4.
Глюк №53:
Сохранил позицию в файл test1.Затем закрылся.
Потом открыл из файла.Нажал посл.ход-она
зависла. Виснет в любом случае- щелкнуть
можно куда угодно.
Глюк №54: e2-e4 c7-c5
e4-e5 d7-d5
Почему-то не могу взять черную пешку d5 на проходе.
Глюк №55:
Сделал рокировку с ладьей,к-ая уже ходила.
Глюк №56:
Остались на доске только ферзи и короли.Выбрал короля на d1.
У него выделено поле для хода g1.Сходил туда.Появилась
ладья на f1.Затем выбрал снова белого короля-сходил на c1.
Появилась вторая ладья на d2.А если нажать посл.ход
ладья становится на свое место в начале партии.
Улучшения:
-пошире поле для записи ходов,а то не вмещаются."

........................................................................

Здесь вы можете скачать себе полную версию отчета (не пожалеете - написание программ и устранение ошибок на самом деле весьма захватывающий процесс!)

История программы (RAR-архив, 33 Кбайта)
Hosted by uCoz