Как сделать программу шахматы

«Если хочешь быть умным, надо делать всё самому и всё начинать с нуля — так проще понять, что и как работает».

Собственно, суть вопроса такая: хочу написать для себя программу «шахматы». Даже не задумывая сейчас о каком-либо интерфейсе, важен «внутренний мир». и главный вопрос — с чего начать и как продолжать?

Язык программирования: С++

Я была бы очень признательна, если мне хотя бы подсказали с чего начать и куда дальше двигаться. коды программ писать не обязательно, это я хочу сама попробовать.

Участник клуба
Регистрация: 21.03.2010
Сообщений: 1,508

Начни с шахмат.
Для продолжения поупражняйся с TStringGrid.
Потом создай классы фигур. Надели их нужными свойствами.
Опиши логику взаимодействия классов(процесс игры).
Нарисуй фигуры.
Напиши ИИ бота(компьютер-противник)
Прикрути OpenGL.
Написать сайт к игре.
Разбросать по каталогам программ.
Заниматься поддержкой.

Послесловие.

Программирование на Python. Шахматы. Урок 1


Советы не новичка, но любителя.

Google — лучший помощник программиста.

моя лаборатория | мой FaceBook
Последний раз редактировалось xwicked; 05.11.2012 в 12:51 .
Форумчанин
Регистрация: 07.05.2011
Сообщений: 169

xwicked, отлично!

1 — начать с шахмат — я знаю «как играть в шахматы», играла.
2 — TStringGrid — это я так понимаю, надо начать работу с таблицами?
в С++

Так, буду пока что с этим разбираться, спасибо вам большое!

Участник клуба
Регистрация: 21.03.2010
Сообщений: 1,508

TStringGrid — это если будешь использовать C++ Builder. Это простейший способ представить шахматную доску за короткое время не рисуя её в PaintBox или на канве других компонентов типа TImage. Можно использовать текст для начала, потом и рисование изображений на канве TStringGrid. И только в самую последнюю очеред перевод на OpenGL или на основанный на холсте самодельный графический движок.

Google — лучший помощник программиста.

моя лаборатория | мой FaceBook
Последний раз редактировалось xwicked; 06.11.2012 в 15:57 .
Инженер ИС
Регистрация: 13.12.2006
Сообщений: 2,671

Использование VCL-компонентов влечет за собой их многочисленные сложности в настройке, поскольку они универсальны. Гораздо проще представить шахматную доску в виде двумерного массива. Как работают массивы напечатано в любом справочнике по C++. Столбцы — номера клеток, строки — буквы. Аргумент ячейки массива — число типа Byte, которое является ссылкой на индекс фигуры.

Пусть черные пронумерованы от 0 до 15, а белые от 100 до 115. Далее нужен класс «Фигура» и набор процедур: «Ход», «Атака», «Гибель», и пр. вспомогательные.

Читайте также:
Как включить автокликер в Майнкрафт без программ

Руководитель проекта MMO 2D RPG : Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Форумчанин
Регистрация: 07.05.2011
Сообщений: 169

TStringGrid — это если будешь использовать C++ Builder. Это простейший способ представить шахматную доску за короткое время не рисуя её в PaintBox или на канве других компонентов типа TImage. Можно использовать текст для начала, потом и рисование изображений на канве TStringGrid. И только в самую последнюю очеред перевод на OpenGL или на основанный на холсте самостоятельный графический движок.

Шахматный движок С++ #0

Хм, нет, я работаю на Visual studioб но про таблицы по изучаю, всё равно, лишним не будет)))
Форумчанин
Регистрация: 07.05.2011
Сообщений: 169

Использование VCL-компонентов влечет за собой их многочисленные сложности в настройке, поскольку они универсальны. Гораздо проще представить шахматную доску в виде двумерного массива. Как работают массивы напечатано в любом справочнике по C++. Столбцы — номера клеток, строки — буквы. Аргумент ячейки массива — число типа Byte, которое является ссылкой на индекс фигуры.

