5.4 KiB
id, title, challengeType, forumTopicId, dashedName
id | title | challengeType | forumTopicId | dashedName |
---|---|---|---|---|
5e601c775ac9d0ecd8b94aff | Gioco multiplayer in tempo reale sicuro | 4 | 462375 | secure-real-time-multiplayer-game |
--description--
Sviluppa un gioco multigiocatore in tempo reale 2D utilizzando l'API HTML Canvas e il Socket.io che è funzionalmente simile a questo: https://secure-real-time-multiplayer-game.freecodecamp.rocks/. Lavorare su questo progetto ti porterà a scrivere il tuo codice utilizzando uno dei seguenti metodi:
- Clonare questo repository GitHub e completare il tuo progetto localmente.
- Usare la nostra bozza di progetto su Replit per completare il tuo progetto.
- Usare un costruttore di siti a tua scelta per completare il progetto. Assicurati di incorporare tutti i file del nostro repository GitHub.
Quando hai finito, assicurati che una demo funzionante del tuo progetto sia ospitata in qualche percorso pubblico. Quindi invia l'URL nel campo Solution Link
. Facoltativamente, invia anche un link al codice sorgente del tuo progetto nel campo GitHub Link
.
--instructions--
Nota: helmet@^3.21.3
è necessario per le user stories. Ciò significa che sarà necessario utilizzare la versione precedente della documentazione di Helmet per avere informazioni su come soddifare le user stories.
--hints--
È necessario fornire il proprio progetto, non l'URL di esempio.
(getUserInput) => {
assert(
!/.*\/secure-real-time-multiplayer-game\.freecodecamp\.rocks/.test(
getUserInput('url')
)
);
};
Più giocatori possono connettersi a un server e giocare.
Ogni giocatore ha un avatar.
Ogni giocatore è rappresentato da un oggetto creato dalla classe Player
in Player.mjs
.
Ogni oggetto giocatore dovrebbe contenere come minimo un id
univoco, un punteggio (score
), e coordinate x
e y
che rappresentano la posizione corrente del giocatore.
Il gioco ha almeno un tipo di oggetto da raccogliere. Completa la classe Collectible
in Collectible.mjs
per implementarlo.
Ogni oggetto da raccogliere creato dalla classe Collectible
dovrebbe contenere come minimo un id
univoco, un valore value
e coordinate x
e y
che rappresentano la posizione corrente dell'elemento.
I giocatori possono utilizzare i tasti WASD e/o freccia per spostare il loro avatar. Completa il metodo movePlayer
in Player.mjs
per implementarlo.
Il metodo movePlayer
dovrebbe accettare due argomenti: una stringa "up", "down", "left", o "right", e un numero per la quantità di pixel di cui dovrebbe cambiare la posizione del giocatore. movePlayer
dovrebbe cambiare le coordinate x
e y
dell'oggetto giocatore da cui è chiamato.
Il punteggio del giocatore dovrebbe essere usato per calcolare il suo rango tra gli altri giocatori. Completa il metodo calculateRank
nella classe Player
per implementarlo.
Il metodo calculateRank
dovrebbe accettare un array di oggetti che rappresentano tutti i giocatori collegati e restituire la stringa Rank: currentRanking/totalPlayers
. Ad esempio, in una partita con due giocatori, se il giocatore A ha un punteggio di 3 e il giocatore B ha un punteggio di 5, calculateRank
per il giocatore A dovrebbe restituire Rank: 2/2
.
I giocatori possono scontrarsi con un oggetto da collezionare. Completa il metodo collision
in Player.mjs
per implementarlo.
Il metodo collision
dovrebbe accettare l'oggetto di un elemento collezionabile come argomento. Se l'avatar del giocatore si interseca con l'oggetto, il metodo collision
dovrebbe restituire true
.
Tutti i giocatori sono sincronizzati.
I giocatori possono disconnettersi dal gioco in qualsiasi momento.
Impedisci al client di indovinare / sniffare il tipo 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');
};
Impedisci attacchi di script cross-site (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');
};
Niente di proveniente dal sito è memorizzato nella cache del client.
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');
};
Le intestazioni dicono che il sito è basato su "PHP 7.4.3" anche se non lo è (come misura di sicurezza).
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.
*/