js五子棋效果

news/2024/10/24 16:27:12/文章来源:https://www.cnblogs.com/nianzhilian/p/18499840

任务分解

一、绘制棋盘

二、绑定事件

1、先计算出需要绘制棋子的坐标 即将来绘制的棋子在哪个单元格内

2、绘制棋子 首先判断棋子是否存在 应该添加到哪个单元格内,分四种情况:

1.1 正常情况  

1.2 最右侧 超出边界只能放在最后一个单元格内 

1.3 左下侧 超出边界只能放在最后一个单元格内

1.4 右下侧 超出边界只能放在最后一个单元格内

3、当5个连续的棋子一样就算赢了 游戏结束 处理结束的逻辑  五个连续的需要处理四种情况:

1.1 横向的5个连续相同的棋子

1.2 竖着的5个连续相同的棋子

1.3 二个斜着的5个连续相同的棋子

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><link rel="stylesheet" href="./css/index.css">
</head>
<body><div class="container"><table class="chessboard"></table></div><script src="./js/index.js"></script>
</body>
</html>

 

*{/* margin: 0;padding: 0; */
}
.container{width: 500px;height: 500px;border: 1px solid #ccc;background-color: bisque;margin: 30px auto;display: flex;justify-content: center;align-items: center;
}
.chessboard{border-collapse: collapse;border-spacing: 0;width: 94%;height: 94%;
}
.chessboard td{border: 1px solid #000;position: relative;
}
.chess{position: absolute;top: -50%;left: -50%;width: 80%;height: 80%;background-color: lightgrey;border-radius: 50%;color: lightgrey;font-size: 12px;font-weight: bold;/* 弹性盒文字居中 */display: flex;align-items: center;justify-content: center;
}
.white{background: #fff;
}
.blackc{background-color: #000;
}
.win{border: 1px solid red;box-shadow: 0 0 3px 2px red;
}

 

