点击次数、socket.io 和 Javascript 的评分系统

Score system for number of clicks, socket.io and Javascript

本文关键字:Javascript 分系统 io socket      更新时间:2023-09-26

>我有一个应用程序,我正在计算对象客户端的点击次数,发送到服务器

   socket.emit('playerScore',score);

推送到阵列服务器端

    socket.on('playerScore',function(data){ 
    socket.score = data;
    score.push(socket.score);

然后发送回客户端

    io.sockets.emit ('scores',score);

但它从每个客户端接收一次分数,并为每个客户端发送一次分数。我正在尝试比较服务器端客户端发送的分数,并发回最高数字以与客户端已有的本地分数进行比较。但是我发送了不止一次,我的过滤器似乎不起作用。

var scoreData = data;
      var largest = scoreData[0];
for (var i = 0; i < score.length; i++) {
    if (largest < scoreData[i] ) {
        largest = scoreData[i];
    }
}

谢谢

我认为您应该只传递最高分(从服务器到客户端)而不是整个数组。以最高分,您的客户可以检查他是否将其存储在本地。

但也许你可以有一个更好的方法:

  1. 您的阵列可以具有:

    { socketId: '123123', 成绩: 12}

  2. 当服务器收到分数时,推送分数和套接字ID

  3. 从具有最高分的数组中获取对象

  4. 将其传递给所有客户端

有了这个,你的客户端可以按 id 而不是分数进行直接比较。

服务器:

var scores = [];
function getHighest(arr){
    var highest = 0;
    for (var i = 0; i < arr.length; i++) {
        if (highest < arr[i] ) {
            highest = arr[i];
        }
    }
    return highest;
}

socket.on('connection', function(client) {
    client.on('join', function(data) {
        client.join("scores"); // Join socket IO Room
    });
    client.on('playerScore', function(data){ 
        scores.push(data);
        //Send to all users in scores room
        socket.in("scores").emit('scores', getHighest(scores)); 
    });
});

在客户端中:

socket.emit("join"); //Join Room
socket.emit("playerScore", score);
socket.on("scores", function(highest){ 
   if(highest > myScore) console.log("Do something");
});