返回顶部
首页 > 资讯 > 前端开发 > node.js >nodeJs+express+soket.io如何实现五子棋
  • 410
分享到

nodeJs+express+soket.io如何实现五子棋

2024-04-02 19:04:59 410人浏览 泡泡鱼
摘要

这篇文章将为大家详细讲解有关nodejs+express+soket.io如何实现五子棋,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。window.onload=func

这篇文章将为大家详细讲解有关nodejs+express+soket.io如何实现五子棋,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

window.onload=function(){

    var sence = document.getElementById('sence'),

        //棋盘大小

        ROW = 20,NUM = ROW*ROW,

        //场景宽度

        senceWidth = sence.offsetWidth,

        //每颗棋子的宽度

        blockWidth = Math.floor( (senceWidth-ROW)/ROW ) + 'px',

         //用户开始默认可以落子

        canDrop = true,

        //用户默认落子为白棋

        color = 'white',

        //两个字典,用来存放白棋和黑棋的已落子的位置;以坐标为建,值为true

        whiteBlocks = {},blackBlocks = {};

        console.log(sence);

//创建场景

(function (){

    var el,

    //在棋盘上画线

        rowline,

        colline;

    for ( var i = 0;i < ROW;i++){

        //按照计算好的间隔放置横线

        rowline = document.createElement('div');

        rowline.setAttribute('class','row');

        rowline.style.top= (senceWidth/ROW)/2 + (senceWidth/ROW)*i + 'px';

        sence.appendChild(rowline);

        //按照计算好的间隔放置竖线

        colline = document.createElement('div');

        colline.setAttribute('class','col');

        colline.style.left= (senceWidth/ROW)/2 + (senceWidth/ROW)*i + 'px';

        sence.appendChild(colline);

        for ( var j = 0;j < ROW;j++){

            el = document.createElement('div');

            el.style.width = blockWidth;

            el.style.height = blockWidth;

            el.setAttribute('class','block');

            el.setAttribute('id',i + '_' + j);

            sence.appendChild(el);

        }

    }

})();

console.log('1')

var id2Position = function(id){

    console.log(id)

    return {x:Number(id.split('_')[0]),y:Number(id.split('_')[1])};

};

var position2Id = function(x,y){

    return x + '_' + y;

};

console.log('abc');

//判断落子皇后该色其是否连5

var isHasWinner = function(id,dic){

    var x = id2Position(id).x;

    var y = id2Position(id).y;

    //用来记录横,竖,左斜,右斜方向的连续棋子数量

    var rowCount = 1,colCout = 1,leftSkewLineCount = 1,righeSkewlineCount = 1;

    //tx ty作为游标,左移,右移,上移,下移,左上,右下,左下,右上移动

    //每次数万某个方向的连续棋子后,游标会回到原点

    var tx,ty;

    //注意:一下判断5连以上不算成功,如果规则有变动,条件改为大于五就可以

    tx = x;ty = y;

    while(dic[ position2Id(tx,ty+1) ]){

        rowCount++;

        ty++;

    }

    tx = x;ty = y;

    while(dic[ position2Id(tx,ty-1) ]){

        rowCount++;

        ty--;

    };

    if( rowCount ==5 ) return true;

    tx = x;ty = y;

    while(dic[ position2Id(tx+1,ty) ]){

        colCout++;

        tx++;

    }

    tx = x;ty = y;

    while(dic[ position2Id(tx-1,ty) ]){

        colCout++;

        tx--;

    };

    if( colCout ==5 ) return true;

    tx = x;ty = y;

    while(dic[ position2Id(tx+1,ty+1) ]){

        leftSkewLineCount++;

        tx++;

        ty++;

    }

    tx = x;ty = y;

    while(dic[ position2Id(tx-1,ty-1) ]){

        leftSkewLineCount++;

        tx--;

        ty--;

    }

    if( leftSkewLineCount == 5){

        return true;

    }

    tx = x;ty = y;

    while(dic[ position2Id(tx-1,ty+1) ]){

        righeSkewlineCount++;

        tx--;

        ty++;

    }

    tx = x;ty = y;

    while(dic[ position2Id(tx+1,ty-1) ]){

        leftSkewLineCount++;

        tx++;

        ty--;

    }

    if( righeSkewlineCount == 5) return true;

    return false;

};

 //处理对手发送过来的信息;

//  var Socket = io.connect('Http://127.0.0.1:3100');

if (/Firefox\/\s/.test(navigator.userAgent)){

    var socket = io.connect('http://127.0.0.1:3100',{transports:['xhr-polling']});

}

else if (/MSIE (\d+.\d+);/.test(navigator.userAgent)){

    var socket = io.connect('http://127.0.0.1:3100',{transports:['JSONp-polling']});

}

else {

    var socket = io.connect('http://127.0.0.1:3100');

}

    socket.on('message',function(data){

        // console.log('data');

        canDrop = true;

        var el = document.getElementById(data.id);

        // console.log(el)

        el.setAttribute('has-one','true');

        if(data.color == 'white'){

            color = 'black';

            el.setAttribute('class','block white');

            whiteBlocks[data.id] = true;

             if(isHasWinner(data.id,whiteBlocks)){

                 alert('白棋赢了');

                 location.reload();//Location.reload() 方法用来刷新当前页面。该方法只有一个参数,当值为 true 时,将强制浏览器从服务器加载页面资源,当值为 false 或者未传参时,浏览器则可能从缓存中读取页面。

             }

            }else{

                 el.setAttribute('class','block black');

                 blackBlocks[data.id] = true;

                 if( isHasWinner(data.id,blackBlocks)){

                     alert('黑棋赢了');

                     location.reload();

                 }

             }

        });

        sence.onclick = function(e){

            // console.log('gyu')

             var el = e.target;//触发事件的对象 (某个DOM元素) 的引用。当事件处理程序在事件的冒泡或捕获阶段被调用时;

             if( !canDrop || el.hasAttribute('has-one') || el == this){//hasAttributes属性返回一个布尔值true或false,来表明当前元素节点是否有至少一个的属性

                return;

             }

             el.setAttribute('has-one','true');

             canDrop = false;

             var id = el.getAttribute('id');

             if(color == 'white'){

                 el.setAttribute('class','block white');

                 whiteBlocks[id] = true;

                 socket.emit('message',{id:id,color:'white'});//socket.emit('action',data);表示发送了一个action命令,还有data数据,在另一端接收时,可以这么写: socket.on('action',function(data){...});

                 if(isHasWinner(id,whiteBlocks)){

                     alert('白棋赢');

                     location.reload();

                 }

             }

             if( color == 'black'){

                 el.setAttribute('class','block black');

                 blackBlocks[id]=true;

                 socket.emit('message' , {id:id,color:'black'});

                 if(isHasWinner(id,blackBlocks)){

                     alert('黑棋赢了');

                     location.reload();

                 }

             }

     };

};