Пусть черные пронумерованы от 0 до 15, а белые от 100 до 115. Далее нужен класс «Фигура» и набор процедур: «Ход», «Атака», «Гибель», и пр. вспомогательные.

Массив проще, соглашусь.
А почему бы не сделать так, что массив двумерный, 8х8, но задать «цвет клетки» какой-нибудь формулой, например, считай с клетки 1х1, если сумма чётная — (i+j) — белая или чёрная, — ну и наоборот.
Хотя такой проще может показаться «долгим», просто, на мой взгляд, не нужно будет выводить два массива (для белых и чёрных).

есть ещё вариант, можно массив вручную ввести, типа «0» и «1», ну и цвет для цифры, тогда там надо будет просто проверить — (i,j) =1? — ну и так далее.

Ну хорошо, момент с доской вроде бы поняла.

Давайте ещё раз и с самого начала:

сейчас моя цель сделать доску, представить её, пусть даже, массивом, и проверить чтобы он проверял клетки, так?

Второй шаг — я должна сделать классы — фигуры. Объяснить как они будут ходить. Так?

Регистрация: 21.03.2009
Сообщений: 2,193

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

Читайте также:
Программа которая показывает все файлы на компьютере

Теперь про поле, как бы сделал я. Варианта тут может быть два. Пожалуй, более правильный в данном случае — создать массив 8*8 указателей на объекты фигур. Если указатель равен нулю — значит, клетка свободна. Если нет — значит, на ней есть фигура.
Второй вариант — просто массив (а лучше — вектор std::vector, список std::list или дек std:: deque) указателей на объекты, всю информацию о своем положении хранят только сами фигуры. Такой способ хорошо подойдет для игр, в которых объекты располагаются не в одной из фиксированных клеток, а либо могут занимать несколько клеток (например, как в HMM 3) или вовсе располагаться абсолютно произвольно. Но в шахматах он, думаю, себя не оправдывает.

Классы фигур тривиальнее всего сделать наследниками общего класса вроде такого

class ChessFigure < public: ChessFigure(bool whcol, int posx, int posy, IMAGETYPE* img); ~ChessFigure(); virtual void Draw(); virtual bool Move(int NewPosX, int NewPosY); private: bool WhiteColor; int PosX, PosY; IMAGETYPE* Image; //Тип зависит от того, с помощью чего вы выводите изображение, это может быть даже ваш собственный тип анимации >

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

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

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

Читайте также:
Не удаляется программа Яндекс

И вот, кажется, и все шахматы. Только нужно еще добавить возможность рокировки (навскидку не скажу, как именно) и проверку на шах и мат (проще всего добавить соответствующую функцию классу короля).
Можно также добавить функцию, которая бы возвращала список всех клеток, на которые фигура может сходить в данный момент — для подсветки их на игровом поле.

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

Источник: www.programmersforum.ru

Как создать простое шахматное приложение на React

Если вам интересно, что мы собираемся создать. Вот вам демо.

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

Шахматная доска

Нет, мы не собираемся создавать свою шахматную доску. Если бы мы создавали шахматную доску, я бы писал книгу, а не статью.

Пишем простой шахматный движок на Go

В данной статье мы постараемся разобраться, как работают шахматные движки путем портирования шахматного движка sunfish на Go. Sunfish примечателен своей простотой и небольшим размером, но при этом он все-таки способен сыграть достойную шахматную партию. Go в свою очередь известен как простой и хорошо читаемый язык программирования, поэтому я надеюсь, что вместе они составят отличную пару.

Чтобы создать шахматный движок, для начала необходимо определиться с тремя важными моментами:

  • Каким образом изобразить шахматную доску (клетки, фигуры, допустимые ходы)?
  • Как оценивать доску (кто выиграет с большей вероятностью)?
  • Как выполнять поиск оптимального хода?

Клетки и фигуры

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

Обычно доска представляет собой набор клеток. Мы добавим отступы вокруг стандартной доски 8×8, чтобы недопустимые ходы фигур попадали в эту область. Это позволит нам избежать проверки границ и значительно упростит код.

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru