node.js 联机对战游戏---中国象棋 服务器部分实战

在网上搜索nodejs象棋没有发现结果,所以趁闲暇之余做了一个基于nodejs+socket服务的联机中国象棋。

首先最简单的创建一个socket服务----- app.js

const config = {
    port:8001
};
const ws = require("nodejs-websocket");
/*socket.io模块前端需要引用插件,有点儿麻烦,就用了这个模块*/
const socket=require("./xq-ws");
console.log("开始建立连接...");

const socketServer = ws.createServer(function(conn){
    socket.socket(conn)
}).listen(config.port);

console.log(`通讯服务运行于${config.port}`);

//socket服务 

socketServer.on('uncaughtException', function (err) {
  //打印出错误
  console.log(err);
  //打印出错误的调用栈方便调试
  console.log(err.stack);
});
/*进程守护----pm2就不需要用这个东西啦*/

接受到的客户端消息处理部分 xq-ws.js

前人栽树,后人乘凉,一个很简单的在线象棋服务端就完成啦~~~功能还是需要继续完善一下下~

待续~

const user   = {}; //当前在线用户
const xqRoom = {}; //当前存在房间
/*简单贴一下*/

function socket(conn) {

         let userid=null;

        conn.on("text", function (str) {
            if(isJSON(str)==true){
                var $dats = JSON.parse(str);
                if($dats.id!=null){
                    getTheClient($dats,conn);
                    userid=$dats.id;
                    console.log(`${userid}进入`)
                }else{
                    conn.sendText(messages(0,null,'用户ID未填'))
                }
            }else{
                conn.sendText(messages(0,null,'请检查是否为JSON格式'))
            }

        });
        conn.on("close", function (code, reason) {
            exitWebsocket(userid);
        });
        conn.on("error", function (code, reason) {
            exitWebsocket(userid);
        });

}
/*socket内容处理*/
function getTheClient(data,conn) {
    /*保持登陆化*/
    let id= data.id;
    user[id]={
        conn:conn
    };
    /*保持登陆化*/
    switch (data.type){
        case 1 :
            conn.sendText(messages(1,{online:Object.values(user).length},'----通讯中----'));
              /* 登陆----保持通讯 */
            break;
        case 2 :
            let zindex = 1;
            if(user[id].roomId!=null){
                console.log("退房")
                if(xqRoom[user[id].roomId]['player'][0]==id){
                    xqRoom[user[id].roomId]['player'].splice(0,1)
                }else{
                    xqRoom[user[id].roomId]['player'].splice(1,1)
                }
            }
            let roomNum = Object.values(xqRoom).length;
            if(roomNum==0){
                // 房间为空时
                user[id].roomId =0;
                    xqRoom[0]={
                    player:[id]
                };
            }else{
                // 房间存在时
                if(xqRoom[(roomNum-1)]['player'].length<2){
                    //房间未满
                    user[id].roomId = roomNum-1;
                    xqRoom[(roomNum-1)]['player'].push(id);
                    zindex = 0;
                }else{
                    //创建房间
                    user[id].roomId = roomNum;
                    xqRoom[roomNum]={
                        player:[data.id]
                    };
                    console.log(`房间数${roomNum}`)
                }
            }
            conn.sendText(messages(1,{type:2,roomId:user[id].roomId,room:xqRoom[user[id].roomId],index:zindex},'进入房间'));
            /*  进入房间 */
            break;
        case 3 :

            if(data.roomId!=null&&data.start==1){
                    if(xqRoom[data.roomId].player.length>1){
                        if(xqRoom[data.roomId].player[0]==id){
                            user[xqRoom[data.roomId].player[1]].conn.sendText(messages(1,null,'对方已准备'));
                        }else{
                            user[xqRoom[data.roomId].player[0]].conn.sendText(messages(1,null,'对方已准备'));
                        }
                        conn.sendText(messages(1,null,'准备消息发送成功'));
                    }else{
                        conn.sendText(messages(0,null,'另一玩家未加入'));
                    }
            }else if(data.roomId!=null&&data.play!=null){
                if(data.play.x==null||data.play.y==null){
                    conn.sendText(messages(0,null,'下棋失败'));
                }else{
                    console.log(data.play);
                    if(xqRoom[data.roomId].player.length>1){
                        if(xqRoom[data.roomId].player[0]==id){
                            user[xqRoom[data.roomId].player[1]].conn.sendText(messages(1,{type:3,chess:data.play},'对方已落子'));
                        }else{
                            user[xqRoom[data.roomId].player[0]].conn.sendText(messages(1,{type:3,chess:data.play},'对方已落子'));
                        }
                       conn.sendText(messages(1,null,'落子成功'));
                    }else{
                        conn.sendText(messages(0,null,'对方离线'));
                    }
                  //  conn.sendText(messages(1,null,'下棋成功'));
                }
            }else{
                conn.sendText(messages(0,null,'状态码失效'));
            }

           /*  棋盘下棋 */
            break;
        case 4 :
            conn.sendText(messages(0,null,'进入密码房'));
            /*进入密码房*/
            break;
        case 5 :
            conn.sendText(messages(0,null,'对局聊天'))
            /*对局聊天*/
        case 6 :
            conn.sendText(messages(0,null,'大厅聊天'))
            /*大厅聊天*/
            break;
        default:
            conn.sendText(messages(0,null,'暂未开放'))
            /*暂未开放*/
    }
}




function exitWebsocket(userid) {
    if(userid!=null){
        if(xqRoom[user[userid].roomId]['player'].length==1){
            delete xqRoom[user[userid].roomId]
        }else if(xqRoom[user[userid].roomId]['player'][0]==userid){
            if(xqRoom[user[userid].roomId]['player'][1]==null){
                delete xqRoom[user[userid].roomId]
            }else{
                xqRoom[user[userid].roomId]['player'].splice(0,1)
            }

        }else{
            if(xqRoom[user[userid].roomId]['player'][0]==null){
                delete xqRoom[user[userid].roomId]
            }else{
                xqRoom[user[userid].roomId]['player'].splice(1,1)
            }
        }
        delete  user[userid];
        console.log(`在线人数${Object.values(user).length}----房间数${Object.values(xqRoom).length}`);
    }
}
/*用户退出*/





function sendMsg(id,str,type) {
    //Object.values(user)
    if(type==0){serviceMap[id].conn.sendText(str);}else{userMap[id].conn.sendText(str);}
}
/*发送私聊消息*/

function isJSON(str) {
    if (typeof str == 'string') {
        try {
            var obj=JSON.parse(str);
            if(typeof obj == 'object' && obj ){
                return true;
            }else{
                return false;
            }

        } catch(e) {
            return false;
        }
    }
}
/*判断是不是json*/


function messages(a,b,c){
    var msg=JSON.stringify({
        status:a,
        data:b,
        message:c
    });
    return msg;
}
/*服务器提示*/

function getTime() {
    return new Date().getTime();
}
/*获取服务器当前时间*/

module.exports = {
    socket:socket
};

/*-----------有写功能可能没啥用,自行删减--------------*/

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值