js canvas實(shí)現(xiàn)五子棋小游戲
本文實(shí)例為大家分享了canvas實(shí)現(xiàn)五子棋小游戲的具體代碼,供大家參考,具體內(nèi)容如下
效果

思路
- canvans 繪制棋盤(pán),繪制時(shí)候邊緣預(yù)留棋子位置
- 監(jiān)聽(tīng)點(diǎn)擊事件繪制落子并記錄到字典中
- 獲勝判定,在四個(gè)方向上檢測(cè)是否有足夠數(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) 點(diǎn)擊落子并切換執(zhí)子者
* 2)以當(dāng)前落子位置為基準(zhǔn),以‘米'字型判定,是否能構(gòu)成五連及以上
* @param w 棋盤(pán)寬度
* @param h 棋盤(pán)高度
* @param cs 格子尺寸
* @param ps 棋子半徑
*/
function loadPanel(w, h, cs, ps) {
let i, j, k;
let chks = [[1, 0], [0, 1], [1, 1], [1, -1]];//水平,縱向,斜下,斜上 四個(gè)方向
let successNum = 5;//贏棋標(biāo)準(zhǔn)
let resultEl = document.querySelector('.result');
//1)繪制棋盤(pán),邊緣應(yīng)隔開(kāi)棋子半徑的距離
cs = cs || 16;//默認(rèn)格子寬高
ps = ps || 4;//棋子半徑
h = h || w;//高度默認(rèn)等于寬度
let el = document.getElementById('cv');
el.setAttribute('width', w + 'px');
el.setAttribute('height', h + 'px');
let context = el.getContext("2d");
//計(jì)算棋盤(pán)分割,向下取整
let splitX = ~~((w - 2 * ps) / cs), splitY = ~~((h - 2 * ps) / cs);
//初始化落子位置使用字典存儲(chǔ),相較于數(shù)組簡(jiǎn)單且減少內(nèi)存占用
let pieces = {};
//循環(huán)劃線(xiàn)
context.translate(ps, ps);
context.beginPath();
context.strokeStyle = '#000';
//垂直線(xiàn)
for (i = 0; i < splitX + 1; i++) {
context.moveTo(cs * i, 0);
context.lineTo(cs * i, splitY * cs);
context.stroke();
}
//水平線(xiàn)
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,
//計(jì)算落子范圍
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;
//米字型計(jì)算結(jié)果,以當(dāng)前落子位置計(jì)算是否存在某個(gè)方向上具有連續(xù)的五個(gè)相同棋子
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>
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
用js實(shí)現(xiàn)的一個(gè)根據(jù)內(nèi)容自動(dòng)生成表格的函數(shù)
用js實(shí)現(xiàn)的一個(gè)根據(jù)內(nèi)容自動(dòng)生成表格的函數(shù)...2007-08-08
從歷史講起JavaScript基因里的函數(shù)式編程實(shí)例
這篇文章主要為大家介紹了從歷史講起JavaScript基因里的函數(shù)式編程實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10
ES6新特性二:Iterator(遍歷器)和for-of循環(huán)詳解
這篇文章主要介紹了ES6新特性二:Iterator(遍歷器)和for-of循環(huán),結(jié)合實(shí)例形式分析了ES6中Iterator(遍歷器)和for-of循環(huán)遍歷操作的相關(guān)實(shí)現(xiàn)技巧與注意事項(xiàng),需要的朋友可以參考下2017-04-04
js 按照指定間隔 向字符串中插入隨機(jī)字符串的實(shí)現(xiàn)代碼
看到論壇有人問(wèn),覺(jué)得有意思,就試著寫(xiě)了一下。2010-03-03
CutePsWheel javascript libary 控制輸入文本框?yàn)榭墒褂脻L輪控制的js庫(kù)
實(shí)現(xiàn)類(lèi)似于Photoshop控制面板輸入文本數(shù)字的效果,所以名稱(chēng)叫做PsWheel。用于控制輸入數(shù)字類(lèi)型文本框?qū)崿F(xiàn)鼠標(biāo)滾輪上下滑動(dòng)改變值,支持正整數(shù)、小數(shù)類(lèi)型輸入文本。2010-02-02
bootstrap3使用bootstrap datetimepicker日期插件
這篇文章主要為大家詳細(xì)介紹了bootstrap3中使用bootstrap datetimepicker日期插件的用法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05
JS插件plupload.js實(shí)現(xiàn)多圖上傳并顯示進(jìn)度條
這篇文章主要為大家詳細(xì)介紹了PHP結(jié)合plupload.js JS插件實(shí)現(xiàn)多圖上傳并顯示進(jìn)度條加刪除實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-11-11
微信小程序?qū)崿F(xiàn)分類(lèi)菜單激活狀態(tài)隨列表滾動(dòng)而自動(dòng)切換效果詳解
這篇文章主要介紹了微信小程序分類(lèi)菜單激活狀態(tài)跟隨列表滾動(dòng)自動(dòng)切換,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2023-01-01
詳解如何在 JavaScript 中使用三元運(yùn)算符
這篇文章主要為大家介紹了詳解如何在 JavaScript 中使用三元運(yùn)算符示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10
簡(jiǎn)單實(shí)現(xiàn)Bootstrap標(biāo)簽頁(yè)
這篇文章主要教大家簡(jiǎn)單實(shí)現(xiàn)Bootstrap標(biāo)簽頁(yè),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-12-12

