Files

7.1 KiB
Raw Permalink Blame History

id, title, challengeType, forumTopicId, dashedName
id title challengeType forumTopicId dashedName
5e601c775ac9d0ecd8b94aff Безпечна мультиплеєрна гра в режимі реального часу 4 462375 secure-real-time-multiplayer-game

--description--

Розробіть 2D оперативну багатокористувацьку гру в режимі HTML Canvas API та Socket.io, що функціонально схожа на це: https://secure-real-time-multiplayer-game.freecodecamp.rocks/. Робота над цим проєктом бути включати написання кода одним із таких методів:

  • Клонувати цей GitHub репозиторій та локально завершити ваш проєкт.
  • Використовуйте наш Replit проєкт, щоб завершити ваш проєкт.
  • Для завершення проєкту використайте вибраний вами розробник сайтів. Не забудьте включити всі файли із нашого репозиторію GitHub.

Коли ви завершили, переконайтеся, що демоверсія вашого проекту розміщена у відкритому доступі. Потім введіть URL-адресу у поле Solution Link. Додатково, також вкажіть посилання на вхідний код вашого проєкту у полі GitHub Link.

--instructions--

Примітка: helmet@^3.21.3 потрібна для користувацьких історій. Це означає, що вам потрібно буде використовувати попередню версію документації Helmet, щоб отримати інформацію про те, як досягти історій користувача.

--hints--

Ви можете вказати свій власний проєкт, а не приклад URL.

(getUserInput) => {
  assert(
    !/.*\/secure-real-time-multiplayer-game\.freecodecamp\.rocks/.test(
      getUserInput('url')
    )
  );
};

Декілька гравців можуть підключитися до сервера і грати.


У кожного гравця є аватар.


Кожен гравець представлений об'єктом, створеним класом Player у Player.mjs.


Як мінімум, кожен гравець повинен містити унікальний id, score, x і y координати, які відображають поточну позицію гравця.


Гра має принаймні один тип предметів, які треба збирати. Заповніть Collectible клас у Collectible.mjs для наслідування цього.


Як мінімум, кожен зібраний об'єкт предметів, створений класом Collectible повинен містити унікальний id, value та x і y координат, що представляють поточну позицію предмета.


Гравці можуть використовувати клавіші WASD та/або стрілки, щоб перемістити свій аватар. Заповніть movePlayer метод у Player.mjs щоб це реалізувати.


Метод movePlayer повинен приймати два аргументи: рядок "up", "down", "left" або "right", а також число пікселів, на яку позиція гравця має змінюватися. movePlayer повинен адаптуватися до x і y координат об'єкта який його викликав.


Рахунок гравця повинен розраховувати його рейтинг серед інших гравців. Заповніть calculateRank метод у Player щоб це реалізувати.


Метод calculateRank повинен приймати масив об'єктів, які представляють всіх підключених гравців і повернути рядок Rank: currentRanking/totalPlayers. Наприклад, в грі з двома гравцями, якщо гравець А має рахунок 3 і гравець В має рахунок 5, calculateRank для гравця A повинен повернути Rank: 2/2.


Гравці можуть зіткнутися з предметом, який треба збирати. Заповніть collision метод у Player.mjs щоб це реалізувати.


Метод collision повинен приймати об'єкт збору предмета в якості аргумента. Якщо аватар гравця перетинається з предметом, метод collision повинен повернути true.


Всі гравці залишаються синхронізованими.


Гравці можуть відключитись від гри в будь-який час.


Заборонити клієнту вгадувати тип MIME.

async (getUserInput) => {
  const data = await fetch(getUserInput('url') + '/_api/app-info');
  const parsed = await data.json();
  assert.equal(parsed.headers['x-content-type-options'], 'nosniff');
};

Заборонити міжсайтові скрипти (XSS) атаки.

async (getUserInput) => {
  const data = await fetch(getUserInput('url') + '/_api/app-info');
  const parsed = await data.json();
  assert.equal(parsed.headers['x-xss-protection'], '1; mode=block');
};

Немає даних з веб-сайту.

async (getUserInput) => {
  const data = await fetch(getUserInput('url') + '/_api/app-info');
  const parsed = await data.json();
  assert.equal(parsed.headers['surrogate-control'], 'no-store');
  assert.equal(
    parsed.headers['cache-control'],
    'no-store, no-cache, must-revalidate, proxy-revalidate'
  );
  assert.equal(parsed.headers['pragma'], 'no-cache');
  assert.equal(parsed.headers['expires'], '0');
};

Заголовки кажуть, що сайт працює на "PHP 7.4.3", не дивлячись на те, що це насправді не так (написано з міркувань безпеки).

async (getUserInput) => {
  const data = await fetch(getUserInput('url') + '/_api/app-info');
  const parsed = await data.json();
  assert.equal(parsed.headers['x-powered-by'], 'PHP 7.4.3');
};

--solutions--

/**
  Backend challenges don't need solutions,
  because they would need to be tested against a full working project.
  Please check our contributing guidelines to learn more.
*/