othello-m
Version:
Jeu de table "Othello" multijoueurs fait en Node.js/Socket.io dans le cadre du projet "Développement web 2", encadré par monsieur "Timo Jolivet"
343 lines (319 loc) • 14.9 kB
JavaScript
/**
** Server Config
**/
var express = require('express');
var app = express();
var game = require('./game');
var randomstring = require("randomstring"); //https://github.com/klughammer/node-randomstring
var httpServer = require('http').createServer(app);
var io = require('socket.io').listen(httpServer);
httpServer.listen(3030);
console.log('server running at http://localhost:3030/');
app.set('view engine', 'ejs'); // Moteur de template
app.use('/assets', express.static(('public')));
app.get('/', function (req, res){
res.render('pages/index');
});
/**
** Game Data
**/
var users = {}; // list des users connectées au serveur
var rooms = {}; // list des rooms(Parties) du serveur
/**
** Fonction pour vérifier si un joueur appartien déjà a une room
**/
var has_a_room = function(socket_id, rooms){
for(i=0; i<rooms.length; i++){
if(io.sockets.adapter.sids[socket_id][rooms[i]])
return true;
}
return false;
}
/**
** Les Sockets
**/
io.sockets.on('connection', function(socket){
socket.on('new_login', function(data) {
if(data.username in users){
socket.emit('new_login', {error: true});
return;
}
console.log('new_login : '+data.username+' connecté.')
socket.username = data.username;
users[socket.username] = socket;
socket.emit('new_login', {
username: socket.username,
error: false
});
socket.emit('update_list_rooms', rooms);
io.sockets.emit('update_users_online', Object.keys(users));
});
socket.on('new_room', function() {
if(has_a_room(socket.id, rooms)) return;
var room = randomstring.generate(5);
socket.join(room);
console.log('new_room : '+room+' créer par '+socket.username);
socket.logged_room = room;
rooms[room] = {
board: game.init_board(),
name_p1: socket.username,
name_p2: null,
is_full: 0
};
io.sockets.emit('update_list_rooms', rooms);
io.to(socket.id).emit('add_navbar_message', {username: socket.username, roomname: socket.logged_room});
io.to(socket.id).emit('go_to_room', {room_info:rooms[room]}); // on envoie l'information a tous les client de la room
io.in(room).emit('refresh_board', {board: rooms[room].board});
io.in(room).emit('server_messages', {
user: "Système",
text: "En attente d\'un deuxième joueurs."
});
});
socket.on('sent_msg', function(data) {
if(socket.username != undefined){
data.user = socket.username;
console.log('Message : "'+data.text+'"');
console.log('Sent by : '+data.user);
io.in(socket.logged_room).emit('new_msg', data);
}
});
socket.on('join_room', function(room) {
if(has_a_room(socket.id, rooms)) return;
if(rooms[room].is_full) return;
socket.join(room);
socket.logged_room = room;
console.log('join_room : '+socket.username+' join '+room);
rooms[room].name_p2 = socket.username;
rooms[room].turn = 'NOT_YET';
rooms[room].is_full = 1;
rooms[room].color_p1 = 'black';
rooms[room].color_p2 = 'white';
rooms[room].score_p1 = game.get_player_score(rooms[room].board, rooms[room].color_p1);
rooms[room].score_p2 = game.get_player_score(rooms[room].board, rooms[room].color_p2);
rooms[room].global_score_p1 = 0;
rooms[room].global_score_p2 = 0;
var player1 = rooms[room].name_p1;
io.sockets.emit('update_list_rooms', rooms);
io.to(socket.id).emit('go_to_room', {room_info:rooms[room]});
io.to(socket.id).emit('add_navbar_message', {username: socket.username, roomname: socket.logged_room});
io.in(room).emit('refresh_info_view', {room_info: rooms[room]});
io.to(users[player1].id).emit('refresh_hote_view', {text_button: 'Start Game'});
io.in(room).emit('refresh_board', {board: rooms[room].board});
io.in(room).emit('server_messages', {
user: "Système",
text: "Les deux joueurs sont là, le hote peut lancer la partie."
});
});
socket.on('leave_room', function(room) {
if(rooms[room].is_full){
rooms[room].board = game.init_board();
rooms[room].score_p1 = game.get_player_score(rooms[room].board, rooms[room].color_p1);
rooms[room].score_p2 = game.get_player_score(rooms[room].board, rooms[room].color_p2);
rooms[room].global_score_p1 = 0;
rooms[room].global_score_p2 = 0;
rooms[room].is_full = 0;
rooms[room].turn = 'PLAY_OFF';
if(socket.username == rooms[room].name_p2){
rooms[room].name_p2 = null;
var player1 = users[rooms[room].name_p1];
io.to(player1.id).emit('server_messages', {
user: "Système",
text: "Votre adversaire <strong>"+socket.username+"</strong> a quitté la partie<br>Le jeu a été réinitialiser en attendant un autre adversaire."
});
}else if(socket.username == rooms[room].name_p1){
rooms[room].name_p1 = rooms[room].name_p2;
rooms[room].name_p2 = null;
var player1 = users[rooms[room].name_p1];
io.to(player1.id).emit('server_messages', {
user: "Système",
text: "Votre adversaire <strong>"+socket.username+"</strong> a quitté la partie<br>Vous êtes le nouvel hôte de la room {"+socket.logged_room+"}.<br>Le jeu a été réinitialiser en attendant un autre adversaire."
});
}
socket.leave(room);
io.in(room).emit('refresh_board', {board: rooms[room].board});
io.in(room).emit('refresh_info_view', {room_info: rooms[room]});
} else {
console.log('room-deleted :'+room);
delete rooms[room];
}
io.sockets.emit('update_list_rooms', rooms);
io.to(socket.id).emit('go_to_list_room');
});
socket.on('start_game', function() {
var room = socket.logged_room;
var player1 = users[rooms[room].name_p1];
var player2 = users[rooms[room].name_p2];
rooms[room].board = game.init_board();
rooms[room].score_p1 = game.get_player_score(rooms[room].board, rooms[room].color_p1);
rooms[room].score_p2 = game.get_player_score(rooms[room].board, rooms[room].color_p2);
rooms[room].turn = 'player1';
var legal_blocks = game.list_legal_block(rooms[room].board, rooms[room].color_p1);
console.log('game_starting in : '+room+' => '+player1.username+' VS '+player2.username);
io.in(room).emit('game_starting', rooms[room]);
io.in(room).emit('refresh_board', {board: rooms[room].board});
io.to(player1.id).emit('refresh_legal_blocks', {legal_blocks: legal_blocks});
io.in(room).emit('server_messages', {
user: "Système",
text: "Le hote à lancer la partie."
});
});
socket.on('next_player', function (data) {
var winner;
// On récupére les informations a propos de la partie (room)
var room = socket.logged_room;
var player1 = users[rooms[room].name_p1];
var player2 = users[rooms[room].name_p2];
if(socket.username == rooms[room].name_p1 && rooms[room].turn == 'player1'){
if(game.is_legal(data.row, data.col, rooms[room].color_p1, rooms[room].board, 'noapply') != false){
// Si la case ou le joueur veut jouer est légal, on là joue puis on met à jour le plateau
game.is_legal(data.row, data.col, rooms[room].color_p1, rooms[room].board, 'apply');
// On récupére le nouveau score des deux joueurs
rooms[room].score_p1 = game.get_player_score(rooms[room].board, rooms[room].color_p1);
rooms[room].score_p2 = game.get_player_score(rooms[room].board, rooms[room].color_p2);
legal_blocks_p1 = game.list_legal_block(rooms[room].board, rooms[room].color_p1);
legal_blocks_p2 = game.list_legal_block(rooms[room].board, rooms[room].color_p2);
/**
** On vérifie si le player2 peut jouer son tour
** => Si c'est le cas, on lui accorde le prochain tour
** => Sinon, on vérifie si le player1 peut rejouer
** => Si le player1 peut rejouer, on lui accorde le prochain tour
** => Sinon, tant que les deux joueurs ne peuvent pas jouer, on déclare la fin de la partie
**/
if(legal_blocks_p2.length > 0){
rooms[room].turn = 'player2';
io.in(room).emit('refresh_board', {board: rooms[room].board});
io.to(player2.id).emit('refresh_legal_blocks', {legal_blocks: legal_blocks_p2});
io.in(room).emit('refresh_info_view', {room_info: rooms[room]});
} else if (legal_blocks_p1.length > 0){
rooms[room].turn = 'player1';
io.in(room).emit('refresh_board', {board: rooms[room].board});
io.to(player1.id).emit('refresh_legal_blocks', {legal_blocks: legal_blocks_p1});
io.in(room).emit('refresh_info_view', {room_info: rooms[room]});
} else {
rooms[room].turn = 'GAME_OVER';
io.in(room).emit('refresh_board', {board: rooms[room].board});
// vérifiié qul joueur a gagné
if(rooms[room].score_p1>rooms[room].score_p2){
rooms[room].global_score_p1++;
winner = player1.username;
} else if (rooms[room].score_p1<rooms[room].score_p2){
rooms[room].global_score_p2++;
winner = player2.username;
}
io.in(room).emit('game_over', {winner: winner});
io.in(room).emit('refresh_info_view', {room_info: rooms[room]});
io.to(player1.id).emit('refresh_hote_view', {text_button: 'Play Again'});
io.in(room).emit('server_messages', {
user: "Système",
text: "Partie terminée.<br>Le hote <strong>"+player1.username+"</strong> peut relancer une nouvelle partie."
});
}
} else {
io.to(socket.id).emit('server_messages', {
user: "Système",
text: "Vous ne pouvez pas jouer dans cette case."
});
}
} else if (socket.username == rooms[room].name_p2 && rooms[room].turn == 'player2'){
if(game.is_legal(data.row, data.col, rooms[room].color_p2, rooms[room].board, 'noapply') != false){
game.is_legal(data.row, data.col, rooms[room].color_p2, rooms[room].board, 'apply');
rooms[room].score_p1 = game.get_player_score(rooms[room].board, rooms[room].color_p1);
rooms[room].score_p2 = game.get_player_score(rooms[room].board, rooms[room].color_p2);
legal_blocks_p1 = game.list_legal_block(rooms[room].board, rooms[room].color_p1);
legal_blocks_p2 = game.list_legal_block(rooms[room].board, rooms[room].color_p2);
if(legal_blocks_p1.length > 0){
rooms[room].turn = 'player1';
io.in(room).emit('refresh_board', {board: rooms[room].board});
io.to(player1.id).emit('refresh_legal_blocks', {legal_blocks: legal_blocks_p1});
io.in(room).emit('refresh_info_view', {room_info: rooms[room]});
} else if (legal_blocks_p2.length > 0){
rooms[room].turn = 'player2';
io.in(room).emit('refresh_board', {board: rooms[room].board});
io.to(player2.id).emit('refresh_legal_blocks', {legal_blocks: legal_blocks_p2});
io.in(room).emit('refresh_info_view', {room_info: rooms[room]});
} else {
rooms[room].turn = 'GAME_OVER';
io.in(room).emit('refresh_board', {board: rooms[room].board});
// vérifiié qul joueur a gagné
if(rooms[room].score_p1>rooms[room].score_p2){
rooms[room].global_score_p1++;
winner = player1.username;
} else if (rooms[room].score_p1<rooms[room].score_p2){
rooms[room].global_score_p2++;
winner = player2.username;
}
io.in(room).emit('game_over', {winner: winner});
io.in(room).emit('refresh_info_view', {room_info: rooms[room]});
io.to(player1.id).emit('refresh_hote_view', {text_button: 'Play Again'});
io.in(room).emit('server_messages', {
user: "Système",
text: "Partie terminée.<br>Le hote <strong>"+player1.username+"</strong> peut relancer une nouvelle partie."
});
}
} else {
io.to(socket.id).emit('server_messages', {
user: "Système",
text: "Vous ne pouvez pas jouer dans cette case."
});
}
} else if (rooms[room].turn == 'PLAY_OFF') {
io.to(socket.id).emit('server_messages', {
user: "Système",
text: "Adversaire non trouvé."
});
} else if (rooms[room].turn == 'NOT_YET'){
io.to(socket.id).emit('server_messages', {
user: "Système",
text: "Le hote n\'a pas encore lancer la partie."
});
} else if (rooms[room].turn == "GAME_OVER") {
// en cours....
} else {
io.to(socket.id).emit('server_messages', {
user: "Système",
text: "Patientez, votrez adversaire n\'a pas encore jouer son tour."
});
}
});
socket.on('disconnect', function(data) {
if(!socket.username) return; // si c'était un simple visiteur(non connecter)
if(socket.logged_room){
var room = socket.logged_room;
if(rooms[room].is_full){
rooms[room].board = game.init_board();
rooms[room].score_p1 = game.get_player_score(rooms[room].board, rooms[room].color_p1);
rooms[room].score_p2 = game.get_player_score(rooms[room].board, rooms[room].color_p2);
rooms[room].global_score_p1 = 0;
rooms[room].global_score_p2 = 0;
rooms[room].is_full = 0;
rooms[room].turn = 'PLAY_OFF';
if(socket.username == rooms[room].name_p2){
rooms[room].name_p2 = null;
var player1 = users[rooms[room].name_p1];
io.to(player1.id).emit('server_messages', {
user: "Système",
text: "Votre adversaire <strong>"+socket.username+"</strong> a quitté la partie<br>Le jeu a été réinitialiser en attendant un autre adversaire."
});
}else if(socket.username == rooms[room].name_p1){
rooms[room].name_p1 = rooms[room].name_p2;
rooms[room].name_p2 = null;
var player1 = users[rooms[room].name_p1];
io.to(player1.id).emit('server_messages', {
user: "Système",
text: "Votre adversaire <strong>"+socket.username+"</strong> a quitté la partie<br>Vous êtes le nouvel hôte de la room {"+socket.logged_room+"}.<br>Le jeu a été réinitialiser en attendant un autre adversaire."
});
}
socket.leave(room);
io.in(room).emit('refresh_board', {board: rooms[room].board});
io.in(room).emit('refresh_info_view', {room_info: rooms[room]});
} else {
console.log('room-deleted :'+room);
delete rooms[room];
}
}
console.log('disconnect : '+socket.username+' déconnecter.')
delete users[socket.username];
io.sockets.emit('update_users_online', Object.keys(users));
io.sockets.emit('update_list_rooms', rooms);
});
});