首页 > 其他分享 >js五子棋效果

js五子棋效果

时间:2024-10-24 16:22:08浏览次数:1  
标签:function 效果 五子棋 js item chess && chessPoint chessArr

任务分解

一、绘制棋盘

二、绑定事件

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

 

标签:function,效果,五子棋,js,item,chess,&&,chessPoint,chessArr
From: https://www.cnblogs.com/nianzhilian/p/18499840

相关文章

  • Threejs 实现3D 地图(05)3d 地图进场动画和地图边缘动画
    3d地图进场特效以及地图边缘动画代码仓库:King/threejs-3d-map地图边缘动画核心代码:constinitBorderPoint=()=>{//获取地图边界的左边(通过https://datav.aliyun.com/portal/school/atlas/area_generator#2.51/104.299012/33.447963获取)letborderPoints3Ar......
  • js原型链理解
    原型链原型(prototype)每个函数上面都有一个prototype属性(天生的),因为这个属性的值是个对象,也被称之为原型对象函数和构造函数的区别:构造函数和普通函数在js中都是一样的没有区别,只是大家约定俗成构造函数首字母必须大写,用来区分于普通函数(驼峰命名)作用存放一些属性......
  • Nuxt.js 应用中的 builder:watch 事件钩子详解
    title:Nuxt.js应用中的builder:watch事件钩子详解date:2024/10/24updated:2024/10/24author:cmdragonexcerpt:builder:watch是Nuxt.js中的一个生命周期钩子,在开发环境的构建过程期间被调用。它允许开发者在监视到项目中的文件或目录发生变化时,执行特定的操作。这......
  • VUEJS实例中DATA属性的三种写法及区别是什么
    Vue.js是一种流行的JavaScript前端框架,用于构建交互式的用户界面。VUEJS实例中DATA属性的三种写法及区别是:1、独立性;2、推荐性;3、ES6语法。其中,独立性是指,使用函数返回一个对象的写法确保了每个组件实例都拥有独立的数据,不会相互影响。而直接使用对象声明DATA属性的写法会导致数......
  • js 富文本转义及反转义(包含vue版本的)
    //js//富文本反转义htmlfunctionescape2Html(str){  vararrEntities={'lt':'<','gt':'>','nbsp':'','amp':'&','quot':'"'};returnst......
  • 报error:0308010C:digital envelope routines::unsupported错--nodejs版本过高(nvm安
    最近小编入职实习,运行(npmrundev)前端项目时报error:0308010C:digitalenveloperoutines::unsupported的错,一查发现原来是nodejs版本过高,与项目不匹配。接下来介绍更换nodejs版本的方法。第一种:官网下载通过nodejs官网下载安装,但有个缺陷,不同版本的nodejs无法顺利的切换......
  • 【Ambari编译报错】phantomjs从github上下载失败导致无法编译的问题
    PhantomJS下载失败问题1.错误分析下面是完整的报错日志:[ERROR]npmverbunsafe-perminlifecycletrue[ERROR]npmverbunlockdoneusing/root/.npm/_locks/phantomjs-ca2567298810d09d.lockfor/opt/modules/ambari/ambari-admin/src/main/resources/ui/admin-......
  • 海康威视AI开放平台训练数据集导入问题---解决导入自己数据集的问题(txt转json格式)
    一、问题导入首先我们先进入到开放平台中,选择物体检测最近在做一个项目,需要使用到海康威视AI开放平台来训练数据集,但是刚开始遇到了一个问题就是导入自己的数据集(txt格式转成了json格式)为啥没有用,后面查看相关文档,解决了导入自己数据集的问题,就不用在平台里标注了。二、探......
  • Golang 中使用 JSON 的一些小技巧
    临时忽略struct字段typeUserstruct{Emailstring`json:"email"`Passwordstring`json:"password"`//manymorefields…}临时忽略掉Password字段json.Marshal(struct{*UserPasswordbool`json:"password,omitempty"`}{Us......
  • Nginx的 MIME TYPE问题导致的mjs文件加载出错的问题解决
    .mjs文件:明确表示使用ES6模块系统(ECMAScriptModules)。 在服务器用Nginx部署前端项目后,出现下面这种问题Failedtoloadmodulescript:ExpectedaJavaScriptmodulescriptbuttheserverrespondedwithaMIMEtypeof"application/octet-stream".StrictMIMEt......