使用JS實現俄羅斯方塊游戲

来源:https://www.cnblogs.com/yidaixiaohui/archive/2018/08/03/8447594.html
-Advertisement-
Play Games

簡單的JS俄羅斯方塊游戲源碼 效果圖: 代碼如下,複製即可使用: GameFrame.js graph.js index.js 如果有更好的方法或更多的功能,可以和我們大家一起分享哦,如有錯誤,歡迎聯繫我改正,非常感謝!!! ...


 簡單的JS俄羅斯方塊游戲源碼

  效果圖:

 

 代碼如下,複製即可使用:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>使用JS實現俄羅斯方塊游戲</title>

<style type="text/css">
    
    .MainFrame
    {
        border: 1px solid burlywood;
        margin: 10px auto;
        position: relative;
        background-color: silver;
    }
    
    .MainFramediv
    {
        float: left;
        margin: 1px;
        position: absolute;
        /*z-index: -1;*/
    }
    
    .smallDiv
    {
        margin: 1px;
        position: absolute;
    }
    
    .smallDivblack
    {
        /*float: left;*/
        margin: 1px;
        /*margin: 1px;*/
        position: absolute;
        /*z-index: 2;*/
    }
    
    #tetris{
        width: 50%;
        margin: 0 auto;
        padding: 0;
        /*border: 1px solid silver;*/
    }
    #tetris:after{
        content:  "";
        Display:  block;
        Clear:  both;
    }
    
    #control{
        float: left;
        border: 1px solid silver;
        width: 150px;
        height: 578px;
        margin-top: 10px;
        margin-left: 20px;
        padding-top: 30px;
        font-size: 24px;
        font-weight: 400;
        color: blue;
        text-align: center;
    }
    #level,#regame{
        width: 100px;
        height: 30px;
        border: 1px solid blue;
        font-size: 16px;
        color: red;
        font-weight: 300;
    }
    #control p{
        margin-top: 200px;
    }
    #regame{
        margin-top: 100px;
        font-weight: 600;
        background-color: azure;
    }
    
    
    #TFrime{
        float: left;
    }
    
    
    #info{
        float: left;
        border: 1px solid silver;
        width: 150px;
        height: 578px;
        margin: 10px auto;
        padding-top: 30px;
        text-align: center;
        color: blue;
        font-size: 24px;
        font-weight: 400;
    }
    #nextfigure{
        width: 100px;
        height: 100px;
        background-color: silver;
        margin: 0 auto;
        margin-bottom: 100px;
        position: relative;
    }
    
    .drawdiv{
        background-color: red;
        margin: 1px;
        border: 1px solid silver;
        position: absolute;
    }
    
</style>
<!-- 此處需要自己修改JS路徑 -->
<script src="js/GameFrame.js" type="text/javascript" charset="utf-8"></script>
<script src="js/graph.js" type="text/javascript" charset="utf-8"></script>
<script src="js/index.js" type="text/javascript" charset="utf-8"></script>

</head>
<body onload="initGame()">
<div id="tetris">
    <div id="control">
        難度:
        <div><select id="level" onchange="changespeed()">
            <option value="1000">簡單
            <option value="500">一般
            <option value="200">困難
        </select></div>
        <input type="button" id="regame" value="重 新 開 始" onclick="regame()">
        <p>
            ↑:變換<br>
            ←:左移<br>
            →:右移<br>
            ↓:加速<br>
        </p>
    </div>
    <div id="TFrime"></div>
    <div id="info">
        下一個圖形:
        <div id="nextfigure">
            
        </div>
        <div>分數:<span id="score">0</span></div>
    </div>
</div>
<div style="text-align:center;margin:10px 0; font:normal 14px/24px 'MicroSoft YaHei';">
<p>適用瀏覽器:360、FireFox、Chrome、Safari、Opera、傲游、搜狗、世界之窗. 不支持IE8及以下瀏覽器。</p>
</div>
</body>
</html>

 GameFrame.js

