先初始化棋盘

HTML:

<!--棋盘-->
<div class="grid"></div>

CSS:

/*棋盘*/
.grid{
position: relative;
width: 762px;
height: 762px;
background-image: url('./image/timg.jpg');
-webkit-background-size: 100% 100%;
background-size: 100% 100%;
background-position: center center;
margin: 100px auto;
} /*每个棋子落点区域*/
.per-zone{
position: absolute;
width: 50px;
height: 50px;
padding: 10px;
background-origin: content-box;
box-sizing: border-box;
background-position: center center;
background-size: 100% 100%;
background-repeat: no-repeat;
}

JS:// 棋盘

const grid = document.getElementsByClassName('grid')[0];

// 棋盘有15列,  15行
const column = 15 , line = 15; // 装棋子的二维数组
let gridArr = []; // 初始化二维数组
function init() {
// 文档碎片用来装棋子优化效率
const fragment = document.createDocumentFragment();
gridArr = new Array(line);
for(let i = 0; i < gridArr.length; i ++) {
gridArr[i] = new Array(column);
for(let j = 0; j < gridArr[i].length; j ++) {
// 创建每个棋子落点区域
fragment.appendChild(createZone(j, i));
}
}
grid.appendChild(fragment);
// 事件委托, 性能优化
grid.addEventListener('click', (e) => {
begin(e);
}, false)
}
init(); function createZone(x, y) {
// 创建棋子
const div = document.createElement('div');
div.classList.add('per-zone');
div.style.left = x * 50 + 7 + 'px';
div.style.top = y * 50 + 7 + 'px';
// 标记棋子的类型,黑子为1, 白子为2, 初始化为0
div.value = 1;
div.style.backgroundImage = `url(${'./image/' + div.value + '.png' })`;
return div
}

我们先让每个棋子的value都为1,看看效果:

不要犯密集恐惧症哦,

我们用事件委托来绑定事件, 这样事件只需要绑定一次而不用绑定15 * 15次,

很大地提升了效率,

开始写点击事件:

// 计数, 用来判定落黑子还是落白子
let count = 0; // 黑:value =1 ; 白: value = 2
function begin(target) {
// 判断value为0 才能下子
if (!target.value) {
target.value = count%2 + 1 ;
target.style.backgroundImage = `url(${'./image/' + target.value + '.png' })`;
// 判断是否结束
judgeFinish();
count ++ ;
}
 }

现在我们可以下棋了:

很有成就感是不是,就差最后一步也最是核心的一步

判断横着, 竖着, 斜着 是否有5个以上相同颜色的棋子

function judgeFinish() {
for (let i = 0; i < gridArr.length; i ++) {
for(let j = 0; j < gridArr[i].length; j ++) {
// value 为 0 跳过
if (gridArr[i][j].value === 0) {
continue;
}
// 判断是否五子连珠
const result = judgeLine(i, j);
if (result === 1) {
alert('黑棋胜利');
replay();
return
} else if (result === 2) {
alert('白棋胜利');
replay();
return
}
}
}
} // 判断向下, 向右, 向斜上, 向斜下四个方向
function judgeLine(x, y) {
// 黑1, 白2
let result1 = 3, result2 = 3, result3 =3, result4 =3;
for (let i = 0; i < 5; i ++) {
// 向下
result1 &= y + i < 14 ? gridArr[x][y + i].value : 0;
// 向右
result2 &= x + i < 14 ? gridArr[x + i][y].value : 0;
// 斜上
result3 &= (x + i > 14 || y - i < 0) ? 0 : gridArr[x + i][y - i].value;
// 斜下
result4 &= (x + i > 14 || y + i > 14) ? 0 : gridArr[x + i][y + i].value;
}
// 只要有一个方向不为0 游戏结束
return result1 | result2 | result3 | result4
} function replay() {
// 装棋子的二维数组
gridArr = []; // 计数, 用来判定落黑子还是落白子
count = 0;
grid.innerHTML = '';
init();
}

核心:  使用& 运算符  来  判断 是否 5 子 的 value 相同

1& 1& 1& 1& 1 = 1

2 & 2 &2 &2 &2  = 2

为什么初始值设成3 呢, 因为任何数 & 3  都不会变

先转化成2进制 再运算  3 =》 11

最后的效果:

