本文实例为大家分享了Node.js Socket.io实现双人在线五子棋对战的具体代码,供大家参考,具体内容如下

笔者建议读者在尝试写程序之前要先确保电脑已经安装了Node.js和NPM,一般两者都是在一块安装,五子棋程序的服务器端使用Node.js写的,不多说了,直接上代码。

服务器端代码:socket.js

var app = require('http').createServer(handler)
var io = require('socket.io')(app);
var fs = require('fs');
 
app.listen(80);
 
function handler (req, res) {
    fs.readFile(__dirname   '/wzq.html',
    function (err, data) {
      if (err) {
        res.writeHead(500);
        return res.end('Error loading wzq.html');
      }
  
      res.writeHead(200);
      res.end(data);
    });
  }
//io.set('log level',1);
var users = {};
io.on('connection',function(socket){
    io.sockets.emit('connect',{con:'connected'});
    socket.on('location',function(from, to, msg){
        if(to in users){
            //console.log('to' to '   ' msg);
            users[to].emit('to' to,msg);
        }
    });
    socket.on('newUser',function(user){
        if(user in users){
            socket.emit('exist',{})
        }
        else{
            users[user] = socket;
            if(users['u2']){
                io.sockets.emit('stateok',{});
            }            
        }
    });
    socket.on('disconn',function(){
        socket.emit('disconnection');
    })
});

客户端代码:wzq.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>五子棋</title>
    <script src='https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.2.0/socket.io.js'></script>
</head>
 
