成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

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

VUE+Canvas實現簡單五子棋游戲的全過程

瀏覽:33日期:2022-09-30 09:36:47
前言

在布局上,五子棋相比那些目標是隨機運動的游戲,實現起來相對簡單許多,思路也很清晰,總共分為:

(1)畫棋盤;

(2)監聽點擊事件畫黑白棋子;

(3)每次落子之后判斷是否有5子相連,有則贏。

最復雜的恐怕就是如何判斷五子棋贏了,那么就先從簡單的開始,畫個棋盤吧~

1、畫棋盤

棋盤很簡單,我們畫個15*15的棋盤,橫線豎線相交錯:

drawCheckerboard() { // 畫棋盤 let _this = this; _this.ctx.beginPath(); _this.ctx.fillStyle = '#fff'; _this.ctx.rect(0, 0, 450, 450); _this.ctx.fill(); for (var i = 0; i < 15; i++) {_this.ctx.beginPath();_this.ctx.strokeStyle = '#D6D1D1';_this.ctx.moveTo(15 + i * 30, 15); //垂直方向畫15根線,相距30px;_this.ctx.lineTo(15 + i * 30, 435);_this.ctx.stroke();_this.ctx.moveTo(15, 15 + i * 30); //水平方向畫15根線,相距30px;_this.ctx.lineTo(435, 15 + i * 30);_this.ctx.stroke(); _this.resultArr.push(new Array(15).fill(0)); }}

先用一個450 * 450 的正方形打底,四周留15寬度的空白,然后畫上間隔為30的線。在for循環里,我們還初始化了一個15 * 15的二維數組,并全部填上0,沒錯,就是記錄落子的。

VUE+Canvas實現簡單五子棋游戲的全過程

2、監聽點擊事件畫黑白棋子

好了,我們在獲取dom的時候順便監聽一下click事件,來畫棋子:

let container = document.getElementById('gobang');

container.addEventListener('click', _this.handleClick);

handleClick(event) { let x = event.offsetX - 70; let y = event.offsetY - 70; if (x < 15 || x > 435 || y < 15 || y > 435) {// 點出界的return; } this.drawChess(x, y); if(this.winGame){this.drawResult();return; } this.whiteTurn = !this.whiteTurn; this.drawText();}

畫棋子的代碼:

drawChess(x, y) { let _this = this; let xLine = Math.round((x - 15) / 30); // 豎線第x條 let yLine = Math.round((y - 15) / 30); // 橫線第y條 if(_this.resultArr[xLine][yLine] !== 0){return; } let grd = _this.ctx.createRadialGradient(xLine * 30 + 15,yLine * 30 + 15,4,xLine * 30 + 15,yLine * 30 + 15,10 ); grd.addColorStop(0, _this.whiteTurn ? '#fff' : '#4c4c4c'); grd.addColorStop(1, _this.whiteTurn ? '#dadada' : '#000'); _this.ctx.beginPath(); _this.ctx.fillStyle = grd; _this.ctx.arc(xLine * 30 + 15,yLine * 30 + 15,10,0,2 * Math.PI,false ); _this.ctx.fill(); _this.ctx.closePath(); _this.setResultArr(xLine, yLine); _this.checkResult(xLine, yLine);}

很容易可以計算出點擊坐標最近的那個棋盤交叉點,當然,如果那里已經落了子,就得return。然后在交點處畫上白子或者黑子,這里用漸變填充使棋子看起來更像那么回事。接著,在對應的二維數組里記錄一下棋子狀況:

setResultArr(m, n) { let _this = this; _this.resultArr[m][n] = _this.whiteTurn ? 1 : 2; // 白棋為1;黑棋為2 }

VUE+Canvas實現簡單五子棋游戲的全過程

3、檢查五子棋輸贏結果

輸贏結果怎么判斷?肉眼看去,無非就是以當前落子為0,0原點建立坐標系,然后判斷0°,180°,45°和135°四條線上是否有連續5子。相比于直接遍歷計數,更好的方法就是取出四條線上的數據,然后判斷是否有相連的5個1或者2字符。

假設我們落子的數組坐標是[m, n]。

(1)橫線的結果數組字符串:this.resultArr[m].join(’’);

(2)豎線的結果數組字符串:

for(let i = 0; i<15; i++){lineHorizontal.push(_this.resultArr[i][n]);}

(3)135°(左上到右下):j從0-15,分別取this.resultArr[m - j][n -j]結果unshift進臨時數組頭部,取this.resultArr[m + j][n + j]放到臨時數組尾部,行成結果;

(4)45°(左下到右上):j從0-15,分別取this.resultArr[m + j][n -j]結果unshift進臨時數組頭部,取this.resultArr[m - j][n + j]放到臨時數組尾部,行成結果;

當然這里面都是要判斷一下數組越界。

得到結果字符串后,我們判斷是否有“22222”或者“11111”這樣的字符串存在,有則說明勝利。

checkResult(m ,n){ // 判斷是否有5子相連 let _this = this; let checkStr = _this.whiteTurn ? CheckStrWhite : CheckStrBlack; // 取出[m,n]橫豎斜四條線的一維數組 let lineVertical = _this.resultArr[m].join(’’); if(lineVertical.indexOf(checkStr) > -1){_this.winGame = true;return; } let lineHorizontal = []; for(let i = 0; i<15; i++){lineHorizontal.push(_this.resultArr[i][n]); } lineHorizontal = lineHorizontal.join(’’); if(lineHorizontal.indexOf(checkStr) > -1){_this.winGame = true;return; } let line135 = []; for(let j = 0; j < 15; j++){if(m - j >= 0 && n - j >= 0){ // 左上角 line135.unshift(_this.resultArr[m - j][n -j]);}if(j > 0 && m + j < 15 && n + j < 15){ // 右下角 line135.push(_this.resultArr[m + j][n + j]);} } line135 = line135.join(’’); if(line135.indexOf(checkStr) > -1){_this.winGame = true;return; } let line45 = []; for(let j = 0; j < 15; j++){if(m + j < 15 && n - j >= 0){ // 右上角 line45.unshift(_this.resultArr[m + j][n -j]);}if(j > 0 && m - j >=0 && n + j < 15){ // 左下角 line45.push(_this.resultArr[m - j][n + j]);} } line45 = line45.join(’’); if(line45.indexOf(checkStr) > -1){_this.winGame = true;return; }}

最后勝出,我們顯示一下是哪方獲勝。

VUE+Canvas實現簡單五子棋游戲的全過程

至此,一個簡單的黑白棋游戲就做好了~~~~~

老規矩,源碼貼上:

<template> <div class='gobang'> <canvas height='600'></canvas> </div></template> <script>const CheckStrWhite = '11111';const CheckStrBlack = '22222';export default { name: 'Gobang', data() { return { ctx: null, winGame: false, whiteTurn: false, // 白棋輪;true-黑棋輪 resultArr: [] // 記錄棋子位置的數組 }; }, mounted() { let _this = this; let container = document.getElementById('gobang'); container.addEventListener('click', _this.handleClick); _this.ctx = container.getContext('2d'); _this.ctx.translate(70,70); _this.drawCheckerboard(); }, computed:{ chessText(){ return this.whiteTurn ? ’白棋’ : ’黑棋’; } }, methods: { drawCheckerboard() { // 畫棋盤 let _this = this; _this.ctx.beginPath(); _this.ctx.fillStyle = '#fff'; _this.ctx.rect(0, 0, 450, 450); _this.ctx.fill(); for (var i = 0; i < 15; i++) {_this.ctx.beginPath();_this.ctx.strokeStyle = '#D6D1D1';_this.ctx.moveTo(15 + i * 30, 15); //垂直方向畫15根線,相距30px;_this.ctx.lineTo(15 + i * 30, 435);_this.ctx.stroke();_this.ctx.moveTo(15, 15 + i * 30); //水平方向畫15根線,相距30px;棋盤為14*14;_this.ctx.lineTo(435, 15 + i * 30);_this.ctx.stroke(); _this.resultArr.push(new Array(15).fill(0)); } _this.drawText(); }, drawChess(x, y) { let _this = this; let xLine = Math.round((x - 15) / 30); // 豎線第x條 let yLine = Math.round((y - 15) / 30); // 橫線第y條 if(_this.resultArr[xLine][yLine] !== 0){return; } let grd = _this.ctx.createRadialGradient(xLine * 30 + 15,yLine * 30 + 15,4,xLine * 30 + 15,yLine * 30 + 15,10 ); grd.addColorStop(0, _this.whiteTurn ? '#fff' : '#4c4c4c'); grd.addColorStop(1, _this.whiteTurn ? '#dadada' : '#000'); _this.ctx.beginPath(); _this.ctx.fillStyle = grd; _this.ctx.arc(xLine * 30 + 15,yLine * 30 + 15,10,0,2 * Math.PI,false ); _this.ctx.fill(); _this.ctx.closePath(); _this.setResultArr(xLine, yLine); _this.checkResult(xLine, yLine); }, setResultArr(m, n) { let _this = this; _this.resultArr[m][n] = _this.whiteTurn ? 1 : 2; // 白棋為1;黑棋為2 },checkResult(m ,n){ // 判斷是否有5子相連 let _this = this; let checkStr = _this.whiteTurn ? CheckStrWhite : CheckStrBlack; // 取出[m,n]橫豎斜四條線的一維數組 let lineVertical = _this.resultArr[m].join(’’); if(lineVertical.indexOf(checkStr) > -1){_this.winGame = true;return; } let lineHorizontal = []; for(let i = 0; i<15; i++){lineHorizontal.push(_this.resultArr[i][n]); } lineHorizontal = lineHorizontal.join(’’); if(lineHorizontal.indexOf(checkStr) > -1){_this.winGame = true;return; } let line135 = []; for(let j = 0; j < 15; j++){if(m - j >= 0 && n - j >= 0){ // 左上角 line135.unshift(_this.resultArr[m - j][n -j]);}if(j > 0 && m + j < 15 && n + j < 15){ // 右下角 line135.push(_this.resultArr[m + j][n + j]);} } line135 = line135.join(’’); if(line135.indexOf(checkStr) > -1){_this.winGame = true;return; } let line45 = []; for(let j = 0; j < 15; j++){if(m + j < 15 && n - j >= 0){ // 右上角 line45.unshift(_this.resultArr[m + j][n -j]);}if(j > 0 && m - j >=0 && n + j < 15){ // 左下角 line45.push(_this.resultArr[m - j][n + j]);} } line45 = line45.join(’’); if(line45.indexOf(checkStr) > -1){_this.winGame = true;return; } }, drawText(){ let _this = this; _this.ctx.clearRect(435 + 60, 0, 100, 70); _this.ctx.fillStyle = '#fff'; _this.ctx.font='20px Arial'; _this.ctx.fillText(’本輪:’ + _this.chessText, 435 + 70, 35); }, drawResult(){ let _this = this; _this.ctx.fillStyle = '#ff2424'; _this.ctx.font='20px Arial'; _this.ctx.fillText(_this.chessText+’勝!’, 435 + 70, 70); }, handleClick(event) { let x = event.offsetX - 70; let y = event.offsetY - 70; if (x < 15 || x > 435 || y < 15 || y > 435) {// 點出界的return; } this.drawChess(x, y); if(this.winGame){this.drawResult();return; } this.whiteTurn = !this.whiteTurn; this.drawText(); } }};</script> <!-- Add 'scoped' attribute to limit CSS to this component only --><style scoped lang='scss'>.gobang { #gobang { background: #2a4546; }}</style>總結

到此這篇關于VUE+Canvas實現簡單五子棋游戲的文章就介紹到這了,更多相關VUE+Canvas五子棋游戲內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Vue
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
欧美一区二区三区的| 亚洲一区av在线| 91亚洲国产成人精品一区二区三 | 日韩国产在线观看| 久久亚洲综合色一区二区三区| 久久精品亚洲一区二区| av电影在线不卡| 亚洲一区二区三区激情| 精品久久国产字幕高潮| 91久久精品一区二区三区| 欧美高清一区| 韩国精品在线观看| 怡红院av一区二区三区| 久久精品这里都是精品| 欧美猛男gaygay网站| 国产日本精品| 91视频91自| 国产在线精品国自产拍免费| 一区二区在线观看视频| 国产色产综合色产在线视频| 欧美一区三区二区| 久久亚洲综合网| 亚洲婷婷在线| 99久久婷婷国产综合精品| 奇米影视7777精品一区二区| 亚洲美女淫视频| 久久久精品2019中文字幕之3| 欧美喷潮久久久xxxxx| 美女黄网久久| 亚洲激情午夜| 欧美另类视频| 成人不卡免费av| 国产中文一区二区三区| 三级不卡在线观看| 一区二区三区免费观看| 国产精品拍天天在线| 精品国产伦一区二区三区免费 | 青青草国产精品亚洲专区无| 亚洲欧美视频在线观看视频| 久久网站最新地址| 91麻豆精品国产自产在线| 久久最新视频| 亚洲视频成人| 亚洲午夜av| 色综合色狠狠天天综合色| 国产精品一区在线观看乱码| 日韩精品成人一区二区三区| 亚洲美女视频一区| 中文字幕成人在线观看| 亚洲精品在线电影| 欧美一二三区精品| 欧美亚洲图片小说| 久久精品综合| 在线综合欧美| 亚洲激情一区二区三区| 欧美精品免费观看二区| gogogo免费视频观看亚洲一| 激情伊人五月天久久综合| 午夜精品久久久久久久蜜桃app| 亚洲影院久久精品| 亚洲欧美自拍偷拍色图| 中文字幕欧美日本乱码一线二线| 久久久久88色偷偷免费| 久久久久久久久久久久电影| 精品91自产拍在线观看一区| 精品精品国产高清a毛片牛牛| 欧美一区二区三区思思人| 欧美色大人视频| 在线观看欧美精品| 欧美专区在线观看一区| 在线观看视频一区二区欧美日韩| 在线免费一区三区| 日本国产一区二区| 一本一本久久a久久精品综合麻豆 一本一道波多野结衣一区二区 | 激情综合在线| 欧美午夜一区| 欧美日韩一区自拍| 国产精品xvideos88| 国内久久视频| 亚洲国产婷婷香蕉久久久久久99| 精品999成人| 91久久久一线二线三线品牌| 亚洲国产免费看| 在线精品亚洲| 欧美国产精品一区二区三区| 国产一区二区在线电影| 久久精品国内一区二区三区| 日韩二区三区在线观看| 日韩精品视频网| 天天综合天天综合色| 日韩主播视频在线| 丝袜a∨在线一区二区三区不卡| 亚洲成人精品在线观看| 视频在线在亚洲| 美日韩黄色大片| 国产一区二区中文字幕| 风间由美性色一区二区三区| yourporn久久国产精品| 欧美成人69| 欧美日韩精品综合| 国内精品**久久毛片app| 亚洲第一网站| 一本一本久久| 久久久久久精| 欧美亚洲日本一区| 欧美一级一区二区| 亚洲精品在线免费播放| 国产精品欧美久久久久无广告| 亚洲视频综合在线| 亚洲国产wwwccc36天堂| 欧美aⅴ一区二区三区视频| 国内成人精品2018免费看| 国产精品18久久久久久久久 | 欧美最猛黑人xxxxx猛交| 久久久久一区二区三区| 欧美色爱综合网| 欧美一区二视频| 久久久九九九九| 亚洲欧洲韩国日本视频| 亚洲高清一区二区三区| 美女在线观看视频一区二区| 国产成人免费在线视频| 欧美bbbxxxxx| 影音先锋亚洲电影| 久久精品成人| 7777精品伊人久久久大香线蕉| 欧美精品一区在线观看| 中文字幕在线观看一区二区| 亚洲成人免费看| 国产一区 二区 三区一级| 99久久99精品久久久久久| 欧美一区二区三区四区五区| 一区在线播放视频| 樱花草国产18久久久久| 日韩高清欧美激情| 国产精品亚洲成人| 欧美精品二区| 国产精品久久久久久久免费软件| 欧亚一区二区三区| 亚洲精品一区二区三区精华液 | 热久久一区二区| 国产91精品精华液一区二区三区| 色综合咪咪久久| 亚洲专区欧美专区| 欧美一区二区三区在线电影| 欧美国产欧美综合| 天天操天天色综合| 成人国产亚洲欧美成人综合网| 亚洲国产精品www| 欧美中文字幕久久| 国产亚洲欧美日韩俺去了| 亚洲一区二区美女| 国产麻豆视频精品| 国内一区二区三区在线视频| 色婷婷av一区二区三区之一色屋| 精品免费国产一区二区三区四区| 亚洲视频香蕉人妖| 韩国av一区二区三区四区| 欧美日韩亚洲三区| 欧美自拍丝袜亚洲| 国产精品视频观看| 蜜桃视频在线一区| 欧美日韩一区在线播放| 在线观看一区二区精品视频| 久久精品一区二区| 日本91福利区| 欧美精品亚洲| 欧美三日本三级三级在线播放| 欧美国产日韩a欧美在线观看| 免费观看在线色综合| 欧美成人在线免费观看| 久久久av水蜜桃| 久久久久久久久99精品| 日韩制服丝袜av| 99re成人精品视频| 色哟哟日韩精品| 国产偷国产偷精品高清尤物| 日韩国产欧美三级| 国产精品对白刺激久久久| 精品视频全国免费看| 综合中文字幕亚洲| 国产不卡高清在线观看视频| 一本综合精品| 精品对白一区国产伦| 国产精品一区一区三区| 91女神在线视频| 香蕉久久夜色精品国产| 精品少妇一区二区三区免费观看| 亚洲一区二区影院| 9i看片成人免费高清| 色婷婷精品大在线视频| 国产精品久久久久久户外露出| 久久99蜜桃精品| 国产一区视频观看| 欧美一级高清片在线观看| 亚洲国产色一区| 欧美在线一二三区| 欧美日韩久久不卡| 亚洲一二三专区| 欧美日韩三区|