function $(selector) {return document.querySelector(selector);
}function $$(selector) {return document.querySelectorAll(selector);
}
var chessboard = document.querySelector('.chessboard');
var whichOne = "white";
//生成的最大范围区间
var sectionNum = 14;
//是否结束
var isGameOver = false;
var chessArr = [];
function initChessboard() {var tableContent = '';for (var i = 0; i < sectionNum; i++) {var row = `<tr>`;for (var j = 0; j < sectionNum; j++) {row += `<td data-row="${i}" data-line="${j}"></td>`;}row += '</tr>';tableContent += row;}chessboard.innerHTML = tableContent;
}
//offsetLeft 一个元素相对于父元素的的水平偏移量
function bindEvent() {chessboard.addEventListener('click', function (e) {console.log(e);if (!isGameOver) {var temp = Object.assign({}, e.target.dataset);if (e.target.nodeName === 'TD') {//首先判断点击的td 所处的坐标  (从而计算出 棋子在哪个单元格)//比较鼠标点击的位置 与单元格的一半哪个大哪个小 从而计算出棋子是在当前单元格还是在下一个单元格内//求出单元格的宽高var tdw = chessboard.clientWidth * 0.94 / sectionNum;//比一半小则保留当前在当前单元格内//比一半大则保留在下一个单元格内var positionX = e.offsetX > tdw / 2;var positionY = e.offsetY > tdw / 2;//计算出棋子的坐标 也就是在哪个单元格内var chessPoint = {x: positionX ? parseInt(temp.line) + 1 : parseInt(temp.line),y: positionY ? parseInt(temp.row) + 1 : parseInt(temp.row),c: whichOne}//绘制棋子chessMove(chessPoint);}} else {//结束了是否要重新开始if (window.confirm('恭喜你赢了,是否要重新开始?')) {//重新开始 重新绘制 数组置空isGameOver = false;initChessboard();chessArr = [];}}})
}function chessMove(chessPoint) {//检测棋子已经绘制 在点击到当前范围内不在绘制棋子//判断棋子是否已经存在if (exist(chessPoint) && !isGameOver) {//绘制棋子 就是将div添加到单元格内var newDiv = `<div class="chess ${chessPoint.c}" data-row="${chessPoint.y}" data-line="${chessPoint.x}">`;chessArr.push(chessPoint);//添加到哪个单元格内分四种情况 (处理边界条件)//正常情况if (chessPoint.x < 14 && chessPoint.y < 14) {var tdP = $(`td[data-row='${chessPoint.y}'][data-line='${chessPoint.x}']`);console.log(tdP)tdP.innerHTML += newDiv;}//最右侧 超出边界只能放在最后一个单元格内if (chessPoint.x === 14 && chessPoint.y < 14) {var tdP = $(`td[data-row='${chessPoint.y}'][data-line='${chessPoint.x - 1}']`);tdP.innerHTML += newDiv;tdP.lastChild.style.left = '50%';}//左下侧 超出边界只能放在最后一个单元格内if (chessPoint.x < 14 && chessPoint.y === 14) {var tdP = $(`td[data-row='${chessPoint.y - 1}'][data-line='${chessPoint.x}']`);tdP.innerHTML += newDiv;tdP.lastChild.style.top = '50%';}//右下侧 超出边界只能放在最后一个单元格内if (chessPoint.x === 14 && chessPoint.y === 14) {var tdP = $(`td[data-row='${chessPoint.y - 1}'][data-line='${chessPoint.x - 1}']`);tdP.innerHTML += newDiv;tdP.lastChild.style.left = '50%';tdP.lastChild.style.top = '50%';}whichOne = whichOne === 'white' ? 'blackc' : 'white';}//判断游戏是否结束checker()
}function exist(chessPoint) {var res = chessArr.find(function (item) {return item.x === chessPoint.x && item.y === chessPoint.y && item.c === chessPoint.c})return res === undefined ? true : false;
}function checker() {console.log(chessArr);for (var i = 0; i < chessArr.length; i++) {var chess = chessArr[i];var chess2, chess3, chess4, chess5;//处理边界条件  5个连续的 分四种情况//连续横着的chess2 = chessArr.find(function (item) {return chess.x === item.x + 1 && chess.y === item.y && chess.c === item.c;});chess3 = chessArr.find(function (item) {return chess.x === item.x + 2 && chess.y === item.y && chess.c === item.c;});chess4 = chessArr.find(function (item) {return chess.x === item.x + 3 && chess.y === item.y && chess.c === item.c;});chess5 = chessArr.find(function (item) {return chess.x === item.x + 4 && chess.y === item.y && chess.c === item.c;});if (chess2 && chess3 && chess4 && chess5) {end(chess, chess2, chess3, chess4, chess5);}//连续竖着的chess2 = chessArr.find(function (item) {return chess.y === item.y + 1 && chess.x === item.x && chess.c === item.c;})chess3 = chessArr.find(function (item) {return chess.y === item.y + 2 && chess.x === item.x && chess.c === item.c;})chess4 = chessArr.find(function (item) {return chess.y === item.y + 3 && chess.x === item.x && chess.c === item.c;})chess5 = chessArr.find(function (item) {return chess.y === item.y + 4 && chess.x === item.x && chess.c === item.c;})if (chess2 && chess3 && chess4 && chess5) {end(chess, chess2, chess3, chess4, chess5);}//连续斜着的chess2 = chessArr.find(function (item) {return chess.x === item.x + 1 && chess.y === item.y + 1 && chess.c === item.c;});chess3 = chessArr.find(function (item) {return chess.x === item.x + 2 && chess.y === item.y + 2 && chess.c === item.c;});chess4 = chessArr.find(function (item) {return chess.x === item.x + 3 && chess.y === item.y + 3 && chess.c === item.c;});chess5 = chessArr.find(function (item) {return chess.x === item.x + 4 && chess.y === item.y + 4 && chess.c === item.c;});if (chess2 && chess3 && chess4 && chess5) {end(chess, chess2, chess3, chess4, chess5);}//反斜着的chess2 = chessArr.find(function (item) {return chess.x === item.x - 1 && chess.y === item.y + 1 && chess.c === item.c;});chess3 = chessArr.find(function (item) {return chess.x === item.x - 2 && chess.y === item.y + 2 && chess.c === item.c;});chess4 = chessArr.find(function (item) {return chess.x === item.x - 3 && chess.y === item.y + 3 && chess.c === item.c;});chess5 = chessArr.find(function (item) {return chess.x === item.x - 4 && chess.y === item.y + 4 && chess.c === item.c;});if (chess2 && chess3 && chess4 && chess5) {end(chess, chess2, chess3, chess4, chess5);}}
}function end() {if (!isGameOver) {isGameOver = true;//结束之后显示棋子的顺序for (var i = 0; i < chessArr.length; i++) {$(`div[data-row='${chessArr[i].y}'][data-line='${chessArr[i].x}']`).innerHTML = i + 1;}//给胜利的棋子加高亮显示for (var j = 0; j < arguments.length; j++) {console.dir($(`div[data-row='${arguments[j].y}'][data-line='${arguments[j].x}']`))$(`div[data-row='${arguments[j].y}'][data-line='${arguments[j].x}']`).classList.add('win');}}
}function main() {//初始化棋盘initChessboard();//绑定监听事件bindEvent();
}
main();

  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/821231.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux内存泄露案例分析和内存管理分享

一、问题 近期我们运维同事接到线上LB(负载均衡)服务内存报警,运维同事反馈说LB集群有部分机器的内存使用率超过80%,有的甚至超过90%,而且内存使用率还再不停的增长。接到内存报警的消息,让整个团队都比较紧张,我们团队负责的LB服务是零售、物流、科技等业务服务的流量入…

使用FileBrowser搭建文件服务

1、下载安装步骤参考 2、用户管理参考,配置参考 3、部署为windows服务参考 4、源码及下载github 使用场景:管理自己的文件,或者小团队内部文档管理等。hello,world~~~

jQuery解决变量冲突

◼ 和 jQuery库一样,许多JavaScript库也会使用 $ 作为函数名或变量名。 在 jQuery 中,$ 是jQuery的别名。 如果我们在使用jQuery库之前,其它库已经使用了 $ 函数或者变量,这时就会出现冲突的情况。 这时我们可以通过调用jQuery中的noConflict函数来解决冲突问题。 …

(系列九)使用Vue3+Element Plus创建前端框架(附源码)

说明该文章是属于OverallAuth2.0系列文章,每周更新一篇该系列文章(从0到1完成系统开发)。该系统文章,我会尽量说的非常详细,做到不管新手、老手都能看懂。说明:OverallAuth2.0 是一个简单、易懂、功能强大的权限+可视化流程管理系统。 友情提醒:本篇文章是属于系列文章,…

速来围观!天翼云荣誉墙上新!

近日,由中国通信标准化协会主办、中国信息通信研究院承办、中国通信企业协会支持的“2024数字化转型发展大会”在北京召开。大会现场为第三届“鼎新杯”数字化转型应用优秀案例获奖单位颁发证书,天翼云荣获多个奖项,其中,《天翼云全流程数字化转型支撑量质并重规模发展》等…

团队练习记录2024.10.23

比赛链接:https://codeforces.com/gym/104976 D.Operator Precedence队友解的,想办法让第二个式子中括号内数值为1,所以就2,-1交替,最后一个选1可逆推,第一个为2*n-3 #include<iostream> #include<queue> #include<map> #include<set> #include&…

debian libc.musl-x86_64.so.1 = not found

apt-get install musl-devln -s /usr/lib/x86_64-linux-musl/libc.so /lib/libc.musl-x86_64.so.1

MySQL 复习(一):建表约束

MySQL 复习(一):建表约束@目录MySQL 复习(一):建表约束1. 主键约束1.1 添加主键约束1.1.1 建表前添加主键约束1.1.2 建表后添加主键约束1.2 删除主键约束2. 外键约束2.1 添加外键约束2.1.1 建表前添加外键约束2.1.2 建表后添加外键约束2.2 删除外键约束3. 自增约束…

[模板引擎/文本渲染引擎] Jinjia2重要特性的使用指南

1 使用指南 CASE 为变量设置默认值private final static Jinjava JINJAVA = new Jinjava();/** 为变量设置默认值 | 共计 3 种方法 **/@Testpublic void defaultValueTest(){//{{ variable|default(default_value) }}// my_dict是一个字典,其中只有一个键值对。在模板中访问 …

Docker常用命令记录(随时更新)

docker 使用命令记录Docker 常用命令 镜像操作保存镜像为tar包 docker save -o <文件名>.tar <镜像名>:<版本号>例如: docker save -o myimage.tar myimage:latest从tar包加载镜像 docker load -i <文件名>.tar例如: docker load -i myimage.tar查看…

强化学习的数学原理-03贝尔曼最优公式

目录最优策略和公式推导右侧最优化问题公式求解以及最优性Contraction mapping theorem(压缩映射定理)解决贝尔曼最优公式分析最优策略(analyzing optimal policies)Summary 最优策略和公式推导 首先定义一个策略比另一个策略好: \[v_{\pi_{1}}(s) \ge v_{\pi_{2}}(s) \quad…

css3实现文字线性渐变,css3实现背景渐变

<div class=who1>我是线性渐变文字我是线性渐变文字我是线性渐变文字我</div> <div class=who2>我是背景渐变我是背景渐变我是背景渐变我是背景渐变我</div>.who1{width:400px; background: linear-gradient(to right, #ff0000, #ffff00); /*设置渐…