<style>
#chess {
    display: block;
    margin: 50px auto;
    box-shadow: -2px -2px 2px #efefef , 5px 5px 5px #b9b9b9;
}
#chess:hover{
    cursor: pointer;
}
</style>
<body>
    <!-- 棋盘 -->    
    <input type="radio" name="WZQ" id="black" checked disabled='disabled'>
    <label for="black">黑棋</label>
    <input type="radio" name="WZQ" id="white" disabled='disabled'>
    <label for="white">白棋</label>
    <br/>
    <input type="button" value="连接服务器" id='conn'>
    <input type="button" value="断开服务器" id='disconn'>
    <label id='tipMsg'></label>
    <!-- <input type="text" name="ip" id="ip" placeholder="请输入IP地址,就像这样(ws://192.168.0.1:3000)"> -->
    <canvas id="chess" width="450px" height="450px"></canvas>
    <script>
        //获取棋盘canvas
        var chess = document.getElementById("chess");
        //获取2d画布
        var context = chess.getContext('2d');
        //指定当前是否黑色下,只在UI中使用        
        var me = true;
        if(document.getElementById('white').checked) me=false;
        //指定当前位置是否下了棋子,1代表黑,2代表白,0代表空
        var curIndex = [];
        var dsState = false, isclick = false;
        for(var i =0; i <15; i  ) {
          curIndex[i] = [];
          for(var j =0; j <15; j  )
            curIndex[i][j] = 0;
        }
 
        function drawtable() {
            //我们设置棋盘总共15根横线15根总线,左右上下都有15px的边距,其中每个棋子相距30px,因此绘制棋盘从15px开始
        
            for(var i =0; i <15; i  ){
                for(var j =0; j <15; j  ){
                    //绘制横线
                    context.moveTo(15, 15  j *30);
                    context.lineTo(435, 15  j *30);
                    //绘制竖线
                    context.moveTo(15  j *30, 15);
                    context.lineTo(15  j *30, 435); 
            
                    //使用灰色描边
                    context.strokeStyle = "#bfbfbf";
                    context.stroke();
                }
            }
        };
        drawtable();
        var socket = io('http://223.2.42.103');
        socket.on('connect',function(data){
            document.getElementById('tipMsg').innerHTML='<b>等待对方上线。。。</b>';
        });
        if(me) socket.emit('newUser','u1');
        socket.on('tou2',function(data){
            //console.log('tou2');
            var strArr = data.split('-');
            var xx = parseInt(strArr[0]);
            var yy = parseInt(strArr[1]);
            //开始绘制
            context.beginPath();
            //绘制指定圆
            context.arc(15  xx *30, 15  yy *30, 15, 0, 2 *Math.PI);
            //进行填充
            context.fillStyle = "#636766";
            curIndex[xx][yy] = 1;
            document.getElementById('tipMsg').innerText='该你下了';
            isclick=false;
            dsState=true;
            context.fill();
            //结束绘制
            context.closePath();
        });
        socket.on('tou1',function(data){
            //console.log('tou1');
            var strArr = data.split('-');
            var xx = parseInt(strArr[0]);
            var yy = parseInt(strArr[1]);
            //开始绘制
            context.beginPath();
            //绘制指定圆
            context.arc(15  xx *30, 15  yy *30, 15, 0, 2 *Math.PI);
            //进行填充
            context.fillStyle = "#b9b9b9";
            curIndex[xx][yy] = 2;
            document.getElementById('tipMsg').innerText='该你下了';
            isclick=false;
            dsState=true;
            context.fill();
            //结束绘制
            context.closePath();
        });
        socket.on('exist',function(data){
            me=!me;
            document.getElementById('white').checked=true;
            document.getElementById('black').checked=false;
            socket.emit('newUser','u2');
        });
        socket.on('stateok',function(data){
            document.getElementById('tipMsg').innerHTML='<b>对方已上线,黑棋先下</b>';
            if(me){
                dsState=true;
                isclick=false;
            }
        });
        chess.onclick = function(event) {
            if(!dsState||isclick) return;
            //获取要下的棋子的位置
            var x = Math.floor(event.offsetX /30);
            var y = Math.floor(event.offsetY /30);
            //判断该点是否已被下了
            if(curIndex[x][y] != 0) return;
            //开始绘制
            context.beginPath();
            //绘制指定圆
            context.arc(15  x *30, 15  y *30, 15, 0, 2 *Math.PI);
            //进行填充
            if(me) {
                context.fillStyle = "#636766";
                curIndex[x][y] = 1;
                //me = false;
                socket.emit('location','u1','u2',x '-' y);
            }
            else {
                context.fillStyle = "#b9b9b9";
                curIndex[x][y] = 2;
                //me = true;
                socket.emit('location','u2','u1',x '-' y);
            }
            context.fill();
            //结束绘制
            context.closePath();
            dsState=false;
            isclick=true;
            if(me){
                document.getElementById('tipMsg').innerText='白棋思考中。。。'
            }else if(!me){
                document.getElementById('tipMsg').innerText='黑棋思考中。。。'
            }
        };
        document.getElementById('conn')
        window.unbeforeunload = function(){
            socket.emit('disconn');
        }
    </script>
</body>
</html>

客户端有些代码没有实现,比如说断开连接和手动开启服务器,这些留给读者自己去实现吧,另外判断是否输赢的代码没有写,笔者觉得吧,会玩五子棋的都能看得出来,就不用再写了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持Devmax。