function GameFrame(unit,row,col)
{
    //單位的像素
    this.unit = unit;
    //橫向單位個數(列),,(一行的個數)
    this.row = row;
    //縱向單位個數(行),,(一列的個數)
    this.col =col;
    //保存頁面創建div容器的屬性
    this.Content;
    //小圖形
    this.samlldiv;
    //定時器id
    this.intervalid;
    //速度
    this.speed =document.getElementById("level").value;
    //速度是否改變
    this.ChangeSped=0;
    //記錄每個位置是否有div
    this.datas=[];
    //記錄消除行數相應的分數
    this.score=[0,100,300,600,1000]
    //記錄當前的圖形的下標
    this.now;
    //記錄下一個圖形的下標
    this.next;
    //記錄當前的圖形的顏色
    this.nowcolor;
    //記錄下一個圖形的顏色
    this.nextcolor;
    //保存7種圖形相對坐標的數組
    this.arr = "0,1,0,2,1,2,2,2;0,1,1,1,1,2,2,2;0,1,0,2,1,1,2,1;0,2,1,1,1,2,2,1;1,0,1,1,1,2,1,3;1,1,1,2,2,1,2,2;1,1,2,0,2,1,2,2".split(";");
    //保存小方塊的顏色
    this.color=["red","blue","green","yellow","#00FFFF","#930093","#F80000","#984B4B"];
    
    //初始化容器div
    this.init = function()
    {
        //創建div
        var div = document.createElement("div");
        //設置div的寬度
        div.style.width = (this.unit*this.row)+"px";
        //設置div的高度
        div.style.height=(this.unit*this.col)+"px";
        //設置div的樣式
        div.className="MainFrame";
        div.id="MainFrame";
        //加入到body中
        document.getElementById("TFrime").appendChild(div);
        this.Content =div; //保存div的引用
        //初始化數組
        for(var i=0;i<this.col;i++)    //i為行
        {
            for(var j=0;j<this.row;j++){                //j為列
            var sdiv = document.createElement("div");
            sdiv.className="MainFramediv";
            sdiv.style.width = (this.unit - 2) + "px";
            sdiv.style.height = (this.unit - 2) + "px";
            sdiv.style.left=(j*this.unit)+"px";
            sdiv.style.top=(i*this.unit)+"px";
            this.Content.appendChild(sdiv);
            this.datas.push(0);
            }
        }
        this.next=Math.floor(Math.random() * this.arr.length);
        this.nextcolor=this.color[Math.floor(Math.random() * this.color.length)];
        Start();
    }
    
    this.MoveLeft = function()
    {
        this.samlldiv.moveleft();
    }
    
    this.MoveRight = function(){
        this.samlldiv.moveright();
    }
    
    this.Change = function(){
        this.samlldiv.change();
        
    }
    
    this.MoveDown = function(){
        if(this.samlldiv.movedown())
        {
//            for(var i=0;i<this.samlldiv.divs.length;i++)
//            {
//                this.Content.removeChild(this.samlldiv.divs[i]);
//            }
            this.samlldiv.rescore();
            Start();
        }
        
    }
    
    function Start()
    {
        //將next值傳給now
        this.frame.now=this.frame.next;
        this.frame.nowcolor=this.frame.nextcolor;
        //創建小div
        this.frame.samlldiv=new Graph(this.frame);
        this.frame.samlldiv.init(this.frame.now,this.frame.nowcolor);
        //繪出下一個圖形
        this.frame.next=Math.floor(Math.random() * this.frame.arr.length);
        this.frame.nextcolor=this.frame.color[Math.floor(Math.random() * this.frame.color.length)];
        draw();
        
        //調用定時器下落
        this.frame.intervalid = setInterval(autoMoveDown,this.frame.speed);
        //判斷游戲是否結束
        if (this.frame.samlldiv.movedown()){
                clearInterval(this.frame.intervalid);
                alert("游戲結束!");
            }
    }
    
    function autoMoveDown()
    {
        if(this.frame.samlldiv.movedown())
        {
            this.frame.samlldiv.rescore();
            Start();
        }
        
        //改變速度
        if(this.frame.ChangeSped){
            clearInterval(this.frame.intervalid);
            this.frame.intervalid = setInterval(autoMoveDown,this.frame.speed);
            this.frame.ChangeSped=0;
        }
    }
    
    //速度改變,令ChangeSped值為1
    this.changespeed=function(){
        this.speed=document.getElementById("level").value;
        this.ChangeSped=1;
//        alert(this.ChangeSped);
    }
    
    //繪製下一個圖形
    function draw(){
        //清楚原有的圖形
        var cleardiv=document.getElementsByClassName("drawdiv");
        for(;;){
            if(cleardiv.length){
                document.getElementById("nextfigure").removeChild(cleardiv[0]);
            }else{
                break;
            }
        }
        //繪製圖形
        var smallarr = this.frame.arr[this.frame.next].split(",");
        for (var i = 0; i < 8; i += 2) {
        var drawdiv = document.createElement("div");
        drawdiv.className = "drawdiv";
        drawdiv.style.backgroundColor=this.frame.nextcolor;
        drawdiv.style.width = (this.frame.unit - 2) + "px";
        drawdiv.style.height = (this.frame.unit - 2) + "px";
        drawdiv.style.top = (((smallarr[i] - 0) * this.frame.unit)+18) + "px";
        drawdiv.style.left = (((smallarr[i + 1] - 0) * this.frame.unit)+18) + "px";
        document.getElementById("nextfigure").appendChild(drawdiv);
        }
    }
    
    
}

 graph.js

