Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.11.2012, 20:24   #1
Fanyuus
Форумчанин
 
Аватар для Fanyuus
 
Регистрация: 07.05.2011
Сообщений: 169
По умолчанию Создание игры "Шахматы" С нуля для себя.

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

День-Вечер добрый!

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

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

Я была бы очень признательна, если мне хотя бы подсказали с чего начать и куда дальше двигаться. коды программ писать не обязательно, это я хочу сама попробовать.
Fanyuus вне форума Ответить с цитированием
Старый 05.11.2012, 00:24   #2
xwicked
Участник клуба
 
Аватар для xwicked
 
Регистрация: 21.03.2010
Сообщений: 1,508
По умолчанию

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

Послесловие.
Советы не новичка, но любителя.
Google - лучший помощник программиста.
---
моя лаборатория | мой FaceBook

Последний раз редактировалось xwicked; 05.11.2012 в 12:51.
xwicked вне форума Ответить с цитированием
Старый 05.11.2012, 15:43   #3
Fanyuus
Форумчанин
 
Аватар для Fanyuus
 
Регистрация: 07.05.2011
Сообщений: 169
По умолчанию

xwicked, отлично!

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


Так, буду пока что с этим разбираться, спасибо вам большое!
Fanyuus вне форума Ответить с цитированием
Старый 05.11.2012, 22:47   #4
xwicked
Участник клуба
 
Аватар для xwicked
 
Регистрация: 21.03.2010
Сообщений: 1,508
Хорошо

Да, не за что!

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

Последний раз редактировалось xwicked; 06.11.2012 в 15:57.
xwicked вне форума Ответить с цитированием
Старый 05.11.2012, 23:15   #5
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Использование VCL-компонентов влечет за собой их многочисленные сложности в настройке, поскольку они универсальны. Гораздо проще представить шахматную доску в виде двумерного массива. Как работают массивы напечатано в любом справочнике по C++. Столбцы - номера клеток, строки - буквы. Аргумент ячейки массива - число типа Byte, которое является ссылкой на индекс фигуры. Пусть черные пронумерованы от 0 до 15, а белые от 100 до 115. Далее нужен класс "Фигура" и набор процедур: "Ход", "Атака", "Гибель", и пр. вспомогательные.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 06.11.2012, 11:33   #6
Fanyuus
Форумчанин
 
Аватар для Fanyuus
 
Регистрация: 07.05.2011
Сообщений: 169
По умолчанию

Цитата:
Сообщение от xwicked Посмотреть сообщение
Да, не за что!

TStringGrid - это если будешь использовать C++ Builder. Это простейший способ представить шахматную доску за короткое время не рисуя её в PaintBox или на канве других компонентов типа TImage. Можно использовать текст для начала, потом и рисование изображений на канве TStringGrid. И только в самую последнюю очеред перевод на OpenGL или на основанный на холсте самостоятельный графический движок.
Хм, нет, я работаю на Visual studioб но про таблицы по изучаю, всё равно, лишним не будет)))
Fanyuus вне форума Ответить с цитированием
Старый 06.11.2012, 11:39   #7
Fanyuus
Форумчанин
 
Аватар для Fanyuus
 
Регистрация: 07.05.2011
Сообщений: 169
По умолчанию

Цитата:
Сообщение от Beermonza Посмотреть сообщение
Использование VCL-компонентов влечет за собой их многочисленные сложности в настройке, поскольку они универсальны. Гораздо проще представить шахматную доску в виде двумерного массива. Как работают массивы напечатано в любом справочнике по C++. Столбцы - номера клеток, строки - буквы. Аргумент ячейки массива - число типа Byte, которое является ссылкой на индекс фигуры. Пусть черные пронумерованы от 0 до 15, а белые от 100 до 115. Далее нужен класс "Фигура" и набор процедур: "Ход", "Атака", "Гибель", и пр. вспомогательные.
Массив проще, соглашусь.
А почему бы не сделать так, что массив двумерный, 8х8, но задать "цвет клетки" какой-нибудь формулой, например, считай с клетки 1х1, если сумма чётная - (i+j) - белая или чёрная, - ну и наоборот.
Хотя такой проще может показаться "долгим", просто, на мой взгляд, не нужно будет выводить два массива (для белых и чёрных).

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

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

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

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

Второй шаг - я должна сделать классы - фигуры. Объяснить как они будут ходить. Так?
Fanyuus вне форума Ответить с цитированием
Старый 06.11.2012, 12:41   #8
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 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, то мы, во-первых, удаляем (если была) вражескую фигуру с новой клетки, во-вторых, переносим ходящую фигуру туда, а указатель на старой клетке зануляем.

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

Вот таковы мои (несколько сумбурные) мысли по поводу реализации шахмат.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 06.11.2012, 13:22   #9
Fanyuus
Форумчанин
 
Аватар для Fanyuus
 
Регистрация: 07.05.2011
Сообщений: 169
По умолчанию

Цитата:
Сообщение от Гром Посмотреть сообщение
Вот таковы мои (несколько сумбурные) мысли по поводу реализации шахмат.
Всё очень круто! Тоже хорошее объяснение))

Тогда у меня к вам вопрос: допустим, мне надо седлать красочную игру, как простое приложение, как мне картинки и программу связать?

Поясняю:
красочная - то есть будет поле, оно будет нарисованной картинкой. Можно сделать такую реализацию, что каждая клетка будет в массиве, но вид то будет "картинки"?

шахматные фигурки - отдельно нарисованные картинки, которые будет двигаться так же, как если бы они двигались в массиве "внутри".

простое приложение - просто двигать фигурки, я двигаю, "комп" двигает, даже не думает как он двигает. Или он вовсе не двигает, всё время двигаю я (пользователь). Просто сам процесс "думка" программы, ИИ, это уже другой вопрос.

Так вот, если вы примерно поняли о чём я - я к этому могу придти?


просто я вот о чём - надо ведь будет смотреть, как работает программа.
или она мне вывод будет как-то по-особому делать? Я просто понять не могу, как она мне "фигурки" будет двигать по "доске" и так далее. В готовом виде, на выходе, то есть.
Fanyuus вне форума Ответить с цитированием
Старый 06.11.2012, 14:47   #10
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Самое главное: не смешивайте данные с их отображением.
Начать рекомендую с реализации самой игры в шахматы без мыслей об отображении на экран. Думайте только об игре, её правилах и только это реализуйте. Отображение на экране - это отдельный разговор и оно не должно мешать проектированию самой игры.
На этом уровне должно быть реализовано хранение текущего положения фигур, а так же сам процесс игры (проверка возможности совершения хода, само совершение хода, определение завершения игры, переключение активного игрока, ...). При этом нужно абстрагироваться от типа игрока. Не должно быть разницы между ИИ и живым игроком. Этот момент уже будет разруливаться в других местах.
Следующий этап - отображение всего этого дела на экране. Не думайте, что есть какие-то волшебные функции, которые сами всё делают, т.к. ничего этого нет.
Для начала проще должно быть использование GDI без всяких анимаций и переносов фигур. По сути всё сведётся к выводу картинок с определенными координатами. Каждый ход тупо перерисовываем всю доску со всеми фигурами и не паримся.
pu4koff вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание игры "Крестики нолики" на php Loki1993 PHP 4 20.09.2012 20:33
Создание игры "Змейка" asmars C++ Builder 6 23.10.2011 15:20
PHP как язык для обучения программированию "с нуля"? DooM1k Свободное общение 10 31.03.2008 17:58
Создание игры "Крестики-нолики" Cubar Помощь студентам 9 22.01.2008 23:07