样式index.CSS

body{

    background: #4b4832;

    font-family: 微软雅黑;

    color: #666;

}

.sence{

    width: 600px;

    height: 600px;

    margin: 50px auto;

    border-right: none;

    border-bottom: none;

    position: relative;

    box-shadow: -10px 10px 15px black;

    background: #8d6d45;

    border: 2px solid black;

}

.sence .block{

    float: left;

    margin-right: 1px;

    margin-bottom: 1px;

    border-radius: 50%;

    position: relative;

    z-index: 8884;

}

.sence .row,.sence .col{

    background: #4d392b;

    position: absolute;

}

.sence .row{

    width:100%;

    height: 1px;

    top: 0;

}

.sence .col{

    width:1px;

    height: 100%;

    top: 0;

}

.white{

    background: #ffffff;

}

.black{

    background: #2c1d1b;

}

index.html:

<!DOCTYPE html>

<html>

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

    <link rel="stylesheet" href="./public/index.css">

</head>

<body>

    <div id="sence"></div>

    <script src="/public/socket.io.js"></script>

    <script src="/public/index.js" type="text/javascript" ></script>

</body>

</html>

服务端index.js

var express = require('express');

function(){ //ThinkMarkets智汇入金 http://www.kaifx.cn/question/kaifx/1819.html

var path = require('path');

var app = express()

var http = require('http').Server(app);

var io = require('socket.io')(http);

io.on('connection',function(socket){

    socket.on('message',function(data){

        socket.broadcast.emit('message',data);

    });

});

app.use('/public/',express.static(path.join(__dirname,'./public/')))

app.use('/node_modules/',express.static(path.join(__dirname,'./node_modules/')))

app.get('/',function(req,res){

    res.sendFile(__dirname +  '/index.html');

});

 http.listen(3100,function(){

     console.log('runing...')

 })

socket.io 兼容性代码:

if (/Firefox\/\s/.test(navigator.userAgent)){

    var socket = io.connect('http://127.0.0.1:3100',{transports:['xhr-polling']});

}

else if (/MSIE (\d+.\d+);/.test(navigator.userAgent)){

    var socket = io.connect('http://127.0.0.1:3100',{transports:['jsonp-polling']});

}

else {

    var socket = io.connect('http://127.0.0.1:3100');

}

关于“nodeJs+express+soket.io如何实现五子棋”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

--结束END--

本文标题: nodeJs+express+soket.io如何实现五子棋

本文链接: https://lsjlt.com/news/83652.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • nodeJs+express+soket.io如何实现五子棋
    这篇文章将为大家详细讲解有关nodeJs+express+soket.io如何实现五子棋,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。window.onload=func...
    99+
    2024-04-02
  • java如何实现联机五子棋
    这篇文章主要介绍“java如何实现联机五子棋”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“java如何实现联机五子棋”文章能帮助大家解决问题。下面是客户端运行的效果:这里是代码包的结构:接着我来依次...
    99+
    2023-06-30
  • Java如何实现五子棋游戏
    本篇内容介绍了“Java如何实现五子棋游戏”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!简介相比之前,做出了以下修改:新增菜单栏,将重新开始...
    99+
    2023-06-30
  • flask如何实现五子棋小游戏
    这篇文章主要介绍了flask如何实现五子棋小游戏,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。准备工作**1.**python环境、安装flask**2.**导入需要用到的包...
    99+
    2023-06-15
  • python实现网络五子棋
    本文实例为大家分享了python实现网络五子棋的具体代码,供大家参考,具体内容如下 服务器端: import os import socket import threading ...
    99+
    2024-04-02
  • Java实现五子棋游戏
    本文实例为大家分享了Java实现五子棋游戏的具体代码,供大家参考,具体内容如下 一、功能分析 五子棋的实现还是较为简单的,通过下期的流程我们可以知道大概要实现一下功能: 1、格界面 ...
    99+
    2024-04-02
  • java实现五子棋大战
    本文实例为大家分享了java实现五子棋大战的具体代码,供大家参考,具体内容如下 这是我接近一年前的项目了,以前没有养成写博客的习惯,打算陆续把以前做过的项目补上来。 一、介绍 主要实...
    99+
    2024-04-02
  • python实现五子棋算法
    python五子棋原创算法,供大家参考,具体内容如下 我们都见过五子棋,但是在我看来五子棋单机游戏中,逻辑赢法很重要,经常用到的算法是五子连珠算法,但是很多五子连珠算法很不全面,不是...
    99+
    2024-04-02
  • java实现联机五子棋
    在完成java单机五子棋后,我开始尝试写联机五子棋(局域网内,因为没有公网IP)。上次的五子棋写的很乱,全部写在一个类中,这次我采用面向对象的思想,把特定的功能和属性都写成一个类。代...
    99+
    2024-04-02
  • java实现五子棋程序
    本文实例为大家分享了java实现五子棋程序的具体代码,供大家参考,具体内容如下 知识点 1、Swing 编程2、ImageIO 类的使用3、图片的绘制 1、 Swing的概念 S...
    99+
    2022-11-13
    java 五子棋
  • 用python实现五子棋实例
    本文实例为大家分享了用python实现五子棋的具体代码,供大家参考,具体内容如下 # 制作一个棋盘 """ ++++++++++ ++++++++++ ++++++++++ ++++...
    99+
    2024-04-02
  • JavaScript如何实现网页版五子棋游戏
    这篇文章将为大家详细讲解有关JavaScript如何实现网页版五子棋游戏,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。本程序主要通过三部分实现:棋盘绘制2.鼠标交互3.输赢判断<!DOCTYPE&n...
    99+
    2023-06-20
  • java如何实现简易的五子棋游戏
    这篇文章给大家分享的是有关java如何实现简易的五子棋游戏的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。本文实例为大家分享了java实现简易五子棋游戏的具体代码,供大家参考,具体内容如下先上效果图一、问题分析1、...
    99+
    2023-06-15
  • JavaScript如何实现网页五子棋小游戏
    这篇文章主要介绍“JavaScript如何实现网页五子棋小游戏”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“JavaScript如何实现网页五子棋小游戏”文章能帮助大家解决问题。设计思路如下:先采用...
    99+
    2023-07-02
  • 如何用Python实现简易五子棋游戏
    这篇文章主要介绍了如何用Python实现简易五子棋游戏的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇如何用Python实现简易五子棋游戏文章都会有所收获,下面我们一起来看看吧。具体代码如下class ...
    99+
    2023-06-30
  • Java实现五子棋游戏(2.0)
    本文实例为大家分享了Java实现五子棋游戏的具体代码,供大家参考,具体内容如下 简介 相比之前,做出了以下修改: 1.新增菜单栏,将重新开始和退出的按钮移到了菜单栏;2.可以实时显示...
    99+
    2024-04-02
  • C++实现五子棋小游戏
    本文实例为大家分享了C++实现五子棋小游戏的具体代码,供大家参考,具体内容如下 思路:先用用system(“color 70”)改变控制台的背景色为灰白色,前...
    99+
    2024-04-02
  • Java实现五子棋单机版
    本文实例为大家分享了Java实现五子棋单机版的具体代码,供大家参考,具体内容如下 Java五子棋设计流程: 1.创建窗口和设计一个棋盘界面 2.实现鼠标点击,棋子出现,黑白棋轮流下 ...
    99+
    2024-04-02
  • JavaScript+canvas实现五子棋游戏
    本文实例为大家分享了JavaScript+canvas实现五子棋游戏的具体代码,供大家参考,具体内容如下 效果截图: 代码实现: <!DOCTYPE html> &l...
    99+
    2024-04-02
  • js+html实现网页五子棋
    本文实例为大家分享了js+html实现网页五子棋的具体代码,供大家参考,具体内容如下 最终效果图: 废话不多说,上源码: <!doctype html> <ht...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作