js canvas實現(xiàn)五子棋小游戲
本文實例為大家分享了canvas實現(xiàn)五子棋小游戲的具體代碼,供大家參考,具體內容如下
效果
思路
- canvans 繪制棋盤,繪制時候邊緣預留棋子位置
- 監(jiān)聽點擊事件繪制落子并記錄到字典中
- 獲勝判定,在四個方向上檢測是否有足夠數(shù)量的連貫棋子
代碼
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>ym</title> <style> canvas { display: block; margin: 0 auto; border: 0 } .result { text-align: center; } button{ display: block; margin: 0 auto; padding: 4px 20px; border:0; color: #fff; outline: none; border-radius: 3px; background: #43a6ff } button:hover{ font-weight: bold; cursor: pointer; } </style> </head> <body> <canvas id="cv" width="200px" height="200px"></canvas> <p class="result"></p> <button onclick="loadPanel(400, 400,30,13)">刷新</button> <script> loadPanel(400, 400,30,13); /** * 1) 點擊落子并切換執(zhí)子者 * 2)以當前落子位置為基準,以‘米'字型判定,是否能構成五連及以上 * @param w 棋盤寬度 * @param h 棋盤高度 * @param cs 格子尺寸 * @param ps 棋子半徑 */ function loadPanel(w, h, cs, ps) { let i, j, k; let chks = [[1, 0], [0, 1], [1, 1], [1, -1]];//水平,縱向,斜下,斜上 四個方向 let successNum = 5;//贏棋標準 let resultEl = document.querySelector('.result'); //1)繪制棋盤,邊緣應隔開棋子半徑的距離 cs = cs || 16;//默認格子寬高 ps = ps || 4;//棋子半徑 h = h || w;//高度默認等于寬度 let el = document.getElementById('cv'); el.setAttribute('width', w + 'px'); el.setAttribute('height', h + 'px'); let context = el.getContext("2d"); //計算棋盤分割,向下取整 let splitX = ~~((w - 2 * ps) / cs), splitY = ~~((h - 2 * ps) / cs); //初始化落子位置使用字典存儲,相較于數(shù)組簡單且減少內存占用 let pieces = {}; //循環(huán)劃線 context.translate(ps, ps); context.beginPath(); context.strokeStyle = '#000'; //垂直線 for (i = 0; i < splitX + 1; i++) { context.moveTo(cs * i, 0); context.lineTo(cs * i, splitY * cs); context.stroke(); } //水平線 for (j = 0; j < splitY + 1; j++) { context.moveTo(0, cs * j); context.lineTo(splitX * cs, cs * j); context.stroke(); } context.closePath(); let user = 0, colors = ['#000', '#fefefe']; el.addEventListener('click', function (e) { let x = e.offsetX, y = e.offsetY, //計算落子范圍 rx = ~~((x - ps) / cs) + (((x - ps) % cs <= cs / 2) ? 0 : 1), ry = ~~((y - ps) / cs) + (((y - ps) % cs <= cs / 2) ? 0 : 1); //繪制棋子 context.beginPath(); context.arc(cs * rx, cs * ry, ps, 2 * Math.PI, false); context.fillStyle = colors[user]; context.strokeStyle = '#000'; user ? user = 0 : user = 1;//切換執(zhí)子者 context.fill(); context.stroke(); context.closePath(); //記錄棋子位置 let piece = pieces[rx + '-' + ry] = user; //米字型計算結果,以當前落子位置計算是否存在某個方向上具有連續(xù)的五個相同棋子 for (j = 0; j < chks.length; j++) { let num = 1, chk = chks[j]; for (i = 1; i <= 4; i++) { if (pieces[(rx + chk[0] * i) + '-' + (ry + chk[1] * i)] == piece) { num++ } else { for (i = -1; i >= -4; i--) { if (pieces[(rx + chk[0] * i) + '-' + (ry + chk[1] * i)] == piece) { num++ } } break } } if (num == successNum) { resultEl.innerHTML = ['白', '黑'][user] + '方贏'; break; } } }) } </script> </body> </html>
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
用js實現(xiàn)的一個根據(jù)內容自動生成表格的函數(shù)
用js實現(xiàn)的一個根據(jù)內容自動生成表格的函數(shù)...2007-08-08從歷史講起JavaScript基因里的函數(shù)式編程實例
這篇文章主要為大家介紹了從歷史講起JavaScript基因里的函數(shù)式編程實例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-10-10ES6新特性二:Iterator(遍歷器)和for-of循環(huán)詳解
這篇文章主要介紹了ES6新特性二:Iterator(遍歷器)和for-of循環(huán),結合實例形式分析了ES6中Iterator(遍歷器)和for-of循環(huán)遍歷操作的相關實現(xiàn)技巧與注意事項,需要的朋友可以參考下2017-04-04js 按照指定間隔 向字符串中插入隨機字符串的實現(xiàn)代碼
看到論壇有人問,覺得有意思,就試著寫了一下。2010-03-03CutePsWheel javascript libary 控制輸入文本框為可使用滾輪控制的js庫
實現(xiàn)類似于Photoshop控制面板輸入文本數(shù)字的效果,所以名稱叫做PsWheel。用于控制輸入數(shù)字類型文本框實現(xiàn)鼠標滾輪上下滑動改變值,支持正整數(shù)、小數(shù)類型輸入文本。2010-02-02bootstrap3使用bootstrap datetimepicker日期插件
這篇文章主要為大家詳細介紹了bootstrap3中使用bootstrap datetimepicker日期插件的用法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-05-05JS插件plupload.js實現(xiàn)多圖上傳并顯示進度條
這篇文章主要為大家詳細介紹了PHP結合plupload.js JS插件實現(xiàn)多圖上傳并顯示進度條加刪除實例,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-11-11微信小程序實現(xiàn)分類菜單激活狀態(tài)隨列表滾動而自動切換效果詳解
這篇文章主要介紹了微信小程序分類菜單激活狀態(tài)跟隨列表滾動自動切換,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧2023-01-01