Advertisement
Guest User

SokobanAPI

a guest
Feb 25th, 2018
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
JSON 7.68 KB | None | 0 0
  1. В кратце:[
  2.     Есть три коллекции:
  3.         пользователи, уровни и сессии. (может быть, добавится рейтинг)
  4.  
  5.     Играется так: у нас есть пользователь, у пользователя активная сессия.
  6.     Сессия хранит информацию о сделанных ходах и карту.
  7.     Активную сессию можно модифицировать, т.е. сделать ход.
  8.  
  9.     Всё постарался уложить на REST
  10. ]
  11.  
  12. WORKFLOW:[
  13.     0. Если надо, создаем новые уровни. Или берем существующий
  14.         POST /api/levels/?level=...
  15.         передавать надо только карту и кол-во задвинутых ящиков для победы. Id запишет сервер
  16.         ОК (200) : уровень создан, записан в БД. В теле получаем id
  17.         400 : некорректный запрос. Например, ящиков меньше, чем надо для победы, или нет игрока на карте
  18.         500 : не получилось создать новый уровень. Например коллекция уже забита под завязку
  19.         Уровни хранятся в *коллекция*<gameLevel>
  20.        
  21.  
  22.         GET /api/levels (опционально задаем пагинацию: start, count)
  23.         OK(200) : получаем список из count уровней с id, начиная от start.
  24.         Не гарантируется, что id  равен положению в этом списке. например запрос start=10&count=3 вполне может вернуть уровни [id=42, id=21, id=64].
  25.         Если start+count превышает размер коллекции, но start лежит в ней, то вернет сколько может.
  26.         Если пагинация не задана, то выводятся первые 10.
  27.  
  28.         400: неверно задали пагинацию или тому подобное
  29.  
  30.         GET /api/levels/id
  31.         OK(200) : получаем json с gameLevel
  32.         400 : уровня еще нет
  33.  
  34.         PUT /api/levels/ - не нужно?
  35.  
  36.         // можно изменить колличество ящиков для победы и тому подобное
  37.         PUT /api/levels/id
  38.  
  39.         DELETE /api/levels
  40.         DELETE /api/levels/id
  41.         Удаляет уровень из коллекции.
  42.         Если сделаю авторизацию с группами пользователей, то надо будет приписать аннотацию [AuthenticationRequired]
  43.         и кидать 400 ошибку для всех кроме админа
  44.         OK(200) : ...
  45.         400 : недостаточно прав
  46.  
  47.  
  48.         HTTP Status Code: 400
  49.         {"code" : 400, "message": "There are no player on the map"}
  50.  
  51.  
  52.     1. Создаем нового пользователя или получаем существующего по логину.
  53.         POST /api/users/?login="sample"
  54.         ОК (200) : пользователь создан, в теле возвращается его Id
  55.         400 : пользователь с таким логином уже существует
  56.         Пользователь кидается в *коллекция*<userProfile>
  57.  
  58.         GET /api/users (опционально задаем пагинацию: start, count)
  59.         по аналогии с уровнями
  60.  
  61.         GET /api/users/login
  62.         ОК (200) : пользователь найден, в теле возвращается его userProfile
  63.         400 : пользователь с таким логином не найден
  64.  
  65.         PUT /api/users/login/?login="new_login"
  66.         ОК (200) : логин изменен
  67.         400 : логин уже занят
  68.  
  69.         DELETE /api/users/
  70.         DELETE /api/users/login
  71.         по аналогии с уровнями
  72.  
  73.     // сессии специально не хранят никаких ссылок на игроков. На случай, если захочется сделать кооператив, например
  74.     // Тогда достаточно будет приписать другому пользователю id уже существующей сессии другого игрока. Но это так, фантазии
  75.     2. Создаем новую игровую сессию для игрока по его id и номеру уровня. Дальше игра будет происходить в рамках этой сессии
  76.     или восстанавливаем уже начатую из userProfile.userSession
  77.         POST /api/rooms/?usrId=42&level=42
  78.         OK(200) : id созданной сессии записывается в userProfile.userSession заместо предыдущей.
  79.         Предыдущая сессия удаляется из БД.
  80.         В теле получаем id созданной сессии.
  81.         400 : пользователь из уровень не найдены и сессия не создана
  82.         Игровые сессии хранятся в виде *коллекция*<playerId, gameSession>
  83.        
  84.         GET /api/rooms/
  85.         GET /api/rooms/id
  86.         Возвращает только основную инфу по сессии: id, запущенный уровень, состояние игры (выиграл/в процессе)
  87.         Чтобы получить карту:
  88.         GET /api/rooms/id/map
  89.         GET /api/rooms/id/map/x/y (просто через /x получить строку нельзя)
  90.  
  91.         // Модификация только одна - сделать ход
  92.         PUT /api/rooms/id/?turn="Direction"
  93.         OK(200) : ход сделан, в теле возвращается измененная сессия.. или нет?
  94.         Можно, например, возвращать только изменившиеся клетки. Это не совсем по REST'у, но должно быть удобнее.
  95.        400 : заданно неправильно направление, или ход невозможен (ход в стену, толкание больше одного ящика)
  96.  
  97.        DELETE /api/rooms/
  98.        DELETE /api/rooms/login
  99.        по аналогии с уровнями
  100. ]
  101.  
  102. DATA:[
  103.    // userProfile
  104.    {
  105.        "userInfo":{
  106.            "id":123,
  107.            "login":"sampleName"
  108.        },
  109.        "userSession":{
  110.            "sessionID":987
  111.        }
  112.    }
  113.  
  114.    // gameSession
  115.    {
  116.        "id":987,
  117.        "level":gameLevelId,
  118.        "state":"complete", если pushed == level.goal, иначе "play"
  119.        "steps":stepsCount,
  120.        "pushed":pushedBoxesCount,
  121.        "map":[
  122.            таже карта из уровня, только уже модифицированная
  123.        ]
  124.    }
  125.  
  126.    // gameLevel
  127.    {
  128.        "id":1,
  129.        "goal":5,
  130.        "map":[
  131.            {   "type":"Player",
  132.                "x":0,
  133.                "y":0,
  134.            },
  135.  
  136.            {   "type":"Wall",
  137.                "x":1,
  138.                "y":0,
  139.            },
  140.  
  141.            {   "type":"Target",
  142.                "x":2,
  143.                "y":0,
  144.            },
  145.  
  146.            {   "type":"Chest",
  147.                "x":2,
  148.                "y":0,
  149.            },
  150.  
  151.            // и так далее ...
  152.        ]
  153.    }
  154. ]
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement