Карточная игра "Дурак" 1х1
Есть колода В начале игры раздаётся по 6 карт Игроки ходят по очереди. Серия из 10 матчей. Игру начинает игрок с самой младщей картой козырей.
Во время игры игрокам передаётся состояние игры в виде набора карт игрока, количества карт соперника, количества карт в колоде (с учётом козырной карты), козырной карты, передаются пары карт на поле. Игра в подкидного дурака, без переводов.
Действия игрока:
- Игрок который ходит
- Сходить определённой картой
- Подкинуть карту
- Объявить отбой
- Игрок который отбивается
- Отбиться определённой картой
- Сдаться при невозможности отбиться или по тактическим соображениям
Порядок игры с точки зрения сервера: Игроки регистрируются в систеаме, получая токен для игры. Далее они используют этот токен, чтобы пинговать сервис один раз в секнунду на наличие готовой пары игры. login/get-token?login=login&password=password
Из пула подключенных игроков собирается пара.
Игра инициализируется, карты раздаются игрокам. Игроки узнают о том что игра собралась из ручки game/my-games-list?token=token
Игроки получают начальное состояние игрового поля. Игрок который должен ходить получает в сообщении состояние "разрешено ходить", игрок который ожидает хода получает состояние "ожидаем хода другого игрока".
Игрок, который должен сходить обращается к соответствующим ручкам игрвого API. Сервер проверяет есть ли игра с таким game-id, проверяет зарегистрирован ли пользователь с таким token в этой игре, проверяет может ли игрок выполнять действия сейчас и можно ли выполнить это действие в таком состоянии. Ответ - успех или отказ в действии и новое текущее состояние игрового поля.
Не забываем профилировать каждого игрока и логировать все действия игроков для анализа игры.
http://server-ip/game/play/<game-id>/get_state?token=token
- ручка для того чтобы посмотреть статус. Формат возвращаемых данных смотри в разделе Структура данных
http://server-ip/game/play/<game-id>/take_action?token=token&action=put&card=9H
- ручка для того чтобы выполнить ход. Использовать метод POST. В параметрах передаём token, который получили в личном кабинете, action - строчка действия, должна соответствовать одному из доступных игроку действий (см. структуру данных). Если действие put, то дополнительно нужно передать какую карту мы хотим положить на игровое поле.
Карты в формате NS, где N-величина карты от 6 до 14, S - масть: 'C' - 'Clubs' крести, 'D' - 'Diamonds' бубны, 'S' - 'Spades' пики, 'H' - 'Hearts' черви
{
"action_accepted": true,
"actions_available": ["put", "endturn", "take"],
"game_field": {
"cards": ["6C", "7H"],
"field_cards": [["7S","8D"],["9D"]],
"deck_counter": 24,
"trump": "1S",
"enemy_cards_counter": 6
},
"game_state":{
"status":"gameover",
"number_of_turns": 0,
"number_of_moves": 0,
"result": "draw"
}
}
action_accepted флаг подтверждает ли сервер данное действие может быть true,false или null (когда игрок не производил никаких действий, а просто запросил состояние поля)
actions_available: put - можно сходить картой, endturn - можно завершить ход (для атакующей стороны, отправить в "биту"), take - взять карты, завершить ход (для защищающейся стороны)
game_field - состояние игрового поля
cards - массив карт игрока
field_cards - список пар карт, которые находятся на игровом поле. В случае если вместо пары одна карта - именно её нужно покрыть.
deck_counter - количество карт, которые остались в колоде
trump - козырная карта. Остаётся здесь на всё время игры для того чтобы знать какой был козырь.
enemy_cards_counter - количество карт у противника
game_state - структура статуса игры
game_state - "start" - игра только что началась, не было ни одного хода. "play" - игра уже идёт и был хотя бы один ход. "gameover" - игра окончена. Никто не может ходить. В поле result появляется результат игры.
result - null - если игра ещё идёт, то результата нет. "winner" - игрок выиграл. "looser" - игрок проиграл.