博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
canvas + jquery 实现扫雷小游戏
阅读量:6292 次
发布时间:2019-06-22

本文共 2408 字,大约阅读时间需要 8 分钟。

前言

这个小游戏主要思路是canvas与数组的映射,每一个小网格对应二维数组的一个元素,利用数组来存储网格的信息,如 某网格是否有雷,周围九宫格雷的个数,是否已经被打开

这里定义了三个数组

let gridStatus_arr = [];          //存储格子身份状态,状态1为雷let mineNum_arr = [];            //存储格子周围八个格子雷的数量let click_arr = [];           //存储格子点击状态,点击过的为1复制代码
  1. 布局

先添加三个难度的按钮

复制代码

点击相应按钮通过 js 获取对应的 data 属性, 然后动态的生成相应的方格, 然后动态计算包裹所有小方格的宽度和高度

然后创建一个canvas元素

复制代码

canvas画布的大小属性width和height先不设置,后面通过js动态设置

  1. 按钮点击事件,并初始化画布

点击难度按钮,动态初始化画布

//获取canvas元素    context = $("#canvas")[0].getContext("2d");        $(".type").click(function(){        row = $(this).data('row');        col = $(this).data('col');        mine = $(this).data('mine');        init(mine);    })    //初始化    function init(mine){        createGrid();      //创建网格        createMine(mine);     //随机生成雷        countArountMine();      //计算每个格子周围八个格子雷的数量        createClickEvent();    //添加点击事件    }复制代码

3.canvas创建网格

利用canvas画网格,先画一个相应大小的矩形,然后在矩形内画线形成网格

function createGrid(){        //计算画布宽高        let width = GAID_WIDTH*col;        let height = GAID_HEIGHT*row;        //设置画布宽高        canvas.setAttribute("width",width)        canvas.setAttribute("height",height)        //描绘边框        context.beginPath();        context.linewidth = 1;         context.rect(0,0,width,height);        context.stroke();        context.fillStyle = '#909090';        context.fill();        //准备画横线        for(let row_i = 1; row_i
  1. 随机生成雷

添加雷,改变格子身份状态 ,1代表雷区

这里是利用二维数组和网格的映射来实现的

function createMine(mine){        $('#mine').text(mine);        //将数组变为二维        for(let i=0; i

5.计算每个格子周围八个格子雷的数量

利用对象来取当前格子周围九宫格的范围,遍历查看对应数组的身份状态

function countArountMine(){        for(let i=0; i
  1. 添加点击事件

要先去掉默认的contextmenu事件,否则会和默认右键事件同时出现。

document.oncontextmenu = function (e) {        e.preventDefault();};复制代码

再添加鼠标点击事件,e.which = 1为鼠标左键 ,e.which = 3为鼠标右键

function createClickEvent(){             $("#canvas").off();        $("#canvas").mousedown(function(e){            //因为canvas的X,Y坐标和数组的行列相反,这里直接转换了一下            let x = Math.floor(e.offsetY / GAID_HEIGHT);            let y = Math.floor(e.offsetX / GAID_WIDTH);            if(e.which == 1){                judgeGridStatus(x,y);            }else if(e.which == 3){                signMine(x,y);            }        })    }复制代码
  1. 判断输赢

对比身份状态是否为1 来判断是否点击到雷。

通过 已打开的格子个数 和 row*col - mine 对比判断是否扫雷成功

这里就不贴代码了,详细可参考我的GitHub仓库

最后

在canvas的用法上可能有一些不规范,因为花的时间比较短, 可能里面还存在一些问题,还请大佬们多多包涵,也欢迎大佬们来指正。本小白感激不尽。

转载于:https://juejin.im/post/5adc853a5188256735641ae6

你可能感兴趣的文章
[LeetCode] Minimum Moves to Equal Array Elements 最少移动次数使数组元素相等
查看>>
破解许可
查看>>
Linux的视频编程(V4L2编程)【转】
查看>>
Atitit hsv转grb 应该优先使用hsv颜色原则 方便人类
查看>>
微信聊天和朋友圈可以拍摄和分享大视频?
查看>>
ubuntu-15.10-server-i386.iso 安装 Oracle 11gR2 数据库
查看>>
three.js贴图
查看>>
C++ ODB 框架(未实践使用)
查看>>
DBSCAN(Density-based spatial clustering of applications with noise)
查看>>
HTTP 2.0与HTTP 1.1区别
查看>>
项目中使用oracle序列
查看>>
HBase编程 API入门系列之put(客户端而言)(1)
查看>>
Oracle Form's Trigger Tutorial With Sample FMB
查看>>
Nuget很慢,我们该怎么办
查看>>
easyui filter 过滤时间段
查看>>
2017-01-03
查看>>
C++获取当前目录
查看>>
Genymotion 解决虚拟镜像下载速度特别慢的问题
查看>>
Oracle数据库的语句级读一致性
查看>>
Cannot run Eclipse; JVM terminated. Exit code=13
查看>>