在面试的时候被面试官问道2048的实现思路,以下是总结。
2048小游戏思路
1、初始化,在空格子中产生两个2,4的随机数。
(1)封装生成随机数方法,将min + Math.round((max-min) * Math.random())封装为getRandom(min,max)方法,该方法接受两个值,最大值max和最小值min,getRandom方法是获取[min,max]之间的一个随机数;
(2)封装生成随机数,放入空格子中的方法createFunc(),首先生成两个随机的[0,3]之间的随机数,锁定一个格子的横纵坐i,j,即i=getRandom(0,3),j=getRandom(0,3),然后判断arr[i][j]中的值是否为空,为空则随机生成一个2或4,放入该空格子中即arr[i][j]=getRandom(1,2)2;若判断arr[i][j]中有数值,则遍历arr数组值判断棋盘是否满了,如果没有满则再次执行createFunc()方法;
(3)封装初始化方法initFunc(),将44的table中的每个cell赋予固定的id,id=‘i’+‘j’,arr数组值赋为空,调用两次createFunc()方法,在table中随机的cell中生成两个2或4;
2、监听键盘向上/下/左/右,封装监听方法monitorFunc(),监听输入的上下左右按键的keyCode,以上按键为例子(keyCode=38),首先至上到下遍历数组(如果是下按键,则至下到上遍历),然后需要一个指针q(在n*n中,指针的范围0~n-1),指针指向格子的上方,用i,j表示格子的坐标,遍历出不为空的坐标,上移过程中,从上到下开始移动,然后分几种不同的情况:
(1)q指向的为数字不同的格子,则停止移动;
(2)q指向的为数字相同的格子,格子向上移动moveFunc(),q(范围0~n-1)继续向上移动,循环该步骤,直到超出q的取值;
(3)q指向的为数字相同的格子,则向q格子合并mergeFunc(),q(范围0~n-1)继续向上移动,循环该步骤,直到超出q的取值;
3、移动格子,合并数字相同的格子
(1)封装移动方法moveFunc(i1,j1,i2,j2),该方法传入起cell起始坐标(i1,j1),终点坐标(i2,j2),将原始坐标的值赋予终点坐标,再将起始坐标的值清空,再根据cell的坐标i,j进行拼接,获取cell的id值,对起始cell和终点cell的值进行修改渲染;
(2)封装移动方法mergeFunc(i1,j1,i2,j2),该方法传入cell起始坐标(i1,j1),终点坐标(i2,j2),将起始和终点的value值相加,保存在变量temp中,在将temp中值赋予(i2,j2),同时清空(i1,j1)中的值,再根据cell的坐标i,j进行拼接,获取cell的id值,对起始cell和终点cell的值进行修改渲染;
(3)分数统计,定义全局变量grade用于统计分数,在mergeFunc方法中,每完成一次合并则grade++;
4、判断游戏结束
(1)判断游戏是否胜利,遍历数组,如有一个值为2048则胜利;
(2)若还有空格子,或还有相邻相等的值,则游戏继续,这里需要封装checkFunc()方法。先变量arr二维数组,是否村子为空的值,若存在,则return false,继续游戏,若不存在,则判断arr[i][j]的值是否等于arr[i+1][j]或arr[i][j+1],若存在,则return false,继续游戏,若条件都不满足,则游戏结束alert(‘游戏结束’+ this.grade);