Nodejs 请问如何让不同用户按照顺序做事情?

Nodejs 请问如何让不同用户按照顺序做事情?

学习编程不久,想做一个多人协作的东西,不知道如何用node.js实现。

想做的是,一个用户做了一些事情,使另一个用户可以做一些事情,如此类推,如果有三个用户,那么他们的顺序就是1,2,3,1,2,3这样的轮流。可以想象为一个不限人数的下棋游戏。

我不知道如何检测,第n个用户操作之后,n+1个用户就可以做某事了,如果说加一个布尔值变量的话,是要检测不同用户打开页面的时间先后吗?

希望大虾们提供一些相关的文档或者代码,我还属于小白阶段。。。望见谅。

9 回复

要实现这样一个功能,即不同的用户按顺序轮流执行某些操作,我们可以使用Node.js配合WebSocket来实现实时通信,并使用一些状态管理机制来跟踪每个用户的当前状态。

示例代码

首先,我们需要设置一个基本的Node.js服务器,并使用socket.io库来处理WebSocket通信。

安装依赖

npm install express socket.io

服务器端代码

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);

let users = [];
let currentPlayerIndex = 0;

io.on('connection', (socket) => {
    console.log('A user connected:', socket.id);

    // 当新用户连接时,将其添加到users数组中
    users.push(socket.id);
    
    // 广播当前轮到哪个玩家
    io.emit('updateTurn', { currentPlayer: users[currentPlayerIndex] });

    socket.on('disconnect', () => {
        console.log('User disconnected:', socket.id);
        const index = users.indexOf(socket.id);
        if (index > -1) {
            users.splice(index, 1);
        }
        // 更新当前玩家索引
        currentPlayerIndex = currentPlayerIndex % users.length;
        io.emit('updateTurn', { currentPlayer: users[currentPlayerIndex] });
    });

    socket.on('action', (data) => {
        console.log(`User ${socket.id} performed an action`, data);
        
        // 当前用户完成操作后,更新当前玩家索引
        currentPlayerIndex = (currentPlayerIndex + 1) % users.length;
        io.emit('updateTurn', { currentPlayer: users[currentPlayerIndex] });
    });
});

server.listen(3000, () => {
    console.log('Server is running on port 3000');
});

客户端代码

客户端需要连接到服务器,并监听服务器发送的消息以更新UI或执行其他逻辑。

<!DOCTYPE html>
<html>
<head>
    <title>Multiplayer Game</title>
</head>
<body>
    <script src="/socket.io/socket.io.js"></script>
    <script>
        const socket = io();

        socket.on('updateTurn', (data) => {
            document.body.innerHTML = `Current Player: ${data.currentPlayer}`;
        });

        function performAction() {
            // 模拟用户执行动作
            socket.emit('action', { action: 'some action' });
        }

        // 连接成功后模拟用户执行动作
        socket.on('connect', performAction);
    </script>
</body>
</html>

解释

  • 服务器端:维护一个users数组来存储所有连接的用户ID。每当一个用户执行动作后,服务器会更新currentPlayerIndex并广播给所有客户端当前轮到谁。
  • 客户端:通过Socket.IO连接到服务器,监听updateTurn事件来更新当前轮到的玩家,并在用户执行动作时向服务器发送action事件。

这种方式允许我们轻松地扩展到更多的用户,而不需要担心并发问题或复杂的同步逻辑。


这个和是不是 Node 关系不大. 个人会用一个全局状态来保存下一个可行的用户. 然后每次有操作就去更新变量, 保障这个顺序是按照顺序来的

求参考推荐~

全局计数器每次事件后加1,然后每个用户判断的时候用全局计数器对3取余和自身的标识进行判断如何

自己写一个触发器吧,如果要多进程可能要用第三方媒介了

上一个人完事儿触发下一个人的事件?

感觉更像是个工作流…

为了实现多个用户按顺序进行操作的功能,可以使用Node.js配合WebSocket来实现实时通信。WebSocket能够确保客户端和服务器之间保持一个持续的连接,从而允许实时更新状态和数据。

实现思路

  1. 创建服务器:使用express框架和socket.io库来创建服务器。
  2. 管理用户状态:维护一个数组或队列来存储用户的ID或标识符,并跟踪当前应该执行操作的用户。
  3. 处理用户连接:每当有用户连接到服务器时,将该用户添加到队列中。
  4. 用户操作处理:当一个用户完成了他的操作后,服务器将移除该用户的标识符,并通知下一个用户可以开始操作。

示例代码

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);

let userQueue = [];
let currentUserId = 0;

io.on('connection', (socket) => {
    console.log('A user connected:', socket.id);

    // 将新用户加入队列
    userQueue.push(socket.id);
    
    // 检查是否是当前应该操作的用户
    if (socket.id === userQueue[currentUserId]) {
        socket.emit('start-turn', true);
    }

    socket.on('disconnect', () => {
        console.log('User disconnected:', socket.id);
        const index = userQueue.indexOf(socket.id);
        if (index > -1) {
            userQueue.splice(index, 1);
        }
    });

    socket.on('completed-action', () => {
        // 更新当前应该操作的用户
        currentUserId = (currentUserId + 1) % userQueue.length;
        
        // 通知下一个用户轮到他了
        if (userQueue[currentUserId]) {
            io.to(userQueue[currentUserId]).emit('start-turn', true);
        }
    });
});

server.listen(3000, () => {
    console.log('Server is running on port 3000');
});

这段代码展示了如何设置一个简单的轮询机制,确保每个用户可以在特定时刻执行操作。通过监听completed-action事件,我们可以控制游戏流程,确保每个用户依次执行动作。

回到顶部