搜尋
首頁web前端js教程原生JS+Canvas實作五子棋遊戲的程式碼

原生JS+Canvas實作五子棋遊戲的程式碼

Jul 03, 2018 am 09:45 AM
canvasjs五子棋

这篇文章主要为大家详细介绍了原生JS+Canvas实现五子棋游戏,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了JS  Canvas实现五子棋游戏的具体代码,供大家参考,具体内容如下

<!DOCTYPE html> 
<html> 
  <head> 
    <meta charset="utf-8" /> 
    <title>五子棋</title> 
    <style type=&#39;text/css&#39;> 
      canvas { 
        display: block; 
        margin: 50px auto; 
        box-shadow: -2px -2px 2px #efefef, 5px 5px 5px #b9b9b9; 
        cursor: pointer; 
      } 
      .btn-wrap {  
        display: flex;  
        flex-direction: row;  
        justify-content:center; 
      } 
      .btn-wrap p {  
        margin: 0 10px; 
      } 
      p>span { 
        display: inline-block; 
        padding: 10px 20px; 
        color: #fff; 
        background-color: #EE82EE; 
        border-radius: 5px; 
        cursor: pointer; 
      } 
      p.unable span {  
        background: #D6D6D4;  
        color: #adacaa; 
      } 
      #result-wrap {text-align: center;} 
    </style> 
  </head> 
  <body> 
    <h3 id="益智五子棋">--益智五子棋--</h3> 
    <canvas id="chess" width="450px" height="450px"></canvas> 
    <p class="btn-wrap"> 
      <p id=&#39;restart&#39; class="restart"> 
        <span>重新开始</span> 
      </p> 
      <p id=&#39;goback&#39; class="goback unable"> 
        <span>悔棋</span> 
      </p> 
      <p id=&#39;return&#39; class="return unable"> 
        <span>撤销悔棋</span> 
      </p> 
    </p> 
    <script type="text/javascript" charset="utf-8"> 
      var over = false; 
      var me = true; //我 
      var _nowi = 0, _nowj = 0; //记录自己下棋的坐标 
      var _compi = 0, _compj = 0; //记录计算机当前下棋的坐标 
      var _myWin = [], _compWin = []; //记录我,计算机赢的情况 
      var backAble = false, returnAble = false;  
      var resultTxt = document.getElementById(&#39;result-wrap&#39;); 
      var chressBord = [];//棋盘 
      for(var i = 0; i < 15; i++){ 
        chressBord[i] = []; 
        for(var j = 0; j < 15; j++){ 
          chressBord[i][j] = 0; 
        } 
      } 
      //赢法的统计数组 
      var myWin = []; 
      var computerWin = []; 
      //赢法数组 
      var wins = []; 
      for(var i = 0; i < 15; i++){ 
        wins[i] = []; 
        for(var j = 0; j < 15; j++){ 
          wins[i][j] = []; 
        } 
      } 
      var count = 0; //赢法总数 
      //横线赢法 
      for(var i = 0; i < 15; i++){ 
        for(var j = 0; j < 11; j++){ 
          for(var k = 0; k < 5; k++){ 
            wins[i][j+k][count] = true; 
          } 
          count++; 
        } 
      } 
      //竖线赢法 
      for(var i = 0; i < 15; i++){ 
        for(var j = 0; j < 11; j++){ 
          for(var k = 0; k < 5; k++){ 
            wins[j+k][i][count] = true; 
          } 
          count++; 
        } 
      } 
      //正斜线赢法 
      for(var i = 0; i < 11; i++){ 
        for(var j = 0; j < 11; j++){ 
          for(var k = 0; k < 5; k++){ 
            wins[i+k][j+k][count] = true; 
          } 
          count++; 
        } 
      } 
      //反斜线赢法 
      for(var i = 0; i < 11; i++){  
        for(var j = 14; j > 3; j--){ 
          for(var k = 0; k < 5; k++){ 
            wins[i+k][j-k][count] = true; 
          } 
          count++; 
        } 
      } 
      // debugger; 
      for(var i = 0; i < count; i++){ 
        myWin[i] = 0; 
        _myWin[i] = 0; 
        computerWin[i] = 0; 
        _compWin[i] = 0; 
      } 
      var chess = document.getElementById("chess"); 
      var context = chess.getContext(&#39;2d&#39;); 
      context.strokeStyle = &#39;#bfbfbf&#39;; //边框颜色 
      var backbtn = document.getElementById("goback"); 
      var returnbtn = document.getElementById("return"); 
      window.onload = function(){ 
        drawChessBoard(); // 画棋盘 
      } 
      document.getElementById("restart").onclick = function(){ 
        window.location.reload(); 
      } 
      // 我,下棋 
      chess.onclick = function(e){ 
        if(over){ 
          return; 
        } 
        if(!me){ 
          return; 
        } 
        // 悔棋功能可用 
        backbtn.className = backbtn.className.replace( new RegExp( "(\\s|^)unable(\\s|$)" )," " );  
        var x = e.offsetX; 
        var y = e.offsetY; 
        var i = Math.floor(x / 30); 
        var j = Math.floor(y / 30); 
        _nowi = i; 
        _nowj = j; 
        if(chressBord[i][j] == 0){ 
          oneStep(i,j,me); 
          chressBord[i][j] = 1; //我,已占位置     
                 
          for(var k = 0; k < count; k++){ // 将可能赢的情况都加1 
            if(wins[i][j][k]){ 
              // debugger; 
              myWin[k]++; 
              _compWin[k] = computerWin[k]; 
              computerWin[k] = 6;//这个位置对方不可能赢了 
              if(myWin[k] == 5){ 
                // window.alert(&#39;你赢了&#39;); 
                resultTxt.innerHTML = &#39;恭喜,你赢了!&#39;; 
                over = true; 
              } 
            } 
          } 
          if(!over){ 
            me = !me; 
            computerAI(); 
          } 
        }      
      } 
      // 悔棋 
      backbtn.onclick = function(e){ 
        if(!backAble) { return;} 
        over = false; 
        me = true; 
        // resultTxt.innerHTML = &#39;o(╯□╰)o,悔棋中&#39;; 
        // 撤销悔棋功能可用 
        returnbtn.className = returnbtn.className.replace( new RegExp( "(\\s|^)unable(\\s|$)" )," " );  
        // 我,悔棋 
        chressBord[_nowi][_nowj] = 0; //我,已占位置 还原 
        minusStep(_nowi, _nowj); //销毁棋子                  
        for(var k = 0; k < count; k++){ // 将可能赢的情况都减1 
          if(wins[_nowi][_nowj][k]){ 
            myWin[k]--; 
            computerWin[k] = _compWin[k];//这个位置对方可能赢 
          } 
        } 
        // 计算机相应的悔棋 
        chressBord[_compi][_compj] = 0; //计算机,已占位置 还原 
        minusStep(_compi, _compj); //销毁棋子                  
        for(var k = 0; k < count; k++){ // 将可能赢的情况都减1 
          if(wins[_compi][_compj][k]){ 
            computerWin[k]--; 
            myWin[k] = _myWin[i];//这个位置对方可能赢 
          } 
        } 
        resultTxt.innerHTML = &#39;--益智五子棋--&#39;; 
        returnAble = true; 
        backAble = false; 
      } 
      // 撤销悔棋 
      returnbtn.onclick = function(e){ 
        if(!returnAble) { return; } 
          // 我,撤销悔棋 
        chressBord[_nowi][_nowj] = 1; //我,已占位置  
        oneStep(_nowi,_nowj,me);                
        for(var k = 0; k < count; k++){  
          if(wins[_nowi][_nowj][k]){ 
            myWin[k]++; 
            _compWin[k] = computerWin[k]; 
            computerWin[k] = 6;//这个位置对方不可能赢 
          } 
          if(myWin[k] == 5){ 
            resultTxt.innerHTML = &#39;恭喜,你赢了!&#39;; 
            over = true; 
          } 
        } 
        // 计算机撤销相应的悔棋 
        chressBord[_compi][_compj] = 2; //计算机,已占位置   
        oneStep(_compi,_compj,false);                 
        for(var k = 0; k < count; k++){ // 将可能赢的情况都减1 
          if(wins[_compi][_compj][k]){ 
            computerWin[k]++; 
            _myWin[k] = myWin[k]; 
            myWin[k] = 6;//这个位置对方不可能赢 
          } 
          if(computerWin[k] == 5){ 
            resultTxt.innerHTML = &#39;o(╯□╰)o,计算机赢了,继续加油哦!&#39;; 
            over = true; 
          } 
        } 
        returnbtn.className += &#39; &#39;+ &#39;unable&#39;; 
        returnAble = false; 
        backAble = true; 
      } 
      // 计算机下棋 
      var computerAI = function (){ 
        var myScore = []; 
        var computerScore = []; 
        var max = 0; 
        var u = 0, v = 0; 
        for(var i = 0; i < 15; i++){ 
          myScore[i] = []; 
          computerScore[i] = []; 
          for(var j = 0; j < 15; j++){ 
            myScore[i][j] = 0; 
            computerScore[i][j] = 0; 
          } 
        } 
        for(var i = 0; i < 15; i++){ 
          for(var j = 0; j < 15; j++){ 
            if(chressBord[i][j] == 0){ 
              for(var k = 0; k < count; k++){ 
                if(wins[i][j][k]){ 
                  if(myWin[k] == 1){ 
                    myScore[i][j] += 200; 
                  }else if(myWin[k] == 2){ 
                    myScore[i][j] += 400; 
                  }else if(myWin[k] == 3){ 
                    myScore[i][j] += 2000; 
                  }else if(myWin[k] == 4){ 
                    myScore[i][j] += 10000; 
                  } 
                   
                  if(computerWin[k] == 1){ 
                    computerScore[i][j] += 220; 
                  }else if(computerWin[k] == 2){ 
                    computerScore[i][j] += 420; 
                  }else if(computerWin[k] == 3){ 
                    computerScore[i][j] += 2100; 
                  }else if(computerWin[k] == 4){ 
                    computerScore[i][j] += 20000; 
                  }             
                } 
              } 
               
              if(myScore[i][j] > max){ 
                max = myScore[i][j]; 
                u = i; 
                v = j; 
              }else if(myScore[i][j] == max){ 
                if(computerScore[i][j] > computerScore[u][v]){ 
                  u = i; 
                  v = j;   
                } 
              } 
               
              if(computerScore[i][j] > max){ 
                max = computerScore[i][j]; 
                u = i; 
                v = j; 
              }else if(computerScore[i][j] == max){ 
                if(myScore[i][j] > myScore[u][v]){ 
                  u = i; 
                  v = j;   
                } 
              } 
               
            } 
          } 
        } 
        _compi = u; 
        _compj = v; 
        oneStep(u,v,false); 
        chressBord[u][v] = 2; //计算机占据位置 
        for(var k = 0; k < count; k++){ 
          if(wins[u][v][k]){ 
            computerWin[k]++; 
            _myWin[k] = myWin[k]; 
            myWin[k] = 6;//这个位置对方不可能赢了 
            if(computerWin[k] == 5){ 
              resultTxt.innerHTML = &#39;o(╯□╰)o,计算机赢了,继续加油哦!&#39;; 
              over = true; 
            } 
          } 
        } 
        if(!over){ 
          me = !me; 
        } 
        backAble = true; 
        returnAble = false; 
        var hasClass = new RegExp(&#39;unable&#39;).test(&#39; &#39; + returnbtn.className + &#39; &#39;); 
        if(!hasClass) { 
          returnbtn.className += &#39; &#39; + &#39;unable&#39;; 
        } 
      } 
      //绘画棋盘 
      var drawChessBoard = function() { 
        for(var i = 0; i < 15; i++){ 
          context.moveTo(15 + i * 30 , 15); 
          context.lineTo(15 + i * 30 , 435); 
          context.stroke(); 
          context.moveTo(15 , 15 + i * 30); 
          context.lineTo(435 , 15 + i * 30); 
          context.stroke(); 
        } 
      } 
      //画棋子 
      var oneStep = function(i,j,me) { 
        context.beginPath(); 
        context.arc(15 + i * 30, 15 + j * 30, 13, 0, 2 * Math.PI);// 画圆 
        context.closePath(); 
        //渐变 
        var gradient = context.createRadialGradient(15 + i * 30 + 2, 15 + j * 30 - 2, 13, 15 + i * 30 + 2, 15 + j * 30 - 2, 0); 
        if(me){ 
          gradient.addColorStop(0,&#39;#0a0a0a&#39;); 
          gradient.addColorStop(1,&#39;#636766&#39;); 
        }else{ 
          gradient.addColorStop(0,&#39;#d1d1d1&#39;); 
          gradient.addColorStop(1,&#39;#f9f9f9&#39;); 
        } 
        context.fillStyle = gradient; 
        context.fill(); 
      } 
      //销毁棋子 
      var minusStep = function(i,j) { 
        //擦除该圆 
        context.clearRect((i) * 30, (j) * 30, 30, 30); 
        // 重画该圆周围的格子 
        context.beginPath(); 
        context.moveTo(15+i*30 , j*30); 
        context.lineTo(15+i*30 , j*30 + 30); 
        context.moveTo(i*30, j*30+15); 
        context.lineTo((i+1)*30 , j*30+15); 
   
        context.stroke(); 
      } 
    </script> 
  </body> 
</html>

以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!

相关推荐:

关于原生js实现类似fullpage的单页/全屏滚动的方法

如何利用JS实现仿微信支付弹窗功能

以上是原生JS+Canvas實作五子棋遊戲的程式碼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
Java vs JavaScript:開發人員的詳細比較Java vs JavaScript:開發人員的詳細比較May 16, 2025 am 12:01 AM

javaandjavascriptaredistinctlanguages:javaisusedforenterpriseandmobileapps,while javascriptifforInteractiveWebpages.1)JavaisComcompoppored,statieldinglationallyTypted,statilly tater astrunsonjvm.2)

JavaScript數據類型:瀏覽器和nodejs之間是否有區別?JavaScript數據類型:瀏覽器和nodejs之間是否有區別?May 14, 2025 am 12:15 AM

JavaScript核心數據類型在瀏覽器和Node.js中一致,但處理方式和額外類型有所不同。 1)全局對像在瀏覽器中為window,在Node.js中為global。 2)Node.js獨有Buffer對象,用於處理二進制數據。 3)性能和時間處理在兩者間也有差異,需根據環境調整代碼。

JavaScript評論:使用//和 / * * / * / * /JavaScript評論:使用//和 / * * / * / * /May 13, 2025 pm 03:49 PM

JavaScriptusestwotypesofcomments:single-line(//)andmulti-line(//).1)Use//forquicknotesorsingle-lineexplanations.2)Use//forlongerexplanationsorcommentingoutblocksofcode.Commentsshouldexplainthe'why',notthe'what',andbeplacedabovetherelevantcodeforclari

Python vs. JavaScript:開發人員的比較分析Python vs. JavaScript:開發人員的比較分析May 09, 2025 am 12:22 AM

Python和JavaScript的主要區別在於類型系統和應用場景。 1.Python使用動態類型,適合科學計算和數據分析。 2.JavaScript採用弱類型,廣泛用於前端和全棧開發。兩者在異步編程和性能優化上各有優勢,選擇時應根據項目需求決定。

Python vs. JavaScript:選擇合適的工具Python vs. JavaScript:選擇合適的工具May 08, 2025 am 12:10 AM

選擇Python還是JavaScript取決於項目類型:1)數據科學和自動化任務選擇Python;2)前端和全棧開發選擇JavaScript。 Python因其在數據處理和自動化方面的強大庫而備受青睞,而JavaScript則因其在網頁交互和全棧開發中的優勢而不可或缺。

Python和JavaScript:了解每個的優勢Python和JavaScript:了解每個的優勢May 06, 2025 am 12:15 AM

Python和JavaScript各有優勢,選擇取決於項目需求和個人偏好。 1.Python易學,語法簡潔,適用於數據科學和後端開發,但執行速度較慢。 2.JavaScript在前端開發中無處不在,異步編程能力強,Node.js使其適用於全棧開發,但語法可能複雜且易出錯。

JavaScript的核心:它是在C還是C上構建的?JavaScript的核心:它是在C還是C上構建的?May 05, 2025 am 12:07 AM

javascriptisnotbuiltoncorc; sanInterpretedlanguagethatrunsonenginesoftenwritteninc.1)JavascriptwasdesignedAsignedAsalightWeight,drackendedlanguageforwebbrowsers.2)Enginesevolvedfromsimpleterterpretpretpretpretpreterterpretpretpretpretpretpretpretpretpretcompilerers,典型地,替代品。

JavaScript應用程序:從前端到後端JavaScript應用程序:從前端到後端May 04, 2025 am 12:12 AM

JavaScript可用於前端和後端開發。前端通過DOM操作增強用戶體驗,後端通過Node.js處理服務器任務。 1.前端示例:改變網頁文本內容。 2.後端示例:創建Node.js服務器。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

北端:融合系統,解釋
1 個月前By尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
4 週前By尊渡假赌尊渡假赌尊渡假赌
<🎜>掩蓋:探險33-如何獲得完美的色度催化劑
2 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用