![](images/chestnut/misc/left.gif) |
06.07.2011, 00:20
|
#1
|
ПроЭктировщик
Регистрация: 27.05.2007
Сообщений: 110
Написано 40 полезных сообщений (для 33 пользователей)
|
[WIP] mooChess
Доброго времени суток, уважаемые!
"Проект выходного дня", шахматы.
Клиент-серверная архитектура. Писал в свободное время - по часу .. три в день - на многое не надейтесь, больно не пинайтесь =)
Сервер написан за несколько минут (буквально), на похапэ => для работы потребуется какой-нибудь сервер. Для польователей Windows советую WAMP server - не нуждается в настройке, весит мало, самодостаточен (легонький MySQL упакован). Для Linux все проще: apt-get install apache2 и прочие радости поставляются в комплекте с ОС.
Клиент написан на С++ (ну ясное ж дело - знаю, в который тред пост пишу) с использованием библиотеки SFML. Понятно, что для компиляции вам понадобится содрать версию 1.6 (последняя которая) на оф. сайте или установить все пакеты из виртуального libsfml-dev one. Компилируется и запускается без проблем на Windows 7 и Ubuntu 11.04.
Ах, да, замечу, что для запуска критично расположение директории data относительно бинарника - они должны лежать в одном каталоге.
Очередность ходов пока не реализована. В комплекте поставляется два исходника: chess.cpp и chessEd.cpp - клиент и редактор, соответственно. Редактор позволяет указывать, какие клетки доступны для боя, хода и promotion (см. статью на википедии о шахматах) каждой фигуры.
Поскольку заикнулся про редактор, сразу расскажу как работает вся система (ну, или "как должно быть в идеале"): запускаем сервер с БД всех возможных ходов для каждой фигуры из всех возможных позиций (для этого и создается редактор), создаем и заполняем БД (процесс примерно таков: в редакторе выбираем фигуру клавишей F1 (F2 меняет цвет), клавишей F3 выбираем режим - задать расположение фигуры, задать клетки, которые должны быть пустыми для выполнения хода, задать клетку для перемещения, задать клетку для захвата фигуры, задать клетку для promotion; стрелками двигаем курсор, пробелом/Enter'ом выбираем нужные клетки, жмем F4 и сохраняем ход в файл; обрабатываем файл утилитой - получаем SQL-запрос, который и выполняет все инициализирующие действия с БД), указываем сервер в настройках клиента (TODO), запускаем клиент. У клиента должно быть два режима - "создание игры и ожидание оппонента" (с возможностью выбора цвета своих фигур или случайным образом давать - пока не решил) и "подключение к первой найденной игре". Более, согласитесь, ничего и не нужно.
Процесс игры таков: клиент отправляет серверу запрос, мол, "хочу пойти отсюдова да сюда", сервер находит игру, от которой пришел запрос, обрабатывает данные (делает несколько непростых выборок из БД) и отправляет клиенту ответ - "можно ему туда ходить или нельзя". В зависимости от ответа сервера и происходит ход игрока - захват фигуры, promotion или же простое перемещение фигуры.
Работа с БД пока отложена до лучших времен - когда будет наполнен файл с возможными ходами. А пока можете полюбоваться на пустышку =) Поскольку файлы выложены на мой Dropbox, возможны обновления =)
Благодарю за внимание!
Последний раз редактировалось shybovycha, 07.07.2011 в 13:49.
|
(Offline)
|
|
Эти 3 пользователя(ей) сказали Спасибо shybovycha за это полезное сообщение:
|
|
09.07.2011, 13:49
|
#2
|
ПроЭктировщик
Регистрация: 27.05.2007
Сообщений: 110
Написано 40 полезных сообщений (для 33 пользователей)
|
Ответ: [WIP] mooChess
Добрый день, товарищи!
Прошло некоторое время с момента первого поста в данной теме и весь проект потерпел большое количество изменений. Начиная решением отказаться от редактора и заканчивая пересмотренной архитектурой общения клиента и сервера (даже в последний момент перед написанием сего сообщения пришлось править и клиент, и сервер - в результате чего было исправлено около двух багов =) ).
Обо всем - по порядку.
Отказ от редактора
Редактор изначально предполагал определенные усилия и большие затраты времени на создание банального валидатора ходов. После некоторых умозаключений вслух было принято решение реализовать простые проверки на валидность того либо иного хода на стороне сервера средствами языка (а не БД, как изначально предполагалось). Пока особых изменений в валидации замечено не было (альфа-версия, таки!) - валидатор по-прежнему возвращает "верно" для любого хода.
Отказ от игрового меню
Поскольку протокол общения клиента и сервера был пересмотрен, меню, соответственно, тоже потерпело изменения - теперь оно должно содержать лишь три пункта: " найти оппонента для игры белыми фигурами", " найти оппонента для игры черными фигурами" и " выход". По причине крайней тривиальности меню, было принято единогласное (от русск. " единица"; тут - "голос был всего один"; прим. автора) решение не реализовывать меню, а водрузить единственную комманду поиска оппонента на аргументы коммандной строки.
То бишь, теперь для запуска игры необходимо в консоли написать
$ ./[path_to_game_client]/chess.elf white
*начнет поиск оппонента, играющего черными фигурами
либо же
$ ./[path_to_game_client]/chess.elf black
*начнет поиск оппонента, играющего белыми фигурами
Повторю заметку: аргумент указывает, какими фигурами хотите играть вы.
Изменение сути игры
Ранее вся соль игры сводилась к нулю - банальнейшие шахматы с возможностью играть с человеком по интернету. Теперь (по все той же причине изменения протокола общения клиента-сервера. неплохо, да? казалось бы, небольшое изменение технической части, а как игру покоробило =) ) вы не знаете (впрочем, на реальном тесте в полном масштабе никогда и не узнаете наверняка, равно как и не узнает никто иной) кто ваш противник.
Изменение протокола общения клиента и сервера
И вот оно, то маленькое и незаметное изменение, которое полностью изменило игру!
Дабы не вникать в детали и не разбрасываться теориями, умозаключениями и терминами просто опишу протокол.
Теперь общение клиента и сервера происходит так: - клиент начинает работу с известной желаемой стороной (цвет фигур, которыми пользователь желает управлять). Если сторону определить не удалось - клиент завершает работу
- серверу отправляется запрос вида "хочу играть за %side%", *(%side% = {черных, белых})
- сервер принимает запрос и выбирает из БД случайным образом первую попавшуюся игру, у которой сторона, противоположная запрошенной уже используется, а запрошенная - нет (если игрок хочет играть "за белых" - "черная сторона" будет проверена на "не пустоту", а "белая сторона" - "на пустоту"). Коль найдется одна такая запись (ибо больше нам и не нужно) - "запрошенной стороне" будет присвоено значение ID (уникальный для каждого клиента код; генерируется на стороне сервера при получении запроса "хочу играть за..." и отдается клиенту в конце этого же запроса как результат). Если же ни одной записи не найдено (либо все игроки уже в игре, либо в игре нету желающих быть оппонентом нашему пользователю и все хотят играть теми же фигурами, что и он) - в БД будет создана новая игровая запись с заполненной "запрошеной стороной" и пустой противоположной
- если на предыдущем шаге был найден оппонент для пользователя, запрос будет иметь форму "!%uid%", если нет - "?%uid%". В первом случае клиент нашего пользователя перейдет в бесконечный цикл опроса сервера (см. прим. 1) вида "так у меня уже есть оппонент или еще нет?". Во втором (равно как и в случае ответа "да, у тебя появился оппонент!" от сервера при первом раскладе) - будет открыто окно с видом доски и фигурами желаемого цвета внизу
- при каждом новом ходе серверу отправляется запрос "я - %uid% и хочу пойти отсюдова да сюда". Сервер выполняет определенные действия (см. прим. 2) и возвращает результат "да, можешь идти" или "нет, тебе туда нельзя"
- клиент может находиться в двух состояниях (см. прим. 3) - первом, когда ходит пользователь этого же клиента и втором, при котором право хода имеет его оппонент. Будучи во втором состоянии клиент постоянно опрашивает сервер на наличие новых ходов. При наличии новых ходов (точнее, одного хода - хода противника), клиенты переходят в противоположные состояния и перерисовывают позиции фигур на доске
Примечания
Прим. 1: цикл опроса в буквальном смысле выглядит так:
while (1)
{
int res = isGameStarted(client_id);
if (res < 0)
{
// ошибка
return 1;
} else
if (res > 0)
{
// игра начата
break;
}
}
В ближайшем будущем просто критически необходимо поставить таймаут опроса равным хотя бы нескольким секундам. Иначе же это чревато перегрузками как клиента, так и сервера.
Прим. 2: как и было сказано ранее, пока что проверка валидности ходов определяется константой "верно". В том же ближайшем будущем, когда снова возобновятся работы над игрой обязательно необходимо реализовать проверку валидности хода хотя бы для пешек.
Прим. 3: эти самые состояния клиента необходимо реализовать, пожалуй, даже раньше, нежели валидатор ходов. Поочередность хода, блокировка одного из клиентов и передача данных о новом ходе - это, собственно, основное, что требуется от игры.
Коллоквиум
Итак, сказано - много, понятного - мало. Давайте попробуем разобрать коротенький пример работы для прояснения ситуации.
Скажем, есть у нас три игры "в процессе" (люди уже играют во всю - их мы трогать не будем; они у нас будут декорациями на сцене) и два клиента, которые хотят играть белыми фигурами. Запускаем клиент и хотим играть черными ( $ ./chess.elf black). Клиент отправляет запрос "хочу играть черными", сервер получает его, находит первого же клиента, который хочет играть белыми фигурами, приписывает ему нас. Наш клиент получает ответ "значит ты у нас будешь *** и у тебя есть противник. рубись.". Начинается игровой цикл (который пока, увы, не реализован в достаточной мере) - ... - ожидание нового хода - расстановка фигур - запрос на новый ход - ... и т. д.
Конец очередного спринта (aka Backlog)
Итак, очередной спринт закончен. Сделано не так много, как хотелось бы, но теперь игра начинает почучуть обретать форму. Все вышеописанное и составляет, собсно, бэклог данного спринта. Взять исходники сервера и клиента (повторюсь: редактора более нету!) можно по ссылке. Для компиляции клиента, как и ранее необходим SFML 1.6 (в частности, sfml-network, sfml-window, sfml-graphics). Для запуска сервера - PHP. Дабы пост не казался унылым до невозможности привожу скрин, на котором два клиента запущены и нашли друг друга. Ах, да: в архиве также содержится SQL-скрипт для создания необходимых таблиц БД (использован MySQL, скрипт пока не стандартизирован).
Спасибо за внимание!
Последний раз редактировалось shybovycha, 09.07.2011 в 13:52.
Причина: обновление скриншота и воспоминание о SQL
|
(Offline)
|
|
Эти 4 пользователя(ей) сказали Спасибо shybovycha за это полезное сообщение:
|
|
09.07.2011, 20:41
|
#3
|
ПроЭктировщик
Регистрация: 27.05.2007
Сообщений: 110
Написано 40 полезных сообщений (для 33 пользователей)
|
Ответ: [WIP] mooChess
Возможно я немного тороплю события и нарушаю все догмы scrum'а, но все же, сегодня прошел еще один спринт длительностью в почти весь день.
За время спринта были исправлены несколько минорных ошибок (вроде отсутствия таймаута при опросе сервера, некорректная начальная позиция курсора, отсутствие всяческих сообщений на экране) и сделаны два довольно-таки больших шага для всего проекта - синхронизация ходов игроков и их очередность.
Внутренняя логика сервера опять-таки потерпела серьезные изменения. Об этом хотелось бы рассказать немного подробнее.
Итак, необходима была поочередность ходов (в первую очередь). Реализована эта фича довольно-таки несложно: у клиента есть переменная-индикатор состояния, которая может принимать два значения - " хожу я" и " ходит противник". Пока состояние переменной равно "ходит противник", сервер опрашивается (раз в три секунды - это значение константно для всех запросов, обращенных к серверу) на изменение сего состояния. При изменении передается так же информация о новом ходе (см. прим. 1).
При новом ходе (если переменная состояния позволяет), сервер опрашивается лишь раз - на возможность произвести данный ход (это и есть "валидация хода", которая до сих пор практически не реализована). Если новый ход возможно совершить - индикатор переходит в состояние "ходит противник". В этом же состоянии значения нажатых клавиш на клавиатуре попросту игнорируются дабы предотвратить возможные попытки совершения хода (на сервере это так же проверяется).
С точки зрения сервера, проверка на валидность хода - это и есть попытка совершить ход. Если проверка проходит удачно - в историю ходов добавляется проверенный ход. Если же нет - клиенту отправляется соответствующий результат.
Информация о новом ходе (которую клиент получает при опросе сервера на наличие новых ходов) используется для смены позиции фигуры, сделавшей ход. Смена позиции тривиальна: в ячейку, в которую "сходила" фигура заносится значение ячейки, "из которой она пошла". В последнюю заносится ноль (ячейка опустошается). Рокировка пока не реализована, но для большинства фигур такое действие является аксиомой.
Прим. 1: Информация о ходе представлена в виде " %откуда% %куда%". %откуда% и %куда% - стандартные для шахмат записи вида "[буква][цифра]". Эти же значения нормализуются на сервере, дабы каждый игрок получал их в уже пригодном для использования виде (если белые фигуры ходят с a8 в а6, то этот же ход для черных фигур будет выглядеть как h1 -> h3, учитывая что доска имеет одинаковую разметку для всех: столбцы нумеруются буквами от a до h, слева направо; строки - цифрами от 1 до 8, сверху вниз).
Бэклог (aka Ретроспектива)
Итак, что же на данный момент готово: начало новой игры, поочередность ходов и синхронизация данных игроков.
До конца проекта, как я думаю, недалеко - осталось реализовать проверку валидности ходов (что и займет бОльшую часть времени) и, возможно, прикручивание графического интерфейса для поиска оппонента и выхода (аж одно окошко с тремя кнопочками).
Как всегда, в приложении - скриншот, демонстрирующий синхронизированных два клиента и ссылка на скачивание исходных кодов сервера и клиента.
До нового спринта!
|
(Offline)
|
|
Эти 4 пользователя(ей) сказали Спасибо shybovycha за это полезное сообщение:
|
|
17.07.2011, 18:04
|
#4
|
ПроЭктировщик
Регистрация: 27.05.2007
Сообщений: 110
Написано 40 полезных сообщений (для 33 пользователей)
|
Ответ: [WIP] mooChess
Доброго времени суток, товарищи!
Немного неудачным вышел данный спринт (в силу известных обстоятельств), посему сделано очень и очень мало: минимальная оптимизация клиента (раньше каждый кадр доска генерировалась программно и перерисовывалась, теперь доска - это четырех-килобайтный рисунок), реализована валидация ходов для пешек, коня и короля (рокировка и интересный способ боя пешек, называемый en passant пока лишь в планах).
Также была замечена (но не обнаружена) большая утечка ресурсов при работе двух клиентов - пожалуйста, подтвердите кто-нибудь данное утверждение дабы в случае чего клиент можно было подправить иль на худой случай и переписать вовсе.
Ссылка на архив с исходными кодами клиента и сервера прилагается.
Благодарю за внимание!
Последний раз редактировалось shybovycha, 17.07.2011 в 19:44.
Причина: Bugfix: добавлена проверка ходов черных пешек => ссылка на архив обновлена
|
(Offline)
|
|
18.07.2011, 00:14
|
#5
|
Мастер
Регистрация: 03.05.2010
Адрес: Подмосковье
Сообщений: 1,218
Написано 438 полезных сообщений (для 790 пользователей)
|
Ответ: [WIP] mooChess
А если мне без разницы за кого играть? (Это я к тому что может быть дисбаланс между количеством желающих играть за чёрных или белых)
__________________
О¯О ¡¡¡ʁɔvʎнdǝʚǝdǝu dиW
|
(Offline)
|
|
18.07.2011, 11:26
|
#6
|
ПроЭктировщик
Регистрация: 27.05.2007
Сообщений: 110
Написано 40 полезных сообщений (для 33 пользователей)
|
Ответ: [WIP] mooChess
Сообщение от Igor
А если мне без разницы за кого играть? (Это я к тому что может быть дисбаланс между количеством желающих играть за чёрных или белых)
|
Доброе утро, уважаемый!
Прочел ваше сообщение, счел затею довольно интересной и сделал патчик =) Простенький SQL-запрос на сервере и пару строк в клиенте. Запускается клиент теперь в трех режимах:
$ ./chess.elf white
$ ./chess.elf black
$ ./chess.elf random
Обновленный архив прилагается.
Благодарю за содействие! Но очень уж хочется сделать клиент как-то попроще да полегче - возможно, что вскоре придется вновь использовать SDL.
|
(Offline)
|
|
21.07.2011, 23:46
|
#7
|
ПроЭктировщик
Регистрация: 27.05.2007
Сообщений: 110
Написано 40 полезных сообщений (для 33 пользователей)
|
Ответ: [WIP] mooChess
Доброго вечера, товарищи!
Сей пост не знаменует конец проекта (к моему огромному сожалению), но символизирует серьезный прорыв в разработке - реализована валидация ходов для ладьи, офицера и ферзя обеих мастей.
В клиенте особых изменений не замечено (одино условие было заменено другим - сделано это было лишь с целью напоминания о скоро предстоящей реализации рокировки и релиза проекта вцелом), зато сервер пострадал больше.
Ссылка на архив с исходными кодами - как всегда, прилагается.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
06.08.2011, 22:31
|
#8
|
ПроЭктировщик
Регистрация: 27.05.2007
Сообщений: 110
Написано 40 полезных сообщений (для 33 пользователей)
|
[DONE] mooChess
Доброго времени суток, уважаемые!
Сегодня наконец была закончена работа над основными элементами игры и я рад вам сообщить о выходе версии 1.0 сих шахмат.
Из изменений можно отметить лишь реализацию рокировки. Кстати, хотелось бы отметить также давно уже исправленую ошибку, которую вы могли заметить в ранних версиях игры - королева и король имели некорректные позиции.
Скриншот последней версии игры и архив с исходными кодами прилагаются.
Спасибо всем, следившим за ходом развития проекта!
Последний раз редактировалось shybovycha, 07.08.2011 в 01:53.
Причина: Castling Bugfix
|
(Offline)
|
|
10.09.2017, 15:28
|
#9
|
ПроЭктировщик
Регистрация: 27.05.2007
Сообщений: 110
Написано 40 полезных сообщений (для 33 пользователей)
|
Ответ: [WIP] mooChess
Некрофилии пост: залил исходники на гитхаб, подрехтовал код немного, теперь компилируется с SFML 2.4 и добавил Makefile. В процессе перечитывания кода стало откровенно стыдно за реализацию, может чутка еще порефакторю в ближайшее время
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 13:56.
|