function Graph(frame) {
    //保存7種圖形相對坐標的數組
//    var arr = "0,1,0,2,1,2,2,2;0,1,1,1,1,2,2,2;0,1,0,2,1,1,2,1;0,2,1,1,1,2,2,1;1,0,1,1,1,2,1,3;1,1,1,2,2,1,2,2;1,1,2,0,2,1,2,2".split(";");
    //保存4個小圖形的數組
    this.divs = [];
    //外部容器div的數組
    this.parentFrame = frame;
    //圖形橫縱偏移
    this.x = 0;
    this.y = 0;
    //記錄圖形的坐標數組
    this.zb = [];
    //記錄消除的行數
    this.line=0;
    
    

    //初始化小圖形的方法
    this.init = function(rand,color) {
            //計算圖形其實坐標的單位
            var startleft = (this.parentFrame.row - 4) / 2;
            this.x = startleft;
            //隨機生成圖形數組下標
//            var rand = Math.floor(Math.random() * arr.length);
            //分解圖形的坐標
            var smallarr = this.parentFrame.arr[rand].split(",");
            this.zb = smallarr;
            //迴圈設置小div的 left和top
            for (var i = 0; i < 8; i += 2) {
                //創建小div
                var smalldiv = document.createElement("div");
                //設置樣式
                smalldiv.className = "smallDiv";
                //設置顏色
                smalldiv.style.backgroundColor=color;
                //定義高寬
                smalldiv.style.width = (this.parentFrame.unit - 2) + "px";
                smalldiv.style.height = (this.parentFrame.unit - 2) + "px";
                //設置小div的top
                smalldiv.style.top = ((smallarr[i] - 0) * this.parentFrame.unit) + "px";
                //設置小div的left
                smalldiv.style.left = (((smallarr[i + 1] - 0) + startleft) * this.parentFrame.unit) + "px";
                //保存小div的引用
                this.divs.push(smalldiv);                
                //加入到外部容器
                document.getElementById("MainFrame").appendChild(smalldiv);
            }
            //執行自動向下移動
            //this.parentFrame.intervalid = setInterval(autoMoveDown, this.parentFrame.speed);
        }
        //左移動
    this.moveleft = function() {
            //        var canmove = true;
            //        //判斷能否左移動
            //        
            //        for(var i=0;i<this.divs.length;i++)
            //        {
            //                var left=parseInt(this.divs[i].style.left); //div目前的left
            //                if(left - this.parentFrame.unit <0) //減去一個單位的像素是否小於0
            //                {
            //                    canmove = false; //不能向左移動了
            //                    break;
            //                }
            //        }

            if (canMove(this.zb, this.x, this.y, this.parentFrame, 2)) //可以移動
            {
                this.x -= 1;
                for (var i = 0; i < this.divs.length; i++) //迴圈小div,把每個div的left減去一個單位的像素
                {
                    var left = parseInt(this.divs[i].style.left);
                    this.divs[i].style.left = (left - this.parentFrame.unit) + "px";
                }
            }

        }
        //右移動
    this.moveright = function() {
        //        var canmove = true;
        //            //判斷能否右移動
        //        for(var i=0;i<this.divs.length;i++)
        //        {
        //            var left=parseInt(this.divs[i].style.left);
        //            if(left + this.parentFrame.unit >=parseInt(this.parentFrame.Content.style.width))
        //            {
        //                canmove = false;
        //                break;
        //            }
        //        }
        var temp = canMove(this.zb, this.x, this.y, this.parentFrame, 1);
//        alert(temp);
        console.log(temp);
        if (canMove(this.zb, this.x, this.y, this.parentFrame, 1)) {
            this.x += 1;
            for (var i = 0; i < this.divs.length; i++) {
                var left = parseInt(this.divs[i].style.left);
                this.divs[i].style.left = (left + this.parentFrame.unit) + "px";
            }
        }
    }

    //變形
    this.change = function() {
        //變形的公式
        //小div的2個相對坐標點改變    x = y ;  y= 3-x; 比如  (0,1) 變化之後 就是   x=1,y=3-0 -> (1,3)
        //迴圈4個小div
        if (!canMove(this.zb, this.x, this.y, this.parentFrame, 4)) {
            if (this.x < 0) {
                this.x += 1;
            } else {
                this.x -= 1;
            }
        }
        for (var i = 0; i < this.divs.length; i++) {
            //根據公式改變每個div的相對偏移量,2個一改
            var temp = this.zb[i * 2]
            this.zb[i * 2] = this.zb[i * 2 + 1];
            this.zb[i * 2 + 1] = 3 - temp;
            //根據改變後的偏移量計算圖形的當前left和top
            this.divs[i].style.top = ((this.y + parseInt(this.zb[i * 2])) * this.parentFrame.unit) + "px";
            this.divs[i].style.left = ((this.x + parseInt(this.zb[i * 2 + 1])) * this.parentFrame.unit) + "px";
        }

    }

    this.movedown = function() {
        
        var $this = this =="window" ? this.frame.samlldiv : this;
        

        if (canMove($this.zb, $this.x, $this.y, $this.parentFrame, 3)) {
            $this.y += 1;
            for (var i = 0; i < $this.divs.length; i++) {
                var top = parseInt($this.divs[i].style.top);
                $this.divs[i].style.top = (top + $this.parentFrame.unit) + "px";
            }
            return false;
        } else {
            clearInterval($this.parentFrame.intervalid);
//            var temp = $this.parentFrame.Content.getElementsByTagName("div");
            for (var i=0;i<$this.divs.length;i++) {
                //div變灰
                //$this.divs[i].className ="smallDivblack";
                var $y =  $this.y + parseInt($this.zb[i*2]);
                var $x =  $this.x+parseInt($this.zb[i*2+1]);
//                debugger;
                $this.parentFrame.datas[$y*$this.parentFrame.row+ $x] =1;
                $this.divs[i].dataset.row=$y;    //記錄div所在的行
                $this.divs[i].dataset.col=$x;    //記錄div所在的列
                $this.divs[i].className="smallDivblack";
                $this.divs[i].style.backgroundColor="black";
                //$this.parentFrame.datas[]
            }
                
                
                //消行並計分
                for (var i= 0;i<$this.parentFrame.col;i++) {        //i為行
                    //判斷是否滿足消行條件
                    for (var j=0;j<$this.parentFrame.row;j++) {        //j為列
                        if($this.parentFrame.datas[i*$this.parentFrame.row+ j] !=1){
                            break;
                        }
                    }
                    //消行,將該行上面的所有div下移一行
                    if(j==$this.parentFrame.row){
                        var x;        //記錄div在哪一列
                        var y;        //記錄div在哪一行
                        var getsmalldiv=document.getElementById("TFrime").getElementsByClassName("smallDivblack");//得到小div
                        for (var a=0;a<getsmalldiv.length;a++){
                            y=parseInt(getsmalldiv[a].dataset.row);
                            x=parseInt(getsmalldiv[a].dataset.col);
                            if(y==i){        //消除該行
                                debugger;
                                $this.parentFrame.datas[y*$this.parentFrame.row+ x]=0;
                                getsmalldiv[a].remove();
                                a--;
                            }
                        }
                        
                        for (var a=i-1;a>0;a--) {
                            for (var b=0;b<getsmalldiv.length;b++) {
                                y=parseInt(getsmalldiv[b].dataset.row);
                                x=parseInt(getsmalldiv[b].dataset.col);
                                if(y==a){        //將上面的div下移一行
//                                debugger;
                                var divtop=parseInt(getsmalldiv[b].style.top);
                                getsmalldiv[b].style.top=(divtop+$this.parentFrame.unit)+"px";
                                getsmalldiv[b].dataset.row++;
                                $this.parentFrame.datas[y*$this.parentFrame.row+ x]=0;
                                $this.parentFrame.datas[(y+1)*$this.parentFrame.row+ x]=1;
                                }
                            }
                            
                        }
                        $this.line++;
                        
//                        for (var a=0;a<getsmalldiv.length;a++) {
//                            y=parseInt(getsmalldiv[a].dataset.row);
//                            x=parseInt(getsmalldiv[a].dataset.col);
////                            alert(getsmalldiv[a].dataset.row);
//                            if(y<i){        //將上面的div下移一行
////                                debugger;
//                                var divtop=parseInt(getsmalldiv[a].style.top);
////                                alert(getsmalldiv[a].style.top);
//                                getsmalldiv[a].style.top=(divtop+$this.parentFrame.unit)+"px";
//                                getsmalldiv[a].dataset.row++;
//                                debugger;
//                                $this.parentFrame.datas[y*$this.parentFrame.row+ x]=0;
//                                $this.parentFrame.datas[(y+1)*$this.parentFrame.row+ x]=1;
//                            }
////                            }else if(y==i){        //消除該行
////                                debugger;
////                                $this.parentFrame.datas[y*$this.parentFrame.row+ x]=0;
////                                getsmalldiv[a].className="MainFramediv";
////                            }
//                        }
                    }
                }
                    
            return true;
        }
    }

//    function autoMoveDown() {
//        
//        var small = this.frame.samlldiv;
//        var f = this.frame;
//        
//        if (canMove(small.zb, small.x, small.y, 0, f.col, 3)) {
//            small.y += 1;
//            for (var i = 0; i < small.divs.length; i++) {
//                var top = parseInt(small.divs[i].style.top);
//                small.divs[i].style.top = (top + f.unit) + "px";
//            }
//        } else {
//            clearInterval(f.intervalid);
//        }
//
//    }

    //預判能否移動或變化,action:1.右移,2.左移,3.下移,4.變化
    //zb是4個小圖形的相對偏移,x是圖形左偏移,y是top偏移,f是外部frame
    function canMove(zb, x, y, f, action) {
        //datas[parseInt(zb[i + 1]) + x + 1)+(this.y-1)*row] !=0
        
        switch (action) {
            case 1:
//                debugger;
                for (var i = 0; i < zb.length; i += 2) {
                    if (parseInt(zb[i + 1]) + x + 1 >= f.row)
                    {
                        return false;
                    }else if(f.datas[(parseInt(zb[i + 1]) + x + 1)+(y+parseInt(zb[i]))*f.row] !=0)
                    {
                        return false;
                    }
                }
                break;
            case 2:
                for (var i = 0; i < zb.length; i += 2) {
                    if (parseInt(zb[i + 1]) + x - 1 < 0 ) {
                        return false;
                    }else if(f.datas[(parseInt(zb[i + 1]) + x - 1)+(y+parseInt(zb[i]))*f.row] !=0)
                    {
                        return false;
                    }
                }
                break;
            case 3:
                for (var i = 0; i < zb.length; i += 2) {
                    if (parseInt(zb[i]) + y + 1 >= f.col ||
                    f.datas[(parseInt(zb[i + 1]) + x)+(parseInt(zb[i]) + y+1)*f.row] !=0) {
                        return false;
                    }
                }
                break;
            case 4:
                for (var i = 0; i < zb.length; i += 2) {
                    var temp = 3 - zb[i];
                    if (temp + x < 0 || temp + x >= f.row) {
                        return false;
                    }
                }
                break;
        }
        return true;
    }
    
    this.rescore=function(){
        var gamescore=document.getElementById("score");
        gamescore.innerHTML=parseInt(gamescore.innerHTML)+this.parentFrame.score[this.line];
    }

}

 index.js

