欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

原生JS+Canvas實(shí)現(xiàn)五子棋游戲的代碼詳解

這篇文章主要講解了原生JS+Canvas實(shí)現(xiàn)五子棋游戲的代碼詳解,內(nèi)容清晰明了,對(duì)此有興趣的小伙伴可以學(xué)習(xí)一下,相信大家閱讀完之后會(huì)有幫助。

成都創(chuàng)新互聯(lián)專注于魚臺(tái)網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供魚臺(tái)營(yíng)銷型網(wǎng)站建設(shè),魚臺(tái)網(wǎng)站制作、魚臺(tái)網(wǎng)頁(yè)設(shè)計(jì)、魚臺(tái)網(wǎng)站官網(wǎng)定制、小程序定制開發(fā)服務(wù),打造魚臺(tái)網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供魚臺(tái)網(wǎng)站排名全網(wǎng)營(yíng)銷落地服務(wù)。

<!DOCTYPE html> 
<html> 
 <head> 
 <meta charset="utf-8" /> 
 <title>五子棋</title> 
 <style type='text/css'> 
 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 div { 
 margin: 0 10px; 
 } 
 div>span { 
 display: inline-block; 
 padding: 10px 20px; 
 color: #fff; 
 background-color: #EE82EE; 
 border-radius: 5px; 
 cursor: pointer; 
 } 
 div.unable span { 
 background: #D6D6D4; 
 color: #adacaa; 
 } 
 #result-wrap {text-align: center;} 
 </style> 
 </head> 
 <body> 
 <h4 id="result-wrap">--益智五子棋--</h4> 
 <canvas id="chess" width="450px" height="450px"></canvas> 
 <div class="btn-wrap"> 
 <div id='restart' class="restart"> 
 <span>重新開始</span> 
 </div> 
 <div id='goback' class="goback unable"> 
 <span>悔棋</span> 
 </div> 
 <div id='return' class="return unable"> 
 <span>撤銷悔棋</span> 
 </div> 
 </div> 
 <script type="text/javascript" charset="utf-8"> 
 var over = false; 
 var me = true; //我 
 var _nowi = 0, _nowj = 0; //記錄自己下棋的坐標(biāo) 
 var _compi = 0, _compj = 0; //記錄計(jì)算機(jī)當(dāng)前下棋的坐標(biāo) 
 var _myWin = [], _compWin = []; //記錄我,計(jì)算機(jī)贏的情況 
 var backAble = false, returnAble = false; 
 var resultTxt = document.getElementById('result-wrap'); 
 var chressBord = [];//棋盤 
 for(var i = 0; i < 15; i++){ 
 chressBord[i] = []; 
 for(var j = 0; j < 15; j++){ 
  chressBord[i][j] = 0; 
 } 
 } 
 //贏法的統(tǒng)計(jì)數(shù)組 
 var myWin = []; 
 var computerWin = []; 
 //贏法數(shù)組 
 var wins = []; 
 for(var i = 0; i < 15; i++){ 
 wins[i] = []; 
 for(var j = 0; j < 15; j++){ 
  wins[i][j] = []; 
 } 
 } 
 var count = 0; //贏法總數(shù) 
 //橫線贏法 
 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('2d'); 
 context.strokeStyle = '#bfbfbf'; //邊框顏色 
 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;//這個(gè)位置對(duì)方不可能贏了 
  if(myWin[k] == 5){ 
  // window.alert('你贏了'); 
  resultTxt.innerHTML = '恭喜,你贏了!'; 
  over = true; 
  } 
  } 
  } 
  if(!over){ 
  me = !me; 
  computerAI(); 
  } 
 } 
 } 
 // 悔棋 
 backbtn.onclick = function(e){ 
 if(!backAble) { return;} 
 over = false; 
 me = true; 
 // resultTxt.innerHTML = 'o(╯□╰)o,悔棋中'; 
 // 撤銷悔棋功能可用 
 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];//這個(gè)位置對(duì)方可能贏 
  } 
 } 
 // 計(jì)算機(jī)相應(yīng)的悔棋 
 chressBord[_compi][_compj] = 0; //計(jì)算機(jī),已占位置 還原 
 minusStep(_compi, _compj); //銷毀棋子   
 for(var k = 0; k < count; k++){ // 將可能贏的情況都減1 
  if(wins[_compi][_compj][k]){ 
  computerWin[k]--; 
  myWin[k] = _myWin[i];//這個(gè)位置對(duì)方可能贏 
  } 
 } 
 resultTxt.innerHTML = '--益智五子棋--'; 
 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;//這個(gè)位置對(duì)方不可能贏 
  } 
  if(myWin[k] == 5){ 
  resultTxt.innerHTML = '恭喜,你贏了!'; 
  over = true; 
  } 
 } 
 // 計(jì)算機(jī)撤銷相應(yīng)的悔棋 
 chressBord[_compi][_compj] = 2; //計(jì)算機(jī),已占位置 
 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;//這個(gè)位置對(duì)方不可能贏 
  } 
  if(computerWin[k] == 5){ 
  resultTxt.innerHTML = 'o(╯□╰)o,計(jì)算機(jī)贏了,繼續(xù)加油哦!'; 
  over = true; 
  } 
 } 
 returnbtn.className += ' '+ 'unable'; 
 returnAble = false; 
 backAble = true; 
 } 
 // 計(jì)算機(jī)下棋 
 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; //計(jì)算機(jī)占據(jù)位置 
 for(var k = 0; k < count; k++){ 
  if(wins[u][v][k]){ 
  computerWin[k]++; 
  _myWin[k] = myWin[k]; 
  myWin[k] = 6;//這個(gè)位置對(duì)方不可能贏了 
  if(computerWin[k] == 5){ 
  resultTxt.innerHTML = 'o(╯□╰)o,計(jì)算機(jī)贏了,繼續(xù)加油哦!'; 
  over = true; 
  } 
  } 
 } 
 if(!over){ 
  me = !me; 
 } 
 backAble = true; 
 returnAble = false; 
 var hasClass = new RegExp('unable').test(' ' + returnbtn.className + ' '); 
 if(!hasClass) { 
  returnbtn.className += ' ' + 'unable'; 
 } 
 } 
 //繪畫棋盤 
 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,'#0a0a0a'); 
  gradient.addColorStop(1,'#636766'); 
 }else{ 
  gradient.addColorStop(0,'#d1d1d1'); 
  gradient.addColorStop(1,'#f9f9f9'); 
 } 
 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>

