1. 操作描述:
每按下方向键后若格子能够发生变动(即有移动或合并操作产生),便在移动或合并操作后剩下的空白处某一随机位置新增一个数值为2的格子。
2. 编程思路:
我们需要结合其它方法来判断是否执行此方法,因此定义一个全局的布尔类型变量 moveAble,用作新增格子的“开关”。默认状态下让它“关闭”,即在声明时赋值为 false。在进行了移动或合并操作后将它“打开”,即在移动和合并的方法内部将true赋值给 moveAble。并在即将进行新一轮移动或合并操作前再将它“关闭”,即在上篇监听方法中执行向上/下/左/右方法之前将其值设为false。
了解这个“开关”的作用后开始编写新增格子方法。首先判断 moveAble 是否为 true ,为 true 则继续进行,否则控制台返回“不能增加新格子,请尝试其他方向移动!”。接着遍历整个二维数组,将数值为空的坐标保存进局部定义的数组变量 ableArr 中,对下标进行随机方法,将最终的随机下标值和格子值(2)或随机下标值传入 arrValueUpdate 与 drawCell 方法中来画出新格子。
JS本就是个先天残废的语言,能把DOM操作好就行了。。。真要搞大一点的项目,你有更好的语言可以学。。。由于JS的诸多劣根性,不面向对象,弱类型,动态语言。。。其实靠学习JS,很难养成逻辑思维。。我相信录制视频的那个老师,在只学过JS,而没学过其他语言的时期,也是写不出2048的。。。
其实编程语言的特性和设计模式有很多,而JS的语言劣根性,导致其只具备了其中最基础的部分。。。稍微高级一些的东西。。在JS里其实是没有的。。所以JS即便学得再精。。。其实编程思想依然只是小学生水平。。。
比如继承,多态,委托,工厂模式,观察者模式,单例模式,二叉树,行为树,状态机,等等。。。如果只是通过学习JS,而不接触一门强类型,面向对象语言的话,这些特性,永远都无法涉足。。。所谓编程思想,也就止步于小学生水平了。。
这里推荐C#。。。为什么?因为它是未来JS改进方向的参照原形。。。2.0版的JAVASCRIPT,基本就可以看作是C#的山寨版。。。ECMA的JS改进计划,就是让JS越来越像C#。。当你学到这一步,会接触到一个叫unity 3d的东西,到时候你自然就能做出2048了。。。甚至你可以做出一个CS之类的3D游戏来。。。
不过这是以后的事情了。。。学习是一个循序渐进的过程,没有谁是一步登天的。。在学习JS的阶段,能把DOM操作好就足够了。。。这才是JS的本分。。。不需要指望JS再去干那些“与自己无关的事情”。。。那些都是一群学了JAVA,C#或者C++的老东西们,跑回JS的新手圈炫技装逼的产物而已。。。。。。。
这个是我总结的一些,希望对你有帮助var FormUtils = {
//去前后空格
trimLeftandRight : function (string){
return string.replace(/(^\s*)|(\s*$)/g, "")
},
//非空判断
checkNull : function (string){
var pattern = /^[\s\S]+$/
if(!pattern.test(string)){
return true
}
return false
},
//长度范围限制
checkLengthRange : function (string , minLength , maxLength){
if(string.length <minLength || string.length >maxLength){
return true
}
return false
},
//最小长度
checkMinLength : function (string , minLength){
if(string.length <minLength){
return true
}
return false
},
//最大长度
checkMaxLength : function (string , maxLength){
if(string.length >maxLength){
return true
}
return false
},
//是否为Email
checkEmail : function (string){
var pattern = /^(\w+([-+.]\w+)*)@\w+([-.]\w+)*\.\w+([-.]\w+)*$/
if(!pattern.test(string)){
return true
}
return false
},
//检查中文输入
checkCN : function (string){
var pattern=/^[\u4e00-\u9fa5]*$/
if(!pattern.test(string)){
return true
}
return false
},
//检查英文输入
checkEN : function (string){
var pattern = /^[A-Za-z]*$/
if(!pattern.test(string)){
return true
}
return false
},
//检查数字输入
checkNum : function (string){
var pattern = /^[0-9]*$/
if(!pattern.test(string)){
return true
}
return false
},
//不能为纯下划线
checkLine : function (string){
var str = string.replace(/_/g,"")
if(str == null || str ==""){
return true
}
return false
},
//只能输入字母数字下划线
checkEnNumLine : function (string){
var pattern = /^(?:[\w]*)?$/
if(!pattern.test(string)){
return true
}
return false
},
//只能是字母、数字、下划线、空格、中文字符
checkEnNumLineSpaceCN : function (string){
var pattern = /^(?:[\w\s\u4e00-\u9fa5']*)?$/
if(!pattern.test(string)){
return true
}
return false
},
//检查身份证号
checkIdCard : function (string){
var pattern = /^([0-9]{15}|[0-9]{18})$/
if(!pattern.test(string)){
return true
}
return false
},
//测试
test : function (a){
var str = document.getElementById(a).value
alert(this.checkNull(str))
}
}
String.prototype.len = function(betyLen){
var len = 0
for(var i=0i<this.lengthi++){
if(this.charCodeAt(i)>127){
len +=betyLen
}else{
len ++
}
}
return len
}
var URL = {
//编码
encode : function (string) {
return escape(this.utf8_encode(string))
},
//解码
decode : function (string) {
return this.utf8_decode(unescape(string))
},
//UTF-8 编码
utf8_encode : function (string) {
string = string.replace(/\r\n/g,"\n")
var utftext = ""
for (var n = 0n <string.lengthn++) {
var c = string.charCodeAt(n)
if (c <128) {
utftext += String.fromCharCode(c)
}
else if((c >127) &&(c <2048)) {
utftext += String.fromCharCode((c >>6) | 192)
utftext += String.fromCharCode((c &63) | 128)
}
else {
utftext += String.fromCharCode((c >>12) | 224)
utftext += String.fromCharCode(((c >>6) &63) | 128)
utftext += String.fromCharCode((c &63) | 128)
}
}
return utftext
},
//UTF-8解码
utf8_decode : function (utftext) {
var string = ""
var i = 0
var c = c1 = c2 = 0
while ( i <utftext.length ) {
c = utftext.charCodeAt(i)
if (c <128) {
string += String.fromCharCode(c)
i++
}else if((c >191) &&(c <224)) {
c2 = utftext.charCodeAt(i+1)
string += String.fromCharCode(((c &31) <<6) | (c2 &63))
i += 2
}else {
c2 = utftext.charCodeAt(i+1)
c3 = utftext.charCodeAt(i+2)
string += String.fromCharCode(((c &15) <<12) | ((c2 &63) <<6) | (c3 &63))
i += 3
}
}
return string
},
//测试
test : function (a){
var str = document.getElementById(a).value
}
}
function checkstr(str) {
num=str.length
var arr=str.match(/[^\\\\\\\\\\\\\\\\x00-\\\\\\\\\\\\\\\\x80]/ig)
if(arr!=null){
num+=arr.length
}
}
var Crypt = {
//加密
Encrypt : function (value){
var encryptStr = new Array()var i
for(i=0i<value.lengthi++){
encryptStr+=""+value.charCodeAt(i)+""
}
return encryptStr
},
//解密
Decrypt : function (value){
var decryptStr = new Array()var i
var s=value.split("")
for(i=0i<s.lengthi++){
s[i]=s[i].replace('','')
decryptStr+=String.fromCharCode(s[i])
}
return decryptStr
}
}