电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

vue實現五子棋游戲

瀏覽:133日期:2023-01-18 11:38:57

本文實例為大家分享了vue實現五子棋游戲的具體代碼,供大家參考,具體內容如下

思路

1.vue實現五子棋

空棋盤開局。

畫網格:網格有 15 行 15 列,共有 225 個交叉點黑先、白后,交替下子,每次只能下一子勝負判定按照簡單的規則,從當前下子點位的方向判斷()。如果有一個方向滿足連續5個黑子或白子,游戲結束。

2.支持dom和canvas切換

判斷瀏覽器是否支持canvas:

false: 不支持 切換dom方式true: 支持 使用canvas

3.實現悔棋功能

4.實現撤銷悔棋

例子:

為了簡便,我就把所有寫在一起了,按理來說是要分文件寫的;

GitHub IO:鏈接

<!DOCTYPE html><html> <head> <meta charset='utf-8'> <title>簡易五子棋</title> <script src='https://cdn.jsdelivr.net/npm/vue@2.6.11'></script> <style> body { margin: 0; padding: 0; } #app{ padding-left: 30%; width: 500px; } .h2Title{ text-align: center; } #app h3{ color: red; } .Fbuttons{ margin-bottom: 1rem; } .main{ background-color: bisque; width: 30rem; } .restart,.regret,.undo{ background: bisque; padding: 6px 10px; border-radius: 6px; font-size: 12px; cursor: pointer; } #chess { position: relative; width: 440px; height: 450px; padding-left: 30px; padding-top: 30px; background-color: bisque; } #chess .squre { width: 28px; height: 28px; border: 1px solid #666; float: left; } #box01 .squre:hover { background-color: pink; } #box01 { position: absolute; margin: 0 auto; width: 450px; height: 450px; top: 15px; left: 15px; } #box01 .qz { /* width: 28px; height: 28px; */ width: 30px; height: 30px; border: 0px solid #C7C7C7; float: left; border-radius: 50%; /* margin: 1px; */ } #box01 .qz:hover { background-color: pink; } .toggle{ float: right; } </style> </head> <body> <div id='app'> <h2 class='h2Title'>五子棋</h2> <h3>{{victory}}</h3> <div class='Fbuttons'> <input type='button' value='重新開始' @click='restartInit()' /> <input type='button' value='悔棋' @click='regret()' /> <input type='button' value='撤銷悔棋' @click='undo()' /> <input type='button' :value='toggle?’切換dom’:’切換canvas’' @click='toggleF()' /> </div> <div class='main'> <canvas v-show='toggle' ref='canvas' height='480'>當前瀏覽器不支持Canvas</canvas> <div v-show='!toggle' ref='chessBox'> <!-- <div id='box01'></div> <div id='box02'></div> --> </div> </div> </div> <!-- --> <script> var app = new Vue({ el: '#app', data: { pieceMapArr: [], //記錄棋盤落子情況 pieceColor: ['black', 'white'], //棋子顏色 step: 0, //記錄當前步數 checkMode: [ //輸贏檢查方向模式 [1, 0], //水平 [0, 1], //豎直 [1, 1], //左斜線 [1, -1], //右斜線 ], flag: false, victory: ’’, history: [], //歷史記錄位置 historyVal: [], //歷史記錄不被刪除數組 stepHistory: 0, domPiece:[], // toggle: true //true為canvas,false為dom }, mounted(){ const myCanvas = document.getElementById('myCanvas'); if (!myCanvas.getContext) { alert('當前瀏覽器不支持Canvas.'); this.toggle = false; this.drawpieceBoardDom(); } else { console.log('當前瀏覽器支持Canvas', this.toggle) this.drawpieceBoard(); const canvas = this.$refs.canvas; // 添加點擊監聽事件 canvas.addEventListener('click', e => { if (this.flag) { alert('游戲結束,請重新開始~'); return; } //判斷點擊范圍是否越出棋盤 if (e.offsetX < 25 || e.offsetX > 450 || e.offsetY < 25 || e.offsetY > 450) { return; } let dx = Math.floor((e.offsetX + 15) / 30) * 30; let dy = Math.floor((e.offsetY + 15) / 30) * 30; console.log(’this.pieceMapArr 數組’, this.pieceMapArr) if (this.pieceMapArr[dx / 30 - 1][dy / 30 - 1] == 0) { console.log(’落下棋子’, dx, dy, this.pieceColor[this.step % 2]) this.drawPiece(dx, dy, this.pieceColor[this.step % 2]); //落下棋子 this.pieceMapArr[dx / 30 - 1][dy / 30 - 1] = this.pieceColor[this.step % 2]; //歷史記錄位置 this.history.length = this.step; this.history.push({ dx, dy, color: this.pieceColor[this.step % 2] }); this.historyVal.push({ dx, dy, color: this.pieceColor[this.step % 2] }); this.stepHistory++ console.log(’this.history’, this.history); //檢查當前玩家是否贏了游戲 for (var i = 0; i < 4; i++) { this.checkWin(dx / 30 - 1, dy / 30 - 1, this.pieceColor[this.step % 2], this.checkMode[i]); } this.step++; } else { alert('不能落在有棋子的地方!'); } }); } }, methods: { toggleF() { this.toggle = !this.toggle; if (!this.toggle) { // console.log('當前---------------1') // let elem = document.getElementById(’box01’); // if (elem !== null) { // elem.parentNode.removeChild(elem); // let elem02 = document.getElementById(’box02’); // elem02.parentNode.removeChild(elem02); // } // this.drawpieceBoardDom(); this.restartInit() } else { this.restartInit() // this.drawpieceBoard(); } }, //初始化棋盤數組 pieceArr() { for (let i = 0; i < 15; i++) { this.pieceMapArr[i] = []; for (let j = 0; j < 15; j++) { this.pieceMapArr[i][j] = 0; } } }, //重新開始 restartInit() { if (!this.toggle) { // console.log('-----dom-------') var elem = document.querySelector(’#box01’); // console.log('elem',elem) if (elem != null ) { elem.parentNode.removeChild(elem); let elem02 = document.querySelector(’#box02’); elem02.parentNode.removeChild(elem02); } this.drawpieceBoardDom(); this.flag = false; this.step = 0; this.stepHistory = 0; this.historyVal = []; this.history = []; } else { //重畫 this.repaint(); // 繪制棋盤 this.drawpieceBoard(); this.flag = false; this.step = 0; this.stepHistory = 0; this.historyVal = []; this.history = []; } }, //---------canvas---------- // 繪制棋盤 drawpieceBoard() { //初始化棋盤數組 this.pieceArr(); //canvas 繪制 let canvas = this.$refs.canvas // 調用canvas元素的getContext 方法訪問獲取2d渲染的上下文 let context = canvas.getContext('2d'); context.strokeStyle = ’#666’ for (let i = 0; i < 15; i++) { //落在方格(canvas 的寬高是450) // 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() //落在交叉點(480) context.beginPath(); context.moveTo((i + 1) * 30, 30); context.lineTo((i + 1) * 30, canvas.height - 30); context.closePath(); context.stroke(); context.beginPath(); context.moveTo(30, (i + 1) * 30); context.lineTo(canvas.width - 30, (i + 1) * 30); context.closePath(); context.stroke(); } }, //繪制棋子 drawPiece(x, y, color) { let canvas = this.$refs.canvas let context = canvas.getContext('2d'); context.beginPath(); //開始一條路徑或重置當前的路徑 context.arc(x, y, 15, 0, Math.PI * 2, false); context.closePath(); context.fillStyle = color; context.fill(); }, //勝負判斷函數 checkWin(x, y, color, mode) { let count = 1; //記錄 for (let i = 1; i < 5; i++) { if (this.pieceMapArr[x + i * mode[0]]) { if (this.pieceMapArr[x + i * mode[0]][y + i * mode[1]] == color) { count++; } else { break; } } } for (let j = 1; j < 5; j++) { if (this.pieceMapArr[x - j * mode[0]]) { if (this.pieceMapArr[x - j * mode[0]][y - j * mode[1]] == color) { count++; } else { break; } } } // console.log(’勝負判斷函數’, count) // console.log(’color’, color) if (count >= 5) { if (color == ’black’) { this.victory = '黑子棋方勝利!'; } else { this.victory = '白子棋方勝利!'; } // 游戲結束 // console.log(’游戲結束’) this.flag = true; } }, //重畫函數 repaint() { //重畫 let canvas = this.$refs.canvas; let context = canvas.getContext('2d'); context.fillStyle = 'bisque'; context.fillRect(0, 0, canvas.width, canvas.height); context.beginPath(); context.closePath(); }, //悔棋: // canvas 創建一個二維數組,下棋或者悔棋都操作這個數組。操作完數據,把畫布全清,重新用數據畫一個棋盤。 // dom 二維數組刪除數組最后一項, 先清空棋子的填充顏色,在渲染上顏色 regret() { if (!this.toggle) { // console.log('-----dom------this.domPiece',this.domPiece) if (this.history.length && !this.flag) { this.history.pop(); //刪除數組最后一項 console.log('-----dom------this.history', this.history) //重畫 this.pieceArr(); // let elem = document.getElementById(’box01’); // if (elem !== null) { // elem.parentNode.removeChild(elem); // let elem02 = document.getElementById(’box02’); // elem02.parentNode.removeChild(elem02); // } //這個太耗性能了 // this.drawpieceBoardDom(); // 清空棋子的填充顏色 this.domPiece.forEach(e => { e.forEach(qz => { qz.style.backgroundColor = ’’; }) }); // 渲染棋子顏色 this.history.forEach(e => { this.domPiece[e.m][e.n].style.backgroundColor = e.color this.pieceMapArr[e.m][e.n] = e.color; }); this.step-- } else { alert('已經不能悔棋了~') } } else { if (this.history.length && !this.flag) { this.history.pop(); //刪除數組最后一項 //重畫 this.repaint(); // 繪制棋盤 this.drawpieceBoard(); //繪制棋子 this.history.forEach(e => { this.drawPiece(e.dx, e.dy, e.color) this.pieceMapArr[e.dx / 30 - 1][e.dy / 30 - 1] = e.color; }); this.step-- } else { alert('已經不能悔棋了~') } } }, //撤銷悔棋 undo() { if (!this.toggle) { // console.log('-----dom------this.domPiece',this.domPiece) if ((this.historyVal.length > this.history.length) && !this.flag) { this.history.push(this.historyVal[this.step]) console.log('-----dom------this.history', this.history) // 清空棋子的填充顏色 this.domPiece.forEach(e => { e.forEach(qz => { qz.style.backgroundColor = ’’; }) }); // 渲染棋子顏色 this.history.forEach(e => { this.domPiece[e.m][e.n].style.backgroundColor = e.color this.pieceMapArr[e.m][e.n] = e.color; }); this.step++ } else { alert('不能撤銷悔棋了~') } } else { if ((this.historyVal.length > this.history.length) && !this.flag) { this.history.push(this.historyVal[this.step]) //重畫 this.repaint(); // 繪制棋盤 this.drawpieceBoard(); this.history.forEach(e => { this.drawPiece(e.dx, e.dy, e.color) this.pieceMapArr[e.dx / 30 - 1][e.dy / 30 - 1] = e.color; }); this.step++ } else { alert('不能撤銷悔棋了~') } } }, // -----------dom----------- drawpieceBoardDom() { // console.log('this', this) let that = this; //調用初始化棋盤數組函數 that.pieceArr(); //創建一個容器 const box = document.querySelector('#chess'); const box01 = document.createElement('div'); box01.setAttribute('id', 'box01'); box.appendChild(box01); //畫棋盤 const chess01 = document.querySelector('#box01'); const box02 = document.createElement('div'); box02.setAttribute('id', 'box02'); box.appendChild(box02); let arr = new Array(); for (let i = 0; i < 14; i++) { arr[i] = new Array(); for (let j = 0; j < 14; j++) { arr[i][j] = document.createElement('div'); arr[i][j].setAttribute('class', 'squre'); box02.appendChild(arr[i][j]); } } //畫棋子 let arr01 = this.domPiece; for (let i = 0; i < 15; i++) { arr01[i] = new Array(); for (let j = 0; j < 15; j++) { arr01[i][j] = document.createElement('div'); arr01[i][j].setAttribute('class', 'qz'); chess01.appendChild(arr01[i][j]); } } // console.log('this.domPiece',this.domPiece) // 填充顏色和判斷 for (let m = 0; m < 15; m++) { for (let n = 0; n < 15; n++) { arr01[m][n].onclick = function() { //判斷游戲是否結束 if (!that.flag) { if (that.pieceMapArr[m][n] == 0) { //黑白交換下棋 // console.log(this); // console.log(’落下棋子’, that.pieceColor[that.step % 2]) //確保填充顏色正確進行了判斷 if (this.className == 'qz' && that.step % 2 == 0 && this.style.backgroundColor == '') { //下棋填充黑顏色 this.style.backgroundColor = that.pieceColor[that.step % 2]; //寫入棋盤數組 that.pieceMapArr[m][n] = that.pieceColor[that.step % 2]; //歷史記錄位置 that.history.length = that.step; that.history.push({ m, n, color: that.pieceColor[that.step % 2] }); that.historyVal.push({ m, n, color: that.pieceColor[that.step % 2] }); that.stepHistory++ console.log(’this.history’, that.history); } else if (this.className == 'qz' && that.step % 2 != 0 && this.style.backgroundColor == '') { //下棋填充白顏色 this.style.backgroundColor = that.pieceColor[that.step % 2]; //寫入棋盤數組 that.pieceMapArr[m][n] = that.pieceColor[that.step % 2]; //歷史記錄位置 that.history.length = that.step; that.history.push({ m, n, color: that.pieceColor[that.step % 2] }); that.historyVal.push({ m, n, color: that.pieceColor[that.step % 2] }); that.stepHistory++ console.log(’this.history’, that.history); } //檢查當前是否贏了 for (var i = 0; i < 4; i++) { that.checkWin(m, n, that.pieceColor[that.step % 2], that.checkMode[i]); } that.step++; // console.log(’that.step’, that.step); } else { alert('不能落在有棋子的地方!'); return; } } else { // that.flag = true; alert('游戲結束,請重新開始~'); return; } } } } }, } }); </script> </body></html>