看完上述內(nèi)容,是不是對(duì)原生JS+Canvas實(shí)現(xiàn)五子棋游戲的代碼詳解有進(jìn)一步的了解,如果還想學(xué)習(xí)更多內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

當(dāng)前名稱:原生JS+Canvas實(shí)現(xiàn)五子棋游戲的代碼詳解
URL網(wǎng)址:http://chinadenli.net/article8/ppccip.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供建站公司、網(wǎng)站建設(shè)網(wǎng)站設(shè)計(jì)公司、面包屑導(dǎo)航、微信小程序企業(yè)建站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都做網(wǎng)站
亚洲国产av国产av| 欧美激情中文字幕综合八区| 亚洲欧洲成人精品香蕉网| 亚洲天堂国产精品久久精品| 国产欧美日产久久婷婷| 国内外激情免费在线视频| 最好看的人妻中文字幕| 久久婷婷综合色拍亚洲| 精品国自产拍天天青青草原| 日本人妻精品有码字幕| av中文字幕一区二区三区在线| 亚洲国产av在线视频| 国产午夜精品在线免费看| 草草视频福利在线观看| 女厕偷窥一区二区三区在线| 欧美一区二区口爆吞精| 国产熟女一区二区不卡| 欧美一本在线免费观看| 亚洲天堂久久精品成人| 日韩精品免费一区二区三区| 国产欧美精品对白性色| 亚洲欧美日韩国产综合在线| 日韩中文字幕视频在线高清版| 亚洲中文字幕在线视频频道| 国内胖女人做爰视频有没有| 亚洲一区二区三区免费的视频| 久久精品偷拍视频观看| 91精品国产综合久久福利| 亚洲欧美国产网爆精品| 国产精品久久精品国产| 麻豆视传媒短视频在线看| 久久女同精品一区二区| 日本中文字幕在线精品| 免费在线成人激情视频| 久久人人爽人人爽大片av| 免费亚洲黄色在线观看| 国产一区二区在线免费| 国产精品一区二区三区激情| 黄片免费播放一区二区| 最近最新中文字幕免费| 国产成人一区二区三区久久|