中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何使用nodeJs和express制作五子棋游戲

發布時間:2020-06-12 14:49:49 來源:億速云 閱讀:312 作者:元一 欄目:web開發

Node.js 

是一個讓 JavaScript 運行在服務端的開發平臺,它讓 JavaScript 成為與PHP、Python、Perl、Ruby等服務端語言平起平坐的腳本語言。發布于2009年5月,由Ryan Dahl開發,實質是對Chrome V8引擎進行了封裝。

Node.js對一些特殊用例進行優化,提供替代的API,使得V8在非瀏覽器環境下運行得更好。V8引擎執行Javascript的速度非常快,性能非常好。Node.js是一個基于Chrome JavaScript運行時建立的平臺, 用于方便地搭建響應速度快、易于擴展的網絡應用。Node.js 使用事件驅動, 非阻塞I/O模型而得以輕量和高效,非常適合在分布式設備上運行數據密集型的實時應用。

Express 

是一個簡潔而靈活的 node.js Web應用框架, 提供了一系列強大特性幫助你創建各種 Web 應用,和豐富的 HTTP 工具。

使用 Express 可以快速地搭建一個完整功能的網站。

Express 框架核心特性:

可以設置中間件來響應 HTTP 請求。

定義了路由表用于執行不同的 HTTP 請求動作。

可以通過向模板傳遞參數來動態渲染 HTML 頁面。

簡單點說express就是一個封裝了很多功能的包,而你只需要用簡單的express的專屬的一些代碼便可解決本來正常較為復雜的代碼,方便你使用

代碼

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屬性返回一個布爾值truefalse,來表明當前元素節點是否有至少一個的屬性

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

}

 

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

泸西县| 奉新县| 灵山县| 凉山| 聂荣县| 祥云县| 余江县| 射阳县| 新平| 蒲江县| 鄂托克旗| 阳东县| 台安县| 浪卡子县| 三门县| 璧山县| 且末县| 福鼎市| 宁南县| 贵阳市| 富源县| 安龙县| 昭通市| 上林县| 廉江市| 林州市| 和龙市| 闽清县| 泾源县| 周至县| 通许县| 宁晋县| 修文县| 元氏县| 仁寿县| 闽侯县| 西吉县| 衡水市| 台前县| 云龙县| 德令哈市|