原生js实现 五子棋的更多相关文章

  1. 原生js实现五子棋

    为什突然做这个,因为这是个笔试题,拖了一个月才写(最近终于闲了O(∩_∩)O),废话不多说,说说这个题吧 题目要求 编写一个单机[五子棋]游戏,要求如下: 1.使用原生技术实现,兼容 Chrome 浏 ...

  2. 原生JS+Canvas实现五子棋游戏

    一.功能模块 先看下现在做完的效果: 线上体验:https://wj704.github.io/five_game.html 主要功能模块为: 1.人机对战功能 2.悔棋功能 3.撤销悔棋功能 二.代 ...

  3. 原生 Javascript 编写五子棋

    原文地址:原生 Javascript 编写五子棋 博客地址:http://www.extlight.com 一.背景 近一个月没写 Javascript 代码,有点生疏.正好浏览网页时弹出五子棋的游戏 ...

  4. 原生JS封装Ajax插件(同域&&jsonp跨域)

    抛出一个问题,其实所谓的熟悉原生JS,怎样的程度才是熟悉呢? 最近都在做原生JS熟悉的练习... 用原生Js封装了一个Ajax插件,引入一般的项目,传传数据,感觉还是可行的...简单说说思路,如有不正 ...

  5. 常用原生JS方法总结(兼容性写法)

    经常会用到原生JS来写前端...但是原生JS的一些方法在适应各个浏览器的时候写法有的也不怎么一样的... 今天下班有点累... 就来总结一下简单的东西吧…… 备注:一下的方法都是包裹在一个EventU ...

  6. 原生JS实现"旋转木马"效果的图片轮播插件

    一.写在最前面 最近都忙一些杂七杂八的事情,复习软考.研读经典...好像都好久没写过博客了... 我自己写过三个图片轮播,一个是简单的原生JS实现的,没有什么动画效果的,一个是结合JQuery实现的, ...

  7. 再谈React.js实现原生js拖拽效果

    前几天写的那个拖拽,自己留下的疑问...这次在热心博友的提示下又修正了一些小小的bug,也加了拖拽的边缘检测部分...就再聊聊拖拽吧 一.不要直接操作dom元素 react中使用了虚拟dom的概念,目 ...

  8. React.js实现原生js拖拽效果及思考

    一.起因&思路 不知不觉,已经好几天没写博客了...近来除了研究React,还做了公司官网... 一直想写一个原生js拖拽效果,又加上近来学react学得比较嗨.所以就用react来实现这个拖 ...

  9. 原生JS实现全屏切换以及导航栏滑动隐藏及显示——重构前

    思路分析: 向后滚动鼠标滚轮,页面向下全屏切换:向前滚动滚轮,页面向上全屏切换.切换过程为动画效果. 第一屏时,导航栏固定在页面顶部,切换到第二屏时,导航条向左滑动隐藏.切换回第一屏时,导航栏向右滑动 ...

随机推荐

  1. 使用ssh keys实现免验证登陆远程服务

    使用ssh keys实现免验证登陆远程服务========================Created 星期四 10 五月 2018 引言------------------程序员或者服务器运维人员 ...

  2. Mysql 查询缓存总结

    Mysql 查询缓存总结 MySQL查询缓存解释 缓存完整的SELECT查询结果,也就是查询缓存.保存查询返回的完整结果.当查询命中该缓存,mysql会立刻返回结果,跳过了解析.优化和执行阶段, 查询 ...

  3. 读《图解HTTP》有感-(HTTP报文内的HTTP消息)

    写在前面 HTTP通信包括从客户端到服务端的的请求以及服务端返回客户端的响应 正文 1.什么是HTTP报文?它由什么构成?包含几个部分? 用于HTTP协议交互的信息就是HTTP报文:它是由多行数据构成 ...

  4. Unite Beijing 2018 参会简要分享

    一. Training Day 主讲人:鲍建运 操作:马瑞 课程包括较为完整的功能,如灯光设置,角色动画控制,Cinemachine,Timeline,AI寻路,以及最新的Post Processin ...

  5. File文件的读写操作RandomAccessFile类

    1.Java提供了一个对文件随机访问的操作,访问包括读和写操作,该类名是RandomAccessFile,该类的读写是基于指针的操作. 2.RandomAccessFile在堆文件进行随机访问操作时有 ...

  6. MySQL 各类数据文件介绍

    数据文件 在MySQL中每一个数据库都会在定义好(或者默认)的数据目录下存在一个以数据库名字命名的文件夹,用来存放该数据库中各种表数据文件. 不同的MySQL存储引擎有各自不同的数据文件,存放位置也有 ...

  7. PAT1090:Highest Price in Supply Chain

    1090. Highest Price in Supply Chain (25) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 C ...

  8. python3字典:获取json响应值来进行断言

    前言:在接口自动化测试中,最后都是需要将返回结果进行断言.本文按照实际情况举例说明字典各种操作,以及如何提取响应数据来进行断言 1.dict = {'code': '200', 'message': ...

  9. hackathon活动复盘

    复盘: hackathon技术创新型.理念创新落地型评委的一个评估点:在公司怎么落地的问题5分钟的demonstration,要进行测试,5分钟很快的:表达方式:common language,让人能 ...

  10. 写完批处理脚本,再写个Gradle脚本,解放双手

    前言 上一篇写个批处理来帮忙干活---遍历&字符串处理中,我们已经学习如何写批处理脚本来帮我们做一些简单的重复性工作,本篇继续来学习如何用 Gradle 写脚本,让它也来帮我们干活 Gradl ...