Node.js+Socket.io实现双人在线五子棋对战的更多相关文章

  1. CentOS 8.2服务器上安装最新版Node.js的方法

    这篇文章主要介绍了CentOS 8.2服务器上安装最新版Node.js的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  2. node.js三个步骤实现一个服务器及Express包使用

    这篇文章主要介绍了node.js三个步骤实现一个服务器及Express包使用,文章通过新建一个文件展开全文内容,具有一定的参考价值,需要的小伙伴可以参考一下

  3. Node.js调试技术总结分享

    Node.js是一个可以快速构建网络服务及应用的平台。该平台的构建是基于Chrome's JavaScript runtime,也就是说,实际上它是对Google V8引擎(应用于Google Chrome浏览器)进行了封装。 今天介绍Node.js调式目前有几种技术,需要的朋友可以参考下。

  4. node.js实现http服务器与浏览器之间的内容缓存操作示例

    这篇文章主要介绍了node.js实现http服务器与浏览器之间的内容缓存操作,结合实例形式分析了node.js http服务器与浏览器之间的内容缓存原理与具体实现技巧,需要的朋友可以参考下

  5. 教你如何使用node.js制作代理服务器

    本文介绍了如何使用node.js制作代理服务器,图文并茂,十分的详细,代码很简洁易懂,这里推荐给大家。

  6. node.js中的fs.openSync方法使用说明

    这篇文章主要介绍了node.js中的fs.openSync方法使用说明,本文介绍了fs.openSync方法说明、语法、接收参数、使用实例和实现源码,需要的朋友可以参考下

  7. Node.js+ELK日志规范的实现

    这篇文章主要介绍了Node.js+ELK日志规范的实现,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  8. node.js爬虫框架node-crawler初体验

    这篇文章主要介绍了node.js爬虫框架node-crawler的相关资料,帮助大家利用node.js进行爬虫,感兴趣的朋友可以了解下

  9. node.js中的fs.existsSync方法使用说明

    这篇文章主要介绍了node.js中的fs.existsSync方法使用说明,本文介绍了fs.existsSync方法说明、语法、接收参数、使用实例和实现源码,需要的朋友可以参考下

  10. 说说如何利用 Node.js 代理解决跨域问题

    这篇文章主要介绍了Node.js代理解决跨域问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

随机推荐

  1. Error: Cannot find module ‘node:util‘问题解决

    控制台 安装 Vue-Cli 最后一步出现 Error: Cannot find module 'node:util' 问题解决方案1.问题C:\Windows\System32>cnpm install -g @vue/cli@4.0.3internal/modules/cjs/loader.js:638 throw err; &nbs

  2. yarn的安装和使用(全网最详细)

    一、yarn的简介:Yarn是facebook发布的一款取代npm的包管理工具。二、yarn的特点:速度超快。Yarn 缓存了每个下载过的包,所以再次使用时无需重复下载。 同时利用并行下载以最大化资源利用率,因此安装速度更快。超级安全。在执行代码之前,Yarn 会通过算法校验每个安装包的完整性。超级可靠。使用详细、简洁的锁文件格式和明确的安装算法,Yarn 能够保证在不同系统上无差异的工作。三、y

  3. 前端环境 本机可切换node多版本 问题源头是node使用的高版本

    前言投降投降 重头再来 重装环境 也就分分钟的事 偏要折腾 这下好了1天了 还没折腾出来问题的源头是node 使用的高版本 方案那就用 本机可切换多版本最终问题是因为nodejs的版本太高,导致的node-sass不兼容问题,我的node是v16.14.0的版本,项目中用了"node-sass": "^4.7.2"版本,无法匹配当前的node版本根据文章的提

  4. nodejs模块学习之connect解析

    这篇文章主要介绍了nodejs模块学习之connect解析,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  5. nodejs npm package.json中文文档

    这篇文章主要介绍了nodejs npm package.json中文文档,本文档中描述的很多行为都受npm-config(7)的影响,需要的朋友可以参考下

  6. 详解koa2学习中使用 async 、await、promise解决异步的问题

    这篇文章主要介绍了详解koa2学习中使用 async 、await、promise解决异步的问题,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  7. Node.js编写爬虫的基本思路及抓取百度图片的实例分享

    这篇文章主要介绍了Node.js编写爬虫的基本思路及抓取百度图片的实例分享,其中作者提到了需要特别注意GBK转码的转码问题,需要的朋友可以参考下

  8. CentOS 8.2服务器上安装最新版Node.js的方法

    这篇文章主要介绍了CentOS 8.2服务器上安装最新版Node.js的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  9. node.js三个步骤实现一个服务器及Express包使用

    这篇文章主要介绍了node.js三个步骤实现一个服务器及Express包使用,文章通过新建一个文件展开全文内容,具有一定的参考价值,需要的小伙伴可以参考一下

  10. node下使用UglifyJS压缩合并JS文件的方法

    下面小编就为大家分享一篇node下使用UglifyJS压缩合并JS文件的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

返回
顶部