-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.js
139 lines (111 loc) · 3.94 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
const express = require("express");
const http = require("http");
const socketIO = require("socket.io");
const app = express();
const server = http.createServer(app);
const io = socketIO(server);
const plays = ["Pedra", "Papel", "Tesoura"];
app.use(express.static(__dirname + "/public"));
app.get("/", (req, res) => {
res.sendFile(__dirname + "/index.html");
});
// Armazena as salas e os jogadores
const rooms = {};
// Inicializa o servidor WebSocket
io.on("connection", (socket) => {
console.log(`Novo jogador conectado: ${socket.id}`);
// Cria uma nova sala e adiciona o jogador
let room = null;
for (const roomId in rooms) {
if (rooms[roomId].players.length < 2) {
room = roomId;
break;
}
}
if (!room) {
room = socket.id;
rooms[room] = { players: [socket.id] };
} else {
rooms[room].players.push(socket.id);
}
// Envia as jogadas disponíveis para o novo jogador
socket.emit("plays", plays);
// Quando um jogador envia o nome
socket.on("setPlayerName", (name) => {
console.log(`Nome do jogador ${socket.id}: ${name}`);
rooms[room].name = name;
// Verifica se ambos os jogadores já enviaram o nome
const players = rooms[room].players;
if (players.length === 2) {
const player1 = players[0];
const player2 = players[1];
// Envia o nome do jogador e a mensagem de espera para o oponente
const opponent = player1 === socket.id ? player2 : player1;
const playerName = rooms[room].name;
io.to(opponent).emit("opponentName", playerName);
}
});
// Função para determinar o resultado do jogo
function determineResult(player, opponent) {
if (player === opponent) {
return "Empate!";
} else if (
(player === "Pedra" && opponent === "Tesoura") ||
(player === "Papel" && opponent === "Pedra") ||
(player === "Tesoura" && opponent === "Papel")
) {
return "Você ganhou!";
} else {
return "Você perdeu!";
}
}
// Quando um jogador faz uma jogada
socket.on("play", (play) => {
console.log(`Jogada do jogador ${socket.id} na sala ${room}: ${play}`);
const opponent = rooms[room].players.find((player) => player !== socket.id);
if (!opponent) {
return;
}
// Inicializa a estrutura de jogadas para a sala, se ainda não estiver inicializada
if (!rooms[room].plays) {
rooms[room].plays = {};
}
// Armazena a jogada do jogador
rooms[room].plays[socket.id] = play;
io.to(opponent).emit("waiting", "Aguardando sua jogada...");
// Verifica se ambos os jogadores já fizeram suas jogadas
const players = Object.keys(rooms[room].plays);
if (players.length === 2) {
const player1 = players[0];
const player2 = players[1];
const player1Play = rooms[room].plays[player1];
const player2Play = rooms[room].plays[player2];
// Verifica o resultado do jogo
const resultPlayer1 = determineResult(player1Play, player2Play);
const resultPlayer2 = determineResult(player2Play, player1Play);
// Envia o resultado para cada jogador
io.to(player1).emit("result", { player: player1Play, opponent: player2Play, result: resultPlayer1 });
io.to(player2).emit("result", { player: player2Play, opponent: player1Play, result: resultPlayer2 });
// Limpa as jogadas da sala
delete rooms[room].plays[player1];
delete rooms[room].plays[player2];
}
});
// Quando um jogador se desconecta
socket.on("disconnect", () => {
console.log(`Jogador desconectado: ${socket.id}`);
// Remove o jogador da sala
const playerIndex = rooms[room].players.indexOf(socket.id);
if (playerIndex !== -1) {
rooms[room].players.splice(playerIndex, 1);
}
// Se não houver mais jogadores na sala, remove a sala
if (rooms[room].players.length === 0) {
delete rooms[room];
}
});
});
const port = 80;
server.listen(port, () => {
console.log(`Servidor rodando em http://localhost:${port}`);
});