Heim Web-Frontend js-Tutorial Nativer JS+Canvas-Code zur Implementierung eines Backgammon-Spiels

Nativer JS+Canvas-Code zur Implementierung eines Backgammon-Spiels

Jul 03, 2018 am 09:45 AM
canvas js Backgammon

这篇文章主要为大家详细介绍了原生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="result-wrap">--益智五子棋--</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>
Nach dem Login kopieren

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

相关推荐:

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

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

Das obige ist der detaillierte Inhalt vonNativer JS+Canvas-Code zur Implementierung eines Backgammon-Spiels. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Wie man alles in Myrise freischaltet
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Wesentliche Tools für die Aktienanalyse: Lernen Sie die Schritte zum Zeichnen von Kerzendiagrammen mit PHP und JS Wesentliche Tools für die Aktienanalyse: Lernen Sie die Schritte zum Zeichnen von Kerzendiagrammen mit PHP und JS Dec 17, 2023 pm 06:55 PM

Wesentliche Tools für die Aktienanalyse: Lernen Sie die Schritte zum Zeichnen von Kerzendiagrammen in PHP und JS. Mit der rasanten Entwicklung des Internets und der Technologie ist der Aktienhandel für viele Anleger zu einer wichtigen Möglichkeit geworden. Die Aktienanalyse ist ein wichtiger Teil der Anlegerentscheidung, und Kerzendiagramme werden häufig in der technischen Analyse verwendet. Wenn Sie lernen, wie man Kerzendiagramme mit PHP und JS zeichnet, erhalten Anleger intuitivere Informationen, die ihnen helfen, bessere Entscheidungen zu treffen. Ein Candlestick-Chart ist ein technischer Chart, der Aktienkurse in Form von Candlesticks anzeigt. Es zeigt den Aktienkurs

Empfohlen: Ausgezeichnetes JS-Open-Source-Projekt zur Gesichtserkennung und -erkennung Empfohlen: Ausgezeichnetes JS-Open-Source-Projekt zur Gesichtserkennung und -erkennung Apr 03, 2024 am 11:55 AM

Die Technologie zur Gesichtserkennung und -erkennung ist bereits eine relativ ausgereifte und weit verbreitete Technologie. Derzeit ist JS die am weitesten verbreitete Internetanwendungssprache. Die Implementierung der Gesichtserkennung und -erkennung im Web-Frontend hat im Vergleich zur Back-End-Gesichtserkennung Vor- und Nachteile. Zu den Vorteilen gehören die Reduzierung der Netzwerkinteraktion und die Echtzeiterkennung, was die Wartezeit des Benutzers erheblich verkürzt und das Benutzererlebnis verbessert. Die Nachteile sind: Es ist durch die Größe des Modells begrenzt und auch die Genauigkeit ist begrenzt. Wie implementiert man mit js die Gesichtserkennung im Web? Um die Gesichtserkennung im Web zu implementieren, müssen Sie mit verwandten Programmiersprachen und -technologien wie JavaScript, HTML, CSS, WebRTC usw. vertraut sein. Gleichzeitig müssen Sie auch relevante Technologien für Computer Vision und künstliche Intelligenz beherrschen. Dies ist aufgrund des Designs der Webseite erwähnenswert

So erstellen Sie ein Aktien-Candlestick-Diagramm mit PHP und JS So erstellen Sie ein Aktien-Candlestick-Diagramm mit PHP und JS Dec 17, 2023 am 08:08 AM

So verwenden Sie PHP und JS zum Erstellen eines Aktienkerzendiagramms. Ein Aktienkerzendiagramm ist eine gängige technische Analysegrafik auf dem Aktienmarkt. Es hilft Anlegern, Aktien intuitiver zu verstehen, indem es Daten wie den Eröffnungskurs, den Schlusskurs, den Höchstkurs usw niedrigster Preis der Aktie. In diesem Artikel erfahren Sie anhand spezifischer Codebeispiele, wie Sie Aktienkerzendiagramme mit PHP und JS erstellen. 1. Vorbereitung Bevor wir beginnen, müssen wir die folgende Umgebung vorbereiten: 1. Ein Server, auf dem PHP 2. Ein Browser, der HTML5 und Canvas 3 unterstützt

PHP- und JS-Entwicklungstipps: Beherrschen Sie die Methode zum Zeichnen von Aktienkerzendiagrammen PHP- und JS-Entwicklungstipps: Beherrschen Sie die Methode zum Zeichnen von Aktienkerzendiagrammen Dec 18, 2023 pm 03:39 PM

