日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

VUE+Canvas實(shí)現(xiàn)簡(jiǎn)單五子棋游戲的全過(guò)程

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

在布局上,五子棋相比那些目標(biāo)是隨機(jī)運(yùn)動(dòng)的游戲,實(shí)現(xiàn)起來(lái)相對(duì)簡(jiǎn)單許多,思路也很清晰,總共分為:

(1)畫(huà)棋盤(pán);

(2)監(jiān)聽(tīng)點(diǎn)擊事件畫(huà)黑白棋子;

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

最復(fù)雜的恐怕就是如何判斷五子棋贏了,那么就先從簡(jiǎn)單的開(kāi)始,畫(huà)個(gè)棋盤(pán)吧~

1、畫(huà)棋盤(pán)

棋盤(pán)很簡(jiǎn)單,我們畫(huà)個(gè)15*15的棋盤(pán),橫線豎線相交錯(cuò):

drawCheckerboard() { // 畫(huà)棋盤(pán) 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); //垂直方向畫(huà)15根線,相距30px;_this.ctx.lineTo(15 + i * 30, 435);_this.ctx.stroke();_this.ctx.moveTo(15, 15 + i * 30); //水平方向畫(huà)15根線,相距30px;_this.ctx.lineTo(435, 15 + i * 30);_this.ctx.stroke(); _this.resultArr.push(new Array(15).fill(0)); }}

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

VUE+Canvas實(shí)現(xiàn)簡(jiǎn)單五子棋游戲的全過(guò)程

2、監(jiān)聽(tīng)點(diǎn)擊事件畫(huà)黑白棋子

好了,我們?cè)讷@取dom的時(shí)候順便監(jiān)聽(tīng)一下click事件,來(lái)畫(huà)棋子:

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) {// 點(diǎn)出界的return; } this.drawChess(x, y); if(this.winGame){this.drawResult();return; } this.whiteTurn = !this.whiteTurn; this.drawText();}

畫(huà)棋子的代碼:

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);}

很容易可以計(jì)算出點(diǎn)擊坐標(biāo)最近的那個(gè)棋盤(pán)交叉點(diǎn),當(dāng)然,如果那里已經(jīng)落了子,就得return。然后在交點(diǎn)處畫(huà)上白子或者黑子,這里用漸變填充使棋子看起來(lái)更像那么回事。接著,在對(duì)應(yīng)的二維數(shù)組里記錄一下棋子狀況:

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

VUE+Canvas實(shí)現(xiàn)簡(jiǎn)單五子棋游戲的全過(guò)程

3、檢查五子棋輸贏結(jié)果

輸贏結(jié)果怎么判斷?肉眼看去,無(wú)非就是以當(dāng)前落子為0,0原點(diǎn)建立坐標(biāo)系,然后判斷0°,180°,45°和135°四條線上是否有連續(xù)5子。相比于直接遍歷計(jì)數(shù),更好的方法就是取出四條線上的數(shù)據(jù),然后判斷是否有相連的5個(gè)1或者2字符。

假設(shè)我們落子的數(shù)組坐標(biāo)是[m, n]。

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

(2)豎線的結(jié)果數(shù)組字符串:

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

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

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

當(dāng)然這里面都是要判斷一下數(shù)組越界。

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