var frame;

function initGame()
{
    frame = new GameFrame(16,20,38);
    frame.init();

   document.body.addEventListener("keydown",MoveOrChange)
    
}

function changespeed(){
    frame.changespeed();
}

function regame(){
    location.reload();
}


function MoveOrChange()
{
    
    switch(event.keyCode)
    {
        case 38: //變形(上方向鍵)
            frame.Change();
            break;
        case 37: //左移動
            frame.MoveLeft();
            break;
        case 39://右移動
            frame.MoveRight();
            break;
        case 40:  //向下
            frame.MoveDown();
            break;
    }
}

 如果有更好的方法或更多的功能,可以和我們大家一起分享哦,如有錯誤,歡迎聯繫我改正,非常感謝!!!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 發佈訂閱模式 前一篇對觀察者模式做了介紹,重點在於觀察者和被觀察者的對應關係,以及將被觀察者的改變及時通知到相對應的觀察者。 這樣的模式基本上可以解決少量數據源的情景,在觀察者和被觀察者可能是多對多關係的情況下,強耦合的結構會讓代碼不夠清晰,難以維護。 在《JavaScript設計模式》一書中,提到 ...
  • 每個函數都包含兩個非繼承而來的方法:call()方法和apply()方法。 1、相同點:這兩個方法的作用是一樣的。 都是在特定的作用域中調用函數,等於設置函數體內this對象的值,以擴充函數賴以運行的作用域。 一般來說,this總是指向調用某個方法的對象,但是使用call()和apply()方法時, ...
  • Css選擇器主要分為以下幾類 類選擇器 ID選擇器 通配符選擇器 標簽選擇器 偽類選擇器 複合選擇器 1、類選擇器:通過.classname 來選擇 例如 同一個標簽可以通過多個類名來指定多個樣式,但是若其中有重疊部分,則按權重值重疊,若在同一權重級別中,如都是內部樣式表中的,則按照上下關係,下麵的 ...
  • 1、對象:在JavaScript中,所有事物都是對象,如字元串、數值、數組、函數等。 JavaScript中的基本數據類型: number(數值類型) string(字元串類型) boolean(布爾類型) null(空類型) undefined(未定義類型) object:一種複雜的數據類型,該類 ...
  • WebGL魔方小游戲 - www.web-tinker.com ...
  • 目錄 1. JavaScript框架種類及其優缺點 2. jQuery庫 3. jQuery對象$ 掌握基本選擇器 掌握過濾選擇器 掌握表單選擇器 RIA技術 常見的RIA技術 Ajax Sliverlight Flex 什麼是框架? 框架是程式員將一個又一個功能進行封裝,供其他人使用的程式組件,了 ...
  • <script>let iosUser = window.navigator.userAgent.indexOf('iPhone')let inp = document.querySelector('#inp');//input輸入框if (iosUser != -1) { var bfscroll ...
  • JS中 條件判斷為 false 的幾種情況: 0、-0、0.0、null、""、false、undefined、NaN 其他情況下判斷為 true, 包括:"0"、"null"、"false"、"undefined"、"NaN" ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...