|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
04.11.2012, 20:24 | #1 |
Форумчанин
Регистрация: 07.05.2011
Сообщений: 169
|
Создание игры "Шахматы" С нуля для себя.
"Если хочешь быть умным, надо делать всё самому и всё начинать с нуля - так проще понять, что и как работает".
День-Вечер добрый! Собственно, суть вопроса такая: хочу написать для себя программу "шахматы". Даже не задумывая сейчас о каком-либо интерфейсе, важен "внутренний мир". и главный вопрос - с чего начать и как продолжать? Язык программирования: С++ Я была бы очень признательна, если мне хотя бы подсказали с чего начать и куда дальше двигаться. коды программ писать не обязательно, это я хочу сама попробовать. |
05.11.2012, 00:24 | #2 |
Участник клуба
Регистрация: 21.03.2010
Сообщений: 1,508
|
Начни с шахмат...
Для продолжения поупражняйся с TStringGrid. Потом создай классы фигур. Надели их нужными свойствами. Опиши логику взаимодействия классов(процесс игры). Нарисуй фигуры. Напиши ИИ бота(компьютер-противник) Прикрути OpenGL. Написать сайт к игре. Разбросать по каталогам программ. Заниматься поддержкой. Послесловие. Советы не новичка, но любителя. Последний раз редактировалось xwicked; 05.11.2012 в 12:51. |
05.11.2012, 15:43 | #3 |
Форумчанин
Регистрация: 07.05.2011
Сообщений: 169
|
xwicked, отлично!
1 - начать с шахмат - я знаю "как играть в шахматы", играла. 2 - TStringGrid - это я так понимаю, надо начать работу с таблицами? в С++ Так, буду пока что с этим разбираться, спасибо вам большое! |
05.11.2012, 22:47 | #4 |
Участник клуба
Регистрация: 21.03.2010
Сообщений: 1,508
|
Да, не за что!
TStringGrid - это если будешь использовать C++ Builder. Это простейший способ представить шахматную доску за короткое время не рисуя её в PaintBox или на канве других компонентов типа TImage. Можно использовать текст для начала, потом и рисование изображений на канве TStringGrid. И только в самую последнюю очеред перевод на OpenGL или на основанный на холсте самодельный графический движок. Последний раз редактировалось xwicked; 06.11.2012 в 15:57. |
05.11.2012, 23:15 | #5 |
Инженер ИС
Старожил
Регистрация: 13.12.2006
Сообщений: 2,671
|
Использование VCL-компонентов влечет за собой их многочисленные сложности в настройке, поскольку они универсальны. Гораздо проще представить шахматную доску в виде двумерного массива. Как работают массивы напечатано в любом справочнике по C++. Столбцы - номера клеток, строки - буквы. Аргумент ячейки массива - число типа Byte, которое является ссылкой на индекс фигуры. Пусть черные пронумерованы от 0 до 15, а белые от 100 до 115. Далее нужен класс "Фигура" и набор процедур: "Ход", "Атака", "Гибель", и пр. вспомогательные.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
|
06.11.2012, 11:33 | #6 | |
Форумчанин
Регистрация: 07.05.2011
Сообщений: 169
|
Цитата:
|
|
06.11.2012, 11:39 | #7 | |
Форумчанин
Регистрация: 07.05.2011
Сообщений: 169
|
Цитата:
А почему бы не сделать так, что массив двумерный, 8х8, но задать "цвет клетки" какой-нибудь формулой, например, считай с клетки 1х1, если сумма чётная - (i+j) - белая или чёрная, - ну и наоборот. Хотя такой проще может показаться "долгим", просто, на мой взгляд, не нужно будет выводить два массива (для белых и чёрных). есть ещё вариант, можно массив вручную ввести, типа "0" и "1", ну и цвет для цифры, тогда там надо будет просто проверить - (i,j) =1? - ну и так далее. Ну хорошо, момент с доской вроде бы поняла. Давайте ещё раз и с самого начала: сейчас моя цель сделать доску, представить её, пусть даже, массивом, и проверить чтобы он проверял клетки, так? Второй шаг - я должна сделать классы - фигуры. Объяснить как они будут ходить. Так? |
|
06.11.2012, 12:41 | #8 |
Старожил
Регистрация: 21.03.2009
Сообщений: 2,193
|
На самом деле цвет клетки вам не нужен вообще нигде, кроме рисования. К цвету клетки в шахматах (да и в шашках на самом деле тоже) абсолютно ничего не привязано. На первый взгляд только слон (или шашка) как-то зависят от цвета клетки, но на самом деле они просто могут ходить только по диагонали, а при этом по белым или черным клеткам будут ходить - зависит только от начальной позиции.
Теперь про поле, как бы сделал я. Варианта тут может быть два. Пожалуй, более правильный в данном случае - создать массив 8*8 указателей на объекты фигур. Если указатель равен нулю - значит, клетка свободна. Если нет - значит, на ней есть фигура. Второй вариант - просто массив (а лучше - вектор std::vector, список std::list или дек std:: deque) указателей на объекты, всю информацию о своем положении хранят только сами фигуры. Такой способ хорошо подойдет для игр, в которых объекты располагаются не в одной из фиксированных клеток, а либо могут занимать несколько клеток (например, как в HMM 3) или вовсе располагаться абсолютно произвольно. Но в шахматах он, думаю, себя не оправдывает. Классы фигур тривиальнее всего сделать наследниками общего класса вроде такого Код:
Отрисовка поля происходит просто - сначала рисуем доску, затем пробегаем по всем фигурам (по всем указателям поля) и заставляем их рисовать себя. Свои цвет и координаты они знают, поэтому справятся. Перемещение фигуры тоже не составит особых проблем - в самой игре мы выделяем фигуру, а затем выбираем клетку, куда хотим ее перенести. Вызываем функцию Move, в ней фигура проверяем, может ли она переместиться в эту клетку (именно для перегрузки данной функции для каждого типа фигур и нужно наследование), и если да - внутри себя меняет координаты и возвращает true. Кстати, в связи с тем, что она сама уже в эту клетку считается переехавшей, неплохо бы кроме новых координат передавать ей указатель на новую клетку - если там пусто либо фигура чужого цвета, то мы туда идем, если фигура нашего цвета - изменения координат не происходит, возвращаем false. Или даже передавать фигуре указатель на все поле или хранить его в качестве члена класса - нам же еще придется смотреть все клетки на нашем пути, нет ли на них препятствий. Так что каждой фигуре все-таки придется знать обо всем поле, хотя это и кажется вначале излишней информацией, которую лучше бы ей не давать. Если функция вернула true, то мы, во-первых, удаляем (если была) вражескую фигуру с новой клетки, во-вторых, переносим ходящую фигуру туда, а указатель на старой клетке зануляем. И вот, кажется, и все шахматы. Только нужно еще добавить возможность рокировки (навскидку не скажу, как именно) и проверку на шах и мат (проще всего добавить соответствующую функцию классу короля). Можно также добавить функцию, которая бы возвращала список всех клеток, на которые фигура может сходить в данный момент - для подсветки их на игровом поле. Вот таковы мои (несколько сумбурные) мысли по поводу реализации шахмат.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта Тема на форуме, посвященная ему же |
06.11.2012, 13:22 | #9 |
Форумчанин
Регистрация: 07.05.2011
Сообщений: 169
|
Всё очень круто! Тоже хорошее объяснение))
Тогда у меня к вам вопрос: допустим, мне надо седлать красочную игру, как простое приложение, как мне картинки и программу связать? Поясняю: красочная - то есть будет поле, оно будет нарисованной картинкой. Можно сделать такую реализацию, что каждая клетка будет в массиве, но вид то будет "картинки"? шахматные фигурки - отдельно нарисованные картинки, которые будет двигаться так же, как если бы они двигались в массиве "внутри". простое приложение - просто двигать фигурки, я двигаю, "комп" двигает, даже не думает как он двигает. Или он вовсе не двигает, всё время двигаю я (пользователь). Просто сам процесс "думка" программы, ИИ, это уже другой вопрос. Так вот, если вы примерно поняли о чём я - я к этому могу придти? просто я вот о чём - надо ведь будет смотреть, как работает программа. или она мне вывод будет как-то по-особому делать? Я просто понять не могу, как она мне "фигурки" будет двигать по "доске" и так далее. В готовом виде, на выходе, то есть. |
06.11.2012, 14:47 | #10 |
Старожил
Регистрация: 22.05.2007
Сообщений: 9,088
|
Самое главное: не смешивайте данные с их отображением.
Начать рекомендую с реализации самой игры в шахматы без мыслей об отображении на экран. Думайте только об игре, её правилах и только это реализуйте. Отображение на экране - это отдельный разговор и оно не должно мешать проектированию самой игры. На этом уровне должно быть реализовано хранение текущего положения фигур, а так же сам процесс игры (проверка возможности совершения хода, само совершение хода, определение завершения игры, переключение активного игрока, ...). При этом нужно абстрагироваться от типа игрока. Не должно быть разницы между ИИ и живым игроком. Этот момент уже будет разруливаться в других местах. Следующий этап - отображение всего этого дела на экране. Не думайте, что есть какие-то волшебные функции, которые сами всё делают, т.к. ничего этого нет. Для начала проще должно быть использование GDI без всяких анимаций и переносов фигур. По сути всё сведётся к выводу картинок с определенными координатами. Каждый ход тупо перерисовываем всю доску со всеми фигурами и не паримся. |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Создание игры "Крестики нолики" на 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 |