Foco da Matéria: Entender a arquitetura Cliente-Servidor. Usar o JavaScript para fazer requisições assíncronas (AJAX/Fetch) para um script PHP simples, que recebe e armazena o High Score em um banco de dados simulado (ou real, dependendo da instalação).
1. 🌐 A Necessidade do Backend
Enquanto o localStorage salva o recorde no seu PC, ele não permite competir com outros jogadores. Para um placar global, precisamos de um servidor para:
- Receber o nome do jogador e a pontuação.
- Armazenar esses dados em um banco de dados (ex: MySQL).
- Devolver a lista dos 10 melhores para o navegador.
2. 📝 O Script Backend (PHP)
Vamos criar um script PHP simples que apenas recebe os dados e os salva. Para simplificar, vamos salvar em um arquivo de texto (highscores.txt) em vez de um banco de dados real.
Crie um arquivo chamado save_score.php:
PHP
<?php
header('Content-Type: application/json');
// Permite que o JavaScript de qualquer origem acesse este script (CORS)
header("Access-Control-Allow-Origin: *");
// 1. Receber os dados enviados pelo JavaScript (método POST)
$data = json_decode(file_get_contents('php://input'), true);
$playerName = $data['name'] ?? 'Anon';
$playerScore = $data['score'] ?? 0;
// Validação básica
if ($playerScore <= 0 || empty($playerName)) {
echo json_encode(['status' => 'error', 'message' => 'Pontuação ou nome inválido.']);
exit;
}
// 2. Formatar a linha de dados (exemplo simples sem DB)
$scoreLine = date('Y-m-d H:i:s') . " | " . $playerName . " | " . $playerScore . "\n";
// 3. Salvar no arquivo (simulando o armazenamento)
$filename = 'highscores.txt';
if (file_put_contents($filename, $scoreLine, FILE_APPEND | LOCK_EX) !== false) {
echo json_encode(['status' => 'success', 'message' => 'Pontuação salva com sucesso!', 'record' => $scoreLine]);
} else {
echo json_encode(['status' => 'error', 'message' => 'Erro ao salvar pontuação.']);
}
?>
Atenção: Para que este script PHP funcione, você precisa de um ambiente de servidor web (como XAMPP, WAMP ou um servidor de hospedagem real).
3. 📡 A Comunicação Cliente-Servidor (JavaScript Fetch)
Agora, voltamos ao nosso game.js para enviar a pontuação final ao servidor. Usaremos a API moderna fetch do JavaScript, que é baseada em Promises e é a forma mais limpa de fazer AJAX (Asynchronous JavaScript and XML).
Adicione a função sendScoreToBackend ao seu game.js:
JavaScript
// --- ENDPOINT DO SEU SCRIPT PHP ---
const BACKEND_ENDPOINT = 'http://localhost/seu-projeto/save_score.php'; // ALtere para o seu caminho
// --- NOVO: Função para enviar a pontuação ao servidor ---
function sendScoreToBackend(finalScore) {
// Apenas envia se a pontuação for razoável
if (finalScore <= 0) return;
// Pede o nome do jogador
const playerName = prompt("Parabéns! Novo Recorde. Digite seu nome para o Placar Global:");
if (!playerName) return;
fetch(BACKEND_ENDPOINT, {
method: 'POST', // Usamos o método POST para enviar dados
headers: {
'Content-Type': 'application/json', // Informa ao servidor que estamos enviando JSON
},
body: JSON.stringify({ // Converte os dados JS para a String JSON
name: playerName,
score: finalScore
}),
})
.then(response => response.json()) // Converte a resposta do servidor de volta para JSON
.then(data => {
console.log('Resposta do Backend:', data);
if (data.status === 'success') {
alert("Pontuação enviada para o Placar Global!");
} else {
alert("Erro ao enviar a pontuação.");
}
})
.catch(error => {
console.error('Erro de conexão:', error);
alert("Erro de conexão com o servidor. Verifique o console.");
});
}
4. 🔗 Integrando no Fluxo do Jogo
Finalmente, chamamos a nova função de comunicação com o backend dentro da função gameOver().
Atualize a função gameOver em game.js (após a checagem do High Score local):
JavaScript
function gameOver() {
isGameRunning = false;
// Salva o recorde local
const isNewHighScore = score > highScore;
salvarHighScore(); // (Função do Tema 6)
alert(`Game Over! Sua pontuação final foi: ${score}. Recorde atual: ${highScore}`);
// NOVO: Se for um novo recorde local, tenta enviar para o placar global
if (isNewHighScore && score > 0) {
sendScoreToBackend(score);
}
// ... (restante do código) ...
}
Com esta última etapa, a maratona está completa! Criamos um jogo funcional, organizado com POO, com persistência local e capacidade de se comunicar com um backend para um placar global.
Estou acompanhando a maratona⚡️