Mit der rasanten Entwicklung der Internetfinanzierung sind Aktieninvestitionen für immer mehr Menschen zur Wahl geworden. Im Aktienhandel sind Kerzendiagramme eine häufig verwendete Methode der technischen Analyse. Sie können den sich ändernden Trend der Aktienkurse anzeigen und Anlegern helfen, genauere Entscheidungen zu treffen. In diesem Artikel werden die Entwicklungskompetenzen von PHP und JS vorgestellt, der Leser wird zum Verständnis des Zeichnens von Aktienkerzendiagrammen geführt und es werden spezifische Codebeispiele bereitgestellt. 1. Aktien-Kerzendiagramme verstehen Bevor wir uns mit dem Zeichnen von Aktien-Kerzendiagrammen befassen, müssen wir zunächst verstehen, was ein Kerzendiagramm ist. Candlestick-Charts wurden von den Japanern entwickelt

Die Beziehung zwischen js und vue Die Beziehung zwischen js und vue Mar 11, 2024 pm 05:21 PM

Die Beziehung zwischen js und vue: 1. JS als Eckpfeiler der Webentwicklung; 2. Der Aufstieg von Vue.js als Front-End-Framework; 3. Die komplementäre Beziehung zwischen JS und Vue; Vue.

Lernen Sie das Canvas-Framework kennen und erklären Sie das häufig verwendete Canvas-Framework im Detail Lernen Sie das Canvas-Framework kennen und erklären Sie das häufig verwendete Canvas-Framework im Detail Jan 17, 2024 am 11:03 AM

Entdecken Sie das Canvas-Framework: Um die häufig verwendeten Canvas-Frameworks zu verstehen, sind spezifische Codebeispiele erforderlich. Einführung: Canvas ist eine in HTML5 bereitgestellte Zeichen-API, mit der wir umfangreiche Grafik- und Animationseffekte erzielen können. Um die Effizienz und den Komfort des Zeichnens zu verbessern, haben viele Entwickler verschiedene Canvas-Frameworks entwickelt. In diesem Artikel werden einige häufig verwendete Canvas-Frameworks vorgestellt und spezifische Codebeispiele bereitgestellt, um den Lesern ein tieferes Verständnis für die Verwendung dieser Frameworks zu vermitteln. 1. EaselJS-Framework Ea

Entdecken Sie die wichtige Rolle und Anwendung von Canvas in der Spieleentwicklung Entdecken Sie die wichtige Rolle und Anwendung von Canvas in der Spieleentwicklung Jan 17, 2024 am 11:00 AM

Verstehen Sie die Leistungsfähigkeit und Anwendung von Canvas in der Spieleentwicklung. Überblick: Mit der rasanten Entwicklung der Internettechnologie werden Webspiele bei Spielern immer beliebter. Als wichtiger Bestandteil der Webspielentwicklung hat sich die Canvas-Technologie nach und nach in der Spieleentwicklung durchgesetzt und ihre leistungsstarke Leistungsfähigkeit und Anwendung unter Beweis gestellt. In diesem Artikel wird das Potenzial von Canvas in der Spieleentwicklung vorgestellt und seine Anwendung anhand spezifischer Codebeispiele demonstriert. 1. Einführung in die Canvas-Technologie Canvas ist ein neues Element in HTML5, das uns die Verwendung ermöglicht

Für welche Stile ist html2canvas ungültig? Für welche Stile ist html2canvas ungültig? Nov 24, 2023 pm 03:25 PM

Zu den ungültigen Stilen gehören CSS3-Animationen und -Übergänge, CSS-Filtereffekte, komplexe CSS3-Grafiken und -Pfade, einige CSS3-Funktionen, Pseudoelemente und einige CSS-Funktionen, Z-Index, Hintergrundbilder und Verläufe usw. Ausführliche Einführung: 1. CSS3-Animation und -Übergang: html2canvas erfasst CSS3-Animations- und Übergangseffekte möglicherweise nicht vollständig. Obwohl versucht wird, den endgültigen Stil zu erfassen, können diese Animationen und Übergänge während des Konvertierungsprozesses verloren gehen. 2. CSS-Filtereffekte: Filter wie Unschärfe und Schatten bleiben während des Konvertierungsprozesses möglicherweise nicht erhalten.

See all articles