js数组案例之五子棋游戏

 更新时间:2022年05月06日 10:00:50   作者:南初️  
这篇文章主要为大家详细介绍了js数组案例之五子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了js实现五子棋游戏的具体代码,供大家参考,具体内容如下

一、效果图

二、设计思路

第一步:创建棋盘,生成棋盘所对应的数组坐标。
第二步:鼠标点击当前位置返回当前点的坐标。
第三步:生成对应的棋子。
第四步:添加悔棋、重新开始事件。
第五步:设置棋子输赢,若某个棋子五个连成一条线,则该棋子赢。

三、核心代码

//1.创建棋盘
var item = document.querySelector(".item-map");
var itemchild = document.querySelector(".item-child");
var yuanele = document.querySelector(".yuan");
var nameele = document.querySelector(".name");
var btnback = document.querySelector(".btnback");
var btnrestart = document.querySelector(".btnrestart");
var Game = {
        w: 30,
        h: 30,
        col: 13,
        row: 13,
        src: './img/bg.png',
        _Map: null,//接收整个地图对象
        ux: null,
        uy: null,
        mappos: [],//地图上每个点对应坐标数组
        r: 14,
        offset: 0,
        ele: [{class: 'hei', name: "黑棋子"}, {class: 'bai', name: "白棋子"}],
        index: 0,
        nowEle: null,
        saveEle: null,
        listmap: [],
        fx: 0,
        fy: 0,
        createMap: function () {
            //创建地图的
            if (this._Map == null) {
                //使用dom元素创建
                this._Map = document.createElement("div");
                this._Map.className = "map";
                this._Map.style.width = this.w * this.col + "px";
                this._Map.style.height = this.h * this.row + "px";
                this._Map.style.backgroundImage = "url('" + this.src + "')";
                item.appendChild(this._Map);
                //自动计算偏移
                this.offset = this._Map.offsetLeft;
                //生成数组坐标
                this.createPos();
            }
        },
        createPos: function () {
            for (var i = 0; i <= this.row; i++) {
                this.mappos.push([]);
                this.listmap.push([]);
                for (var k = 0; k <= this.col; k++) {
                    this.mappos[i].push([k * this.w, i * this.h]);
                    this.listmap[i].push(null);
                }
            }

        },
        checkPos: function () {
            //检测到了返回当前点坐标
            for (var i = 0; i < this.mappos.length; i++) {
                for (var k = 0; k < this.mappos[i].length; k++) {
                    var center = this.mappos[i][k];
                    var cx = center[0] - this.ux;
                    var cy = center[1] - this.uy;
                    var ishas = this.r * this.r >= cx * cx + cy * cy;
                    if (ishas) {
                        this.fx=i;
                        this.fy=k;
                        return center;
                    }
                }
            }
        },
        getNextEle: function () {
            this.nowEle = this.ele[this.index];
            yuanele.className = "yuan " + this.nowEle.class;
            nameele.innerText = this.nowEle.name;
            this.index = ++this.index >= this.ele.length ? 0 : this.index;
            return this.nowEle;
        },
        createNowPosEle: function () {
            //在当前的坐标位置创建一个元素
            var arr = Game.checkPos();
            if (arr)//[0,0]
            {
                //创建当前的棋子
                var nowqizi = document.createElement("div");
                nowqizi.style.width = this.r * 2 + "px";
                nowqizi.style.height = this.r * 2 + "px";
                nowqizi.className = "qizi " + this.nowEle.class;
                nowqizi.style.left = arr[0] - this.r + this.offset + "px";
                nowqizi.style.top = arr[1] - this.r + this.offset + "px";
                //记录当前的棋子
                this.saveEle = nowqizi;
                itemchild.appendChild(nowqizi);
                //给对应的集合对应位置添加对象
                var s = 0;
                if (this.nowEle.class == "hei") {
                    s = 0;
                }
                else {
                    s = 1;
                }
                this.listmap[this.fx][this.fy] = s;
                //自动检测游戏是否结束
                //以当前这个子,四周找五连子,确定输赢
                this.checkWin();
                Game.getNextEle();

            }
        },
        checkWin:function () {
            var win=null;
            if(this.heng(this.listmap[this.fx])){
                win=this.nowEle;
            }
            else if(this.zong(this.fx,this.fy)){
                win=this.nowEle;
            }
            if(win){
                setTimeout(function(){
                    switch (win.class){
                        case 'bai':
                            alert("白棋赢了!");
                            break;
                        case 'hei':
                            alert("黑棋赢了!");
                            break;
                    }
                    btnrestart.click();
                },500)
            }
        },
        //纵向检测
        zong:function(x,y){
            for(var i=0;i<this.listmap.length;i++){
                var iscome=true;
                var n=this.listmap[i][y];
                if(n==null)
                continue;
                var arr=[i];
                for(var k=i+1;k<=i+5;k++){
                    //后面k+5之后会超出map范围会报错
                    if(this.listmap[k]==undefined)
                        break;
                    if(this.listmap[k][y]==null)
                        continue;
                    if(n!=this.listmap[k][y]){
                        iscome=false;
                        break;
                    }
                    else{
                        arr.push(k);
                    }
                }
                if(iscome&&arr.length==5){
                    return iscome;
                }
            }
        },
        heng:function (h) {
            //检测当前行上面是否存在连续的五个
            for(var i=0;i< h.length;i++){
                var iscome=true;
                var n=h[i];
                if(n==null)
                    continue;
                var arr=[i];
                for(var k=i+1;k<=i+5;k++){
                    //后面k+5之后会超出map范围会报错
                    if(h[k]==null)
                        continue;
                    if(n!=h[k]){
                        iscome=false;
                        break;
                    }
                    else{
                        arr.push(k);
                    }
                }
                if(iscome&&arr.length==5){
                    return iscome;
                }
            }
        }
    };
    window.onload = function () {
        Game.createMap();
        //显示当前棋子
        Game.getNextEle();


        //给item添加鼠标点击事件
        item.onclick = function (e) {
            Game.ux = e.offsetX - Game.offset;
            Game.uy = e.offsetY - Game.offset;
            Game.createNowPosEle();
        }
        //悔棋事件
        btnback.onclick = function () {
            if (Game.saveEle) {
                Game.getNextEle();
                //删除之前的棋子
                Game.saveEle.remove();
                Game.saveEle = null;
            }
            else {
                alert("不能在悔棋了!!");
            }

        }
        //重新开始
        btnrestart.onclick = function () {
            //直接删除所有的棋子
            itemchild.innerHTML = "";
            Game.saveEle = null;
            Game.index = 0;
            Game.getNextEle();
        }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • js实现多张图片打包成zip

    js实现多张图片打包成zip

    图片下载是前端常见的需求,如果一张一张下载未免太影响体验了,于是写下了这个多张图片打包成zip的demo
    2021-05-05
  • js数据向上翻滚_数据滚动

    js数据向上翻滚_数据滚动

    方便做一些问题提交等宣传效果,多用于文字滚动
    2008-10-10
  • 微信小程序webSocket的使用方法

    微信小程序webSocket的使用方法

    这篇文章主要介绍了微信小程序webSocket的使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • URLSearchParams快速解析URL查询参数实现

    URLSearchParams快速解析URL查询参数实现

    这篇文章主要为大家介绍了URLSearchParams快速解析URL查询参数实现,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06
  • js动态生成指定行数的表格

    js动态生成指定行数的表格

    下面用js实现可以生成用户所需行数的表格,具体步骤及效果图如下,感兴趣的朋友,可以参考下哈,希望对大家有所帮助
    2013-07-07
  • JS+CSS实现电子商务网站导航模板效果代码

    JS+CSS实现电子商务网站导航模板效果代码

    这篇文章主要介绍了JS+CSS实现电子商务网站导航模板效果代码,涉及JavaScript结合css动态操作页面元素属性的相关技巧,非常具有实用价值,需要的朋友可以参考下
    2015-09-09
  • VsCode插件整理(小结)

    VsCode插件整理(小结)

    这篇文章主要介绍了VsCode插件整理(小结),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • js调用屏幕宽度的简单方法

    js调用屏幕宽度的简单方法

    下面小编就为大家带来一篇js调用屏幕宽度的简单方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-11-11
  • 浅谈JavaScript正则表达式-非捕获性分组

    浅谈JavaScript正则表达式-非捕获性分组

    下面小编就为大家带来一篇JavaScript正则表达式-非捕获性分组。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • Javascript获取统一管理的提示语(message)

    Javascript获取统一管理的提示语(message)

    这篇文章主要介绍了Javascript获取统一管理的提示语(message)的相关资料,需要的朋友可以参考下
    2016-02-02

最新评论