Oi Everton,
1- Para responder esta primeira dúvida eu precisaria dar uma olhada no seu código para ver o que está acontecendo e dar um diagnostico melhor.
2- Aqui quando eu tento reiniciar o jogo enquanto o tempo está rolando, o timer fica meio louco, como se vários timers estivessem acontecendo ao mesmo tempo, em vez de ficarem muitos rápidos.
O caso de ficar muito rápido, pode ser por que o evento de focus está sendo atrelado diversas vezes, como você falou. Isto é mitigado utilizando a função one('focus',...) em vez da função on('focus',...). A função one coloca o evento apenas uma vez, e depois de escutar aquela única vez, o listener deixa de existir.
Agora uma outra coisa que pode ser feita é desabilitar o botão de reiniciar enquanto o jogador estiver com tempo rodando.
Isto pode ser feito com a função .off(). Então, assim que o tempo começar a rolar, ou seja depois do evento focus:
campo.one("focus", function() {
//AQUI
...
}
Você pode adicionar a linha :
$("#botao-reiniciar").off('click');
Que remove os event listeners de click do botão reiniciar, assim por mais que o usuário clique nele, nada irá acontecer.
Mas claro, não podemos esquecer de recolocar lá o evento de click quando o tempo chegar a zero, afinal queremos que o jogador consiga reiniciar o timer. Por isso, na nossa detecção de quando o tempo chega a zero:
if (tempoRestante < 1) {
// AQUI
...
}
Nos adicionamos o evento de click no botão reiniciar:
$("#botao-reiniciar").click(reiniciaJogo);
O código final, após estas modificações deve ficar assim:
function inicializaCronometro() {
var tempoRestante = $("#tempo-digitacao").text();
campo.on("focus", function() {
$("#botao-reiniciar").off('click');
var cronometroID = setInterval(function() {
tempoRestante--;
$("#tempo-digitacao").text(tempoRestante);
if (tempoRestante < 1) {
$("#botao-reiniciar").click(reiniciaJogo);
campo.attr("disabled", true);
clearInterval(cronometroID);
campo.toggleClass("campo-desativado");
}
}, 1000);
});
}
Espero que tenha resolvido suas dúvidas