2048总结 JavaScript+jQuery(取元素方便,.css,text方法)
Html部分(界面):1.开始新游戏;2.返回上一步;3.记分栏; 4.16个小格组成;
其中1,2由链接形式实现.
a标签中href属性调用js方法;
<a href="javascript:new_game();"id="new_game_button">开始新游戏</a>
CSS部分:
1.字体采用@media方法适应屏幕大小;
2.背景待修改;(17行);
3.各元素的宽度、高度等单位为rem;默认1rem等于多少像素??
4.html中设置的16个小格作为背景不动,每个小格(grid_cell,其仅作背景)包含一个相同大小的小格(number_cell,其包含数字),若有数字要显示则对它设置宽、高,没有数字则其默认宽、高为0不显示。
Js部分
适配移动端:屏幕可用宽度小于一定程度时,设置字体大小;
开始新游戏:
1.初始化16个作为背景的小格子,它们的宽、高在css中已设置,在js中只需通过两层循环嵌套,对其定位即可(jQuery的css方法设置top、left值);
2.再次通过两层循环初始化每个格子的数字为0,即默认值为0;
3.更新棋局
3.1通过两层for循环嵌套,将16个number_cell添加到#grid_container中;
3.2判断number_cell中的数字大小;
3.2.1 number_cell中的数字大小为默认值0时,设置宽、高为0,相对于不显示数字;
3.2.2number_cell中的数字大于1024时(4位数),设置其宽、高与grid_cell相同,top和left也与grid_cell相同,即它们重叠了,只是看不出来,再修改小格子背景颜色和字体的颜色及大小;(都包含在number_cell.css()方法中),数字小于4为灰色,大于4后为白色,背景颜色通过switch,分别对2的n次方(2、4、8、16、32、64、128、256、512、1024、2048)进行设置,由于1024由4个数字组成,要使格子能将其显示完整,应该减小字体的大小,通过number_cell.text(board[i][j]);将数字得以显示;
3.2.3 number_cell中的数字大于100小于1024时(三位数),基本同上,改变位置,改变背景颜色、字体颜色、字体大小(相比于4位稍大,相比两位稍小);
3.2.4 number_cell中的数字小于100小于时(两位数),同上;
4.初始化分数score为0,更新分数,即把分数显示(text()方法);
5.界面初始化完成后,随机生成两个数字到两个格子中;generate_one_number,要生成数字放入格子,首先得判断是否还有空的格子,若16个格子全被占了,则直接返回,而判断是否还有空格子,就是遍历16个格子,如果格子中的数字还为0,则说明该格子可用。接下来确定随机位置,结合Math.floor()和Math.random()确定坐标(0,1,2,3),设定循环极限是50次,即在这50次中是随机确定位置,但是确定的位置不一定能用(可能已被数字占用),若位置能用(该位置数字为0),则成功;若位置不能用(数字非0),则继续调用随机方法,次数加1,直到次数等于50次,此时若还未找到可用位置,则不采用随机方式,而采用遍历16个格子的方法,依次遍历,找数字为0的格子,找到后,记录其坐标;接下来确定随机数字,由于只希望初始时出现2或4,我们采用Math.random() < 0.5将两种情况的概率划分为50%。为了有更好的体验,我们希望数字格子的出现具有一定的动画,使用number_cell.animate()方法结合数字格子宽、高、top、left值设置动画时间50ns(数字格子出现动画);由于我们有返回上一步这个功能,所以每生产一个数字格子,我们应及时保存当前分数和所有格子(遍历16个格子)对应的数字(o[n] = score+ ',' + board[i][j];o是一个对象,最后将o[1],o[2]…o[16]push到back数组中),保存到一个back数组中(数组中的每个值对应的是一个o对象,能取到那个时候所有格子的数字和那个时候的score)。
6.返回上一步功能的实现
<a href="javascript:come_back();" id="come_back_button">返回上一步</a>(红色部分执行js中的相应函数)
如果back数组成员小于或等于2,此时撤回不作任何效果,因为只有最开始的两个数字格子被记录在了back数组中,若back数组中成员个数大于2,取出back.length-2处的对象(该对象包含了上一步16个格子的数字及分数),遍历该对象,取出每个格子对应的board[i][j],这里以逗号为分隔,先找到逗号的索引,然后加1取后半部分o[n].substr(o[n].lastIndexOf(',')+1),而分数是逗号的前半部分,利用parseInt(o[n])可以直接取到,获取了每个格子的数字和分数,更新面板和分数,并back.pop(),它的作用就相当于一个指针,每次pop掉一个,相当于往回退一格,而我们更新面板时对应的数据不由它影响,因为那是一个对象保存着,由back.length-2每次退2步(收回两个数字格子)取得。
7.监听键盘的上下左右$(document).keydown(function(event){})
事件监听用的是keydown,结合switch针对上下左右(键码分别为37、38、39、40),按下它们中的任意一个,执行的操作都基本相同,首先阻止默认事件的发生event.preventDefault(),
其次判断能否上(下、左、右)移,如果可以移动,则随机产生一个数字格子,再判断游戏是否结束,随机产生格子先执行,判断游戏是否结束后执行,采用setTimeout的方式为它们设置不同用的时间来实现。
7.1判断能否上(下、左、右)移动的实现
7.1.1首先整体判断一次,即遍历12个格子(有4个不用遍历,因为就在边缘),看是否有能移动的,如果全部12个格子都不能移动返回false,直接结束,如果有能移动的(直接返回true)才继续执行。能否向某个方向移动,结合该游戏特点,当移动方向上有空格(数字为0的格子)或相邻的两个格子数字相同(可合并)。
7.1.2该方向上如果有可移动的格子,才具体分析,遍历12个格子,找其中数字不为0的格子,这里以左移为例,board[i][j] != 0,再依次遍历这个位置的左边所有格子,for (var k = 0; k < j; k++),此时又要分两种情况,一种是只移动,但是数字格子不能合并,另一种是不仅要移动,数字格子还能合并。
7.1.2.1只移动,数字格子不能合并
依次遍历这个位置的左边所有格子,且从最左边(保证能移的最远)开始找数字为0的格子,如果数字为0的格子和待移动的格子(待移动的格子可能不止一个,这个由循环遍历实现)之间的格子都为0或它们本身就相邻(判断之间的格子由no_block_horizontal实现,水平方向,这个过程很好实现,反向思维,只要找到不为0的格子返回false即可);符合移动条件后,执行移动动画,通过待移动的格子坐标确定jQuery元素,再使用animate方法指定top、left;最后把格子上的数字进行变动,待移动的格子数字赋给目标格子,并将自己清0;整个过程不影响score。
7.1.2.2要移动,数字格子能合并
判断board[i][k] == board[i][j] && no_block_horizontal(i, k, j, board) && !has_conflicted[i][k],其中has_conflicted[i][k]初始都是设定为false的,找到两个数字相同的格子且之间没有格子都为0时,执行移动格子的动画,进行数字变动(此时要将两个格子的数字相加),在对score进行赋值并更新,score每次增加的分数等于两个格子数字之和,最后将has_conflicted[i][k] = true,避免一次按键多次合并,最后更新面板。
有可能在执行7.1.2.2时其中有个格子已经先执行了7.1.2.1了,比如(1,1)和(1,3)的数字相等,而(1,1)的左边(1,0)是空格子,遍历过程中会先找到(1,1)执行7.1.2.1将(1,1)移动到(1,0),之后再遍历到(1,3),此时的(1,3)是与(1,0)有相同的数字,所以最终是合并到了最左边。
7.2判断游戏是否结束,游戏结束有两种可能
情况一:移动之后遍历16个格子,判断是否有格子达到2048,若有,则在分数栏显示success;
情况二:棋盘上没有空格子且上下左右均不能移动(没有空格子且没有相同数字格子),显示走投无路
8 适配移动端(怎么测试??)
监听移动设备的触摸开始、触摸移动、触摸结束
document.addEventListener('touchstart',function (event) {})
document.addEventListener('touchmove',function (evnet) {})
document.addEventListener('touchend',function (event){})
startx = event.touches[0].pageX;
endx = event.changedTouches[0].pageX;
var x = endx - startx;
x小于一定程度时不起作用;
水平和垂直还得比较Math.abs(x) > Math.abs(y)
还得判断x > 0还是x<0确定是向左还是向右
2048总结 JavaScript+jQuery(取元素方便,.css,text方法)的更多相关文章
- jquery 与javascript关系 ①取元素 ②操作内容 ③操作属性 ④操作 样式 ⑤ 事件 点击变色
jQuery的min版本和原版功能是一样的,min版主要应用于已经开发成的网页中,而非min版 的文件比较大,里面有整洁的代码书写规范和注释,主要应用于脚本开发过程当中. JQuery是继protot ...
- 2016/4/1 jquery 与javascript关系 ①取元素 ②操作内容 ③操作属性 ④操作 样式 ⑤ 事件 点击变色
jQuery的min版本和原版功能是一样的,min版主要应用于已经开发成的网页中,而非min版 的文件比较大,里面有整洁的代码书写规范和注释,主要应用于脚本开发过程当中. JQuery是继protot ...
- 转:jquery操作元素的css样式(获取、修改等等)
//1.获取和设置样式 $("#tow").attr("class")获取ID为tow的class属性 $("#two").attr(&qu ...
- 使用jquery操作元素的css样式(获取、修改等等)
//1.获取和设置样式 $("#tow").attr("class")获取ID为tow的class属性 $("#two").attr(&qu ...
- jQuery为元素设置css的问题
例子: 有如下的html代码 对文本框设置字体大小为20px ,即font-size:20px 首先会想到如下: $('input').css({font-size:'20px'}); 由于属性不能使 ...
- javascript jquery插入元素后事件会被注销
js jquery插入元素后事件会被注销 document.body.innerHTML += <div id="dd">test</div> //这 ...
- <<< Jquery查找元素、选择器使用方法总结
$("#myDiv"); //根据给定的ID匹配一个元素,用于搜索id 属性中给定的值,id属性必须是唯一的 $("div"); //根据给定的元素名匹配所有元 ...
- [转载]jquery获取元素索引值index()方法:
jquery的index()方法 搜索匹配的元素,并返回相应元素的索引值,从0开始计数. 如果不给 .index() 方法传递参数,那么返回值就是这个jQuery对象集合中第一个元素相对于其同辈元素的 ...
- jquery获取元素索引值index()方法
jquery的index()方法 搜索匹配的元素,并返回相应元素的索引值,从0开始计数. 如果不给 .index() 方法传递参数,那么返回值就是这个jQuery对象集合中第一个元素相对于其同辈元素的 ...
随机推荐
- android studio 中由于网络问题,编译错误
由于网络原因,需要连外网实现下载相关依赖包,导致编译失败 在 build.gradle文件中 将原来是jcenter()的地址改成 maven{ url 'http://maven.aliyun.co ...
- MVC中学到的小知识(MVC中的跳转,传参)
1.mvc中视图中的href="XXX",这个XXX是控制器地址,不是另一个视图.(这里的href语句只能转向控制器,不能直接转向视图),如果要实现转向视图,可以先转到控制器,然后 ...
- JS 浮点数计算
一.从String中解析浮点数 parseFloat(string) 语法说明 parseFloat是个全局函数,不属于任何对象. parseFloat将它的字符串参数解析成为浮点数并返回.如果在解析 ...
- Linux下一个最简单的不依赖第三库的的C程序(2)
一个最简单的C程序,如下: main.c: int main() { char *str = "Hello World"; ; } 在64位平台上编译一个32位的程序,如下:(32 ...
- Code Signal_练习题_Add Border
Given a rectangular matrix of characters, add a border of asterisks(*) to it. Example For picture = ...
- Java学习笔记(2)----散列集/线性表/队列/集合/图(Set,List,Queue,Collection,Map)
1. Java集合框架中的所有实例类都实现了Cloneable和Seriablizable接口.所以,它们的实例都是可复制和可序列化的. 2. 规则集存储的是不重复的元素.若要在集合中存储重复的元素, ...
- 利用Mongodb做地理空间查询
MongoDB 是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案. 前言 在移动开发中,经常会用到定位的功能,例如美团.饿了么.猫眼电影等的app ...
- 磁贴界面颜色 Metro UI Colors
http://www.oschina.net/p/metro-ui-colors 介绍 包含了磁贴界面(Metro UI)使用的颜色集合(浅绿色,绿色,深绿色,品红,紫色等).可以查看每一种颜色的各种 ...
- Flutter知识点:数据存储之sqflite
sqflite是一款轻量级的关系型数据库,类似SQLite. 在Flutter平台我们使用sqflite库来同时支持Android 和iOS. 使用介绍 1.首选需要在pubspec.yaml 导入库 ...
- Android 二次打包(封装)AAR实用指南
前言 上次文章Android SDK开发与使用的那些事儿说到如何在aar里集成导入的aar,也就是二次封装aar的问题,一带而过,难免不过瘾.在封装这条路上也遇到了不少坑,现在将此方法详细记录下来. ...