更多文章可以點擊《Vue.js前端組件學習教程》學習閱讀。

關于vue.js組件的教程,請大家點擊專題vue.js組件學習教程進行學習。

更多vue學習教程請閱讀專題《vue實戰教程》

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Vue
相關文章:
主站蜘蛛池模板: 桐城新闻网—桐城市融媒体中心主办 | 大功率金属激光焊接机价格_不锈钢汽车配件|光纤自动激光焊接机设备-东莞市正信激光科技有限公司 定制奶茶纸杯_定制豆浆杯_广东纸杯厂_[绿保佳]一家专业生产纸杯碗的厂家 | 岛津二手液相色谱仪,岛津10A液相,安捷伦二手液相,安捷伦1100液相-杭州森尼欧科学仪器有限公司 | 胃口福饺子加盟官网_新鲜现包饺子云吞加盟 - 【胃口福唯一官网】 | 真丝围巾|真丝丝巾|羊绒围巾|围巾品牌|浙江越缇围巾厂家定制 | 机械加工_绞车配件_立式离心机_减速机-洛阳三永机械厂 | 废气处理设备-工业除尘器-RTO-RCO-蓄热式焚烧炉厂家-江苏天达环保设备有限公司 | 蜜蜂职场文库_职场求职面试实用的范文资料大全 | 木材烘干机,木炭烘干机,纸管/佛香烘干设备-河南蓝天机械制造有限公司 | LINK FASHION 童装·青少年装展| 光环国际-新三板公司_股票代码:838504| 进口便携式天平,外校_十万分之一分析天平,奥豪斯工业台秤,V2000防水秤-重庆珂偌德科技有限公司(www.crdkj.com) | 法钢特种钢材(上海)有限公司 - 耐磨钢板、高强度钢板销售加工 阀门智能定位器_电液动执行器_气动执行机构-赫尔法流体技术(北京)有限公司 | 上海小程序开发-小程序制作-上海小程序定制开发公司-微信商城小程序-上海咏熠 | 热处理炉-退火炉-回火炉设备厂家-丹阳市电炉厂有限公司 | elisa试剂盒价格-酶联免疫试剂盒-猪elisa试剂盒-上海恒远生物科技有限公司 | 工业雾炮机_超细雾炮_远程抑尘射雾器-世纪润德环保设备 | 坏男孩影院-提供最新电影_动漫_综艺_电视剧_迅雷免费电影最新观看 | 北京普辉律师事务所官网_北京律师24小时免费咨询|法律咨询 | 电镀标牌_电铸标牌_金属标贴_不锈钢标牌厂家_深圳市宝利丰精密科技有限公司 | 清洁设备_洗地机/扫地机厂家_全自动洗地机_橙犀清洁设备官网 | 宽带办理,电信宽带,移动宽带,联通宽带,电信宽带办理,移动宽带办理,联通宽带办理 | 昆山新莱洁净应用材料股份有限公司-卫生级蝶阀,无菌取样阀,不锈钢隔膜阀,换向阀,离心泵 | CTP磁天平|小电容测量仪|阴阳极极化_双液系沸点测定仪|dsj电渗实验装置-南京桑力电子设备厂 | 热缩管切管机-超声波切带机-织带切带机-无纺布切布机-深圳市宸兴业科技有限公司 | 涂层测厚仪_漆膜仪_光学透过率仪_十大创新厂家-果欧电子科技公司 | 济南网站策划设计_自适应网站制作_H5企业网站搭建_济南外贸网站制作公司_锐尚 | 北京租车公司_汽车/客车/班车/大巴车租赁_商务会议/展会用车/旅游大巴出租_北京桐顺创业租车公司 | 沉降天平_沉降粒度仪_液体比重仪-上海方瑞仪器有限公司 | 品牌策划-品牌设计-济南之式传媒广告有限公司官网-提供品牌整合丨影视创意丨公关活动丨数字营销丨自媒体运营丨数字营销 | 玉米深加工设备|玉米加工机械|玉米加工设备|玉米深加工机械-河南成立粮油机械有限公司 | SMC-SMC电磁阀-日本SMC气缸-SMC气动元件展示网 | 爱佩恒温恒湿测试箱|高低温实验箱|高低温冲击试验箱|冷热冲击试验箱-您身边的模拟环境试验设备技术专家-合作热线:400-6727-800-广东爱佩试验设备有限公司 | PO膜_灌浆膜及地膜供应厂家 - 青州市鲁谊塑料厂 | 上海小程序开发-上海小程序制作公司-上海网站建设-公众号开发运营-软件外包公司-咏熠科技 | 行业分析:提及郑州火车站附近真有 特殊按摩 ?2025实地踩坑指南 新手如何避坑不踩雷 | 丽陂特官网_手机信号屏蔽器_Wifi信号干扰器厂家_学校考场工厂会议室屏蔽仪 | 2-羟基泽兰内酯-乙酰蒲公英萜醇-甘草查尔酮A-上海纯优生物科技有限公司 | 宁夏活性炭_防护活性炭_催化剂载体炭-宁夏恒辉活性炭有限公司 | 小型玉石雕刻机_家用玉雕机_小型万能雕刻机_凡刻雕刻机官网 | 东莞ERP软件_广州云ERP_中山ERP_台湾工厂erp系统-广东顺景软件科技有限公司 |