checkResult(m ,n){ // 判斷是否有5子相連 let _this = this; let checkStr = _this.whiteTurn ? CheckStrWhite : CheckStrBlack; // 取出[m,n]橫豎斜四條線的一維數(shù)組 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實(shí)現(xiàn)簡(jiǎn)單五子棋游戲的全過(guò)程

至此,一個(gè)簡(jiǎn)單的黑白棋游戲就做好了~~~~~

老規(guī)矩,源碼貼上:

<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: [] // 記錄棋子位置的數(shù)組 }; }, 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() { // 畫(huà)棋盤(pán) 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); //垂直方向畫(huà)15根線,相距30px;_this.ctx.lineTo(15 + i * 30, 435);_this.ctx.stroke();_this.ctx.moveTo(15, 15 + i * 30); //水平方向畫(huà)15根線,相距30px;棋盤(pán)為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]橫豎斜四條線的一維數(shù)組 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) {// 點(diǎn)出界的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>總結(jié)

到此這篇關(guān)于VUE+Canvas實(shí)現(xiàn)簡(jiǎn)單五子棋游戲的文章就介紹到這了,更多相關(guān)VUE+Canvas五子棋游戲內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Vue
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲精品伊人| 国产精品人人爽人人做我的可爱| 久久高清国产| 国产二区精品| 久久九九电影| 亚洲午夜黄色| 亚洲精品中文字幕乱码| 免费观看不卡av| 欧美成人高清| 日韩成人亚洲| 91精品一区二区三区综合在线爱| 日韩一区二区三区在线免费观看| 91精品亚洲| 国产一区白浆| 在线观看亚洲精品福利片| 亚洲一区av| 欧美久久香蕉| 国产日韩亚洲| 高清一区二区| 欧美一区二区三区高清视频| 狠狠操综合网| 亚洲午夜免费| 久久三级视频| 国产亚洲一区二区三区不卡| 久久高清免费观看| 精品久久久久中文字幕小说| 亚洲影院天堂中文av色| 亚洲综合三区| 亚洲综合福利| 国产aⅴ精品一区二区四区| 五月天久久网站| 蜜桃av一区| 精品视频在线你懂得| 国产精品午夜一区二区三区| 久久国产精品免费一区二区三区| 国产亚洲欧美日韩精品一区二区三区| 日韩极品在线观看| 国产精区一区二区| 国产精品亚洲欧美一级在线| 欧美日韩xxxx| 日本精品黄色| 亚洲男女av一区二区| 99国产精品| 午夜久久福利| 国内揄拍国内精品久久| 视频一区中文字幕精品| 蜜臀久久99精品久久久久久9 | 国产福利资源一区| 欧美+日本+国产+在线a∨观看| 久久精品资源| 亚洲午夜国产成人| 欧美aa国产视频| 久久久一二三| 精品资源在线| 秋霞影视一区二区三区| 日韩高清成人在线| 日韩中文字幕一区二区三区| 69精品国产久热在线观看| 亚洲激精日韩激精欧美精品| 国产精品国码视频| 久久av资源| 日韩一区二区三区四区五区| 国产偷自视频区视频一区二区| 新版的欧美在线视频| 中文字幕亚洲影视| 在线中文字幕播放| 亚洲精品少妇| 国产欧美久久一区二区三区| 国产福利资源一区| 日韩av专区| 国产精选在线| av亚洲在线观看| 国产视频一区欧美| 亚洲深深色噜噜狠狠爱网站| 岛国精品一区| 视频一区免费在线观看| 久久的色偷偷| 欧美在线观看视频一区| 国产伦精品一区二区三区千人斩 | 91精品xxx在线观看| 欧美日韩国产观看视频| 天堂久久av| 欧美日韩在线观看视频小说| 精品视频97| 噜噜噜久久亚洲精品国产品小说| 久久精品高清| 欧美黄页在线免费观看| 国产精品国产三级在线观看| 欧美激情另类| 激情久久五月| 国产精品jk白丝蜜臀av小说| 偷拍欧美精品| 久久久久免费| 日韩午夜视频在线| 亚洲二区三区不卡| 青青青国产精品| 亚洲三级欧美| 午夜日韩福利| 国产精品igao视频网网址不卡日韩| 五月激情久久| 国产精品2区| 亚洲精品字幕| 99久久99久久精品国产片果冰| 国产66精品| 国产日韩亚洲| 日韩国产欧美一区二区三区| 免费美女久久99| 日韩中文字幕一区二区三区| 日韩区欧美区| 日本精品国产| 青草久久视频| 亚洲丝袜啪啪| 精品国产三区在线| 激情综合自拍| 荡女精品导航| 免费毛片在线不卡| 国产伦久视频在线观看| 国产精品国码视频| 亚洲人成亚洲精品| 欧美日韩va| 综合精品一区| 99精品视频在线| 国产一区91| 蜜臀va亚洲va欧美va天堂| 国产一区一一区高清不卡| 亚洲综合在线电影| 蜜臀va亚洲va欧美va天堂| 中文字幕日本一区| 色天使综合视频| 国产精品v亚洲精品v日韩精品 | 精品黄色一级片| 麻豆精品新av中文字幕| 亚洲成人不卡| 国产一区二区三区91| 亚洲精品91| 欧美日本久久| 日韩在线视频精品| 久久亚洲不卡| 欧美xxxx性| 国产精品av久久久久久麻豆网| 亚洲欧洲美洲国产香蕉| 久久国产小视频| 日韩国产综合| 最新中文字幕在线播放| 欧美久久精品一级c片| 激情久久婷婷| 高清一区二区三区av| 精品一区av| 久久精品国产成人一区二区三区| 精品一区二区男人吃奶| 欧美日韩黑人| 久久亚洲国产| 欧美片网站免费| 91中文字幕精品永久在线| 久久99精品久久久野外观看| 国产不卡人人| 亚洲美女91| 久久激情网站| 尤物在线精品| 欧美日韩亚洲一区| 秋霞影院一区二区三区| 国产精品嫩草影院在线看| 一区二区三区四区日本视频| 日韩午夜av| 尤物tv在线精品| 国产欧美69| 91亚洲精品在看在线观看高清| 亚洲午夜国产成人| 在线亚洲成人| 午夜久久久久| 日韩一区精品视频| 亚州av日韩av| 美女国产一区| 亚洲国内精品| 日韩国产一二三区| 精品少妇av| 亚洲精品系列| 蜜桃精品在线| 黄色网一区二区| 99视频+国产日韩欧美| 中文一区在线| 国产美女撒尿一区二区| 久久国产亚洲| 久久一区二区三区喷水| 日韩一区二区三区在线看| 日本激情一区| 精品国产亚洲一区二区在线观看| 婷婷综合电影| 国产成人黄色| 综合激情婷婷| 国产欧洲在线| 影视先锋久久| 国产精品国码视频| 精品精品99| 免费的成人av| 九一成人免费视频| 国产伦精品一区二区三区在线播放| 国产日产一区| 激情综合网五月| 超碰在线99|