Correção ao selecionar um jogador para escolher um termo

Um problema fazia com que um jogador fosse escolhido duas vezes seguintas para escolher um termo algumas vezes. Este problema foi corrigido.
This commit is contained in:
luca0N! 2021-01-02 23:13:51 -03:00
parent 158bc9bfc5
commit 9372142cad
Signed by: luca0N
GPG Key ID: 68FDED9A81B90723
2 changed files with 46 additions and 11 deletions

View File

@ -300,9 +300,12 @@ wss.on('connection', ws => {
salaObj.palavra = resposta.extra.palavra.toUpperCase();
salaObj.definirPalavraLetrasQtd();
salaObj.termoVezDe = clienteEscolhido;
salaObj.termoVezDe = salaObj.próxItemJf === undefined ? salaObj.jf[0] : salaObj.próxItemJf();
if (salaObj.termoVezDe === salaObj.vezDe)
salaObj.termoVezDe = salaObj.próxItemJf();
salaObj.estadoTermo = "AGUARDANDO_LETRA";
salaObj.jf.push(clienteEscolhido);
// Vamos alertar todos os clientes sobre este evento.
alertarClientesEvento("EVENTO_PALAVRA_ESCOLHIDA", cliente.sala, { palavra: { tamanho: resposta.extra.palavra.length, espaços: salaObj.procurar(' '), hífens: salaObj.procurar('-') }, tema: resposta.extra.tema, termoVezDe: salaObj.termoVezDe });
@ -357,11 +360,14 @@ wss.on('connection', ws => {
let lp = resultadoTermo.letrasPreenchidas;
let r = resultadoTermo.resultado;
let tentarNovamente = false;
let dif = 0, // diferença da nova pontuação do jogador que enviou o termo
dife = 0; // diferença da nova pontuação do jogador que enviou a palavra atual
switch (r){
case "LETRA_JÁ_ESCOLHIDA":{
alertarClientesEvento("EVENTO_TERMO_ESCOLHIDO", cliente.sala, { tipo: letra ? "LETRA" : "TERMO", termo: resposta.extra.termo, resultado: r });
tentarNovamente = true;
break;
}
case "LETRAS_PREENCHIDAS":{
@ -427,7 +433,7 @@ wss.on('connection', ws => {
break;
}
}
escolherJogadorTermo(salaObj);
escolherJogadorTermo(salaObj, tentarNovamente? cliente.apelido : undefined);
// Enviar um alerta para todos os clientes da sala.
// Não é necessário especificar o apelido do jogador. Os clientes já vão estar esperando uma resposta do cliente em questão.
/*alertarClientesEvento("EVENTO_TERMO_ESCOLHIDO", cliente.sala, { tipo: letra ? "LETRA" : "TERMO", termo: resposta.extra.termo });*/
@ -730,12 +736,17 @@ function alterarTin(sala, valor){
}
}
function escolherJogadorTermo(sala){
function escolherJogadorTermo(sala, jogador){
// Escolher outro jogador para enviar o próximo termo.
let ja = sala.gerarJogadorAleatório();
sala.jf.push(ja);
sala.termoVezDe = ja;
if (sala.jf.indexOf(sala.termoVezDe) === sala.jf.length - 1)
sala.termoVezDe = null;
sala.termoVezDe = sala.próxItemJf();
if (sala.termoVezDe === sala.vezDe)
sala.termoVezDe = sala.próxItemJf();
let ja = sala.termoVezDe;
// É hora de descobrir a palavra inteira?
let possívelDescoberta = sala.possívelDescoberta();

30
sala.js
View File

@ -49,7 +49,20 @@ class Sala {
novaPartida(){
this.estado = 'EM_PARTIDA';
// Popular a fila JFR.
this.jf = [];
let tmpJf = [];
for (let x = 0; x < this.clientes.length; x++)
if (this.clientes[x].apelido !== this.vezDe)
tmpJf.push(this.clientes[x].apelido);
for (let x = tmpJf.length; x > 0; x--){
// Pegar um jogador aleatório da fila.
let num = Sala.gerarNúmeroAleatório(tmpJf.length);
this.jf.push(tmpJf[num]);
tmpJf.splice(num, 1);
}
let tmpJfr = []; // JFR temporária, utilizado para popular a JFR verdadeira.
for (let x = 0; x < this.clientes.length; x++)
@ -76,16 +89,27 @@ class Sala {
this.ldc = []; // Letras descobertas
this.jpa = null; // Jogador que escolheu a palavra atual (Jogador Palavra Atual)
this.palavra = null;
this.jf = [];
this.tin = 0;
// Vamos escolher um jogador aleatório.
if (this.jfr.indexOf(this.vezDe) === this.jfr.length - 1)
// Fim da fila JFR atingido. Voltar para o começo.
this.vezDe = null;
this.vezDe = this.vezDe === undefined || this.vezDe === null ? this.jfr[0] : this.jfr[this.jfr.indexOf(this.vezDe) + 1]; // Escolher o primeiro jogador na fila caso o limite tenha sido atingido, ou escolher o próximo jogador na fila caso contrário.
}
}
/**
* Retorna o próximo item da fila JF.
* @returns String O próximo item da fila JF.
* @since 02/01/2020
*/
próxItemJf(){
let pv1 = this.jf[this.jf.indexOf(this.termoVezDe) + 1];
if (pv1 !== undefined)
return pv1;
return this.jf[0];
}
/**
* Calcula e define a quantidade de letras na palavra atual.