



网络游戏的娱乐性、新鲜性可以相对缓解工作上的疲劳,但是过度的玩网络游戏则会影响工作、生活、学习。我们应自觉遵守新闻出版总署公布的健康游戏忠告:抵制不良游戏,拒绝盗版游戏。注意自我保护,谨防受骗上当。适度游戏益脑,沉迷游戏伤身。合理安排时间,享受健康生活。本节将介绍使用数组实现“2048”游戏关键算法。
“2048”游戏界面,如图3-2所示。游戏的规则是通过按键“↑”“→”“↓”“←”控制所有方块向同一个方向运动,两个相同的数字方块撞在一起之后合并成为它们的和,每次操作之后会随机生成一个数字2,最终得到一个“2048”的方块时代表胜利。
图3-2 “2048”游戏界面
如图3-2所示,将第一列数据自上而下看作数组[0,0,2,0],当用户此时按键盘的“↑”键,会得到如图3-3所示的界面。
由图3-3可知,第一列的数据变成数组[2,0,0,0]。当用户此时再按键盘的“←”键时,会得到如图3-4所示的界面。由图3-4可知,第二行的数据从数组[0,0,2,0]变成[2,0,0,0]。
图3-3 按“↑”键后的游戏界面
图3-4 按“←”键后的游戏界面
经分析,按照游戏规则,当按键盘的“↑”键时,将游戏看成4列数据,即将4个数组转换为新的4个数组;其余按键规则一致。因此“2048”游戏关键算法是将4行或4列数据的每行或每列,从一个数组按规则变换为另一个数组。数组数据是以2为基数的任意数值,例如0、2、4、8、16、32、64、128等,长度是4。数组变换规则如下:
(1)从索引号为0的第一个元素开始,相邻两个元素两两比较。
(2)如果数组元素的值是0则跳过,和下一位比较。
(3)若比较的两个元素不一致,则将当第一个元素放入新数组,第二个元素继续两两比较。
(4)若比较的两个元素一致,则将两个元素相加的结果放入新数组,并从下一个没有参与比较的元素继续开始比较。
(5)若新数组长度小于4,则在转换后的数组末尾插入0,使它长度等于4。
数组变换示例如表3-2所示。
表3-2 数组变换示例
1 <!DOCTYPE html>
2 <html lang="en">
3 <head>
4 </head>
5 <body>
6 <script>
7 var arr = [0,2,0,2];// 测试数据
8 var newArr = [];
9 for (var i = 0; i < arr.length; i++) {
10 // 数组元素的值是0,则跳过
11 if (arr[i] != 0) {
12 // 找到下一个值不是0的元素
13 for (var j = i + 1; j < arr.length; j++) {
14 if (arr[j] != 0) break;
15 }
16 // 若比较的两个元素不一致
17 if (arr[i] != arr[j]) {
18 // 将当前值放入新数组
19 newArr.push(arr[i]);
20 } else {
21 // 若比较的两个元素一致,相加的结果放入新数组
22 newArr.push(arr[i] + arr[j]);
23 // 从下一个没参与比较的元素继续开始比较
24 i = j;
25 }
26 }
27 }
28 // 若变换后的数组长度小于4,则在转换后的数组末尾插入0
29 if (newArr.length < 4) {
30 for (var i = 0; i < arr.length; i++) {
31 if (!newArr[i]) newArr[i] = 0;
32 }
33 }
34 console.log(newArr);
35 </script>
36 </body>
37 </html>
案例程序中,第7行代码定义了一个测试数组arr,它有4个元素;第8行代码定义了一个转换后的新数组newArr;第9~27行代码按照数组变换规则,通过for循环两两比较数组中的每个元素;第29~33行代码判断数组长度,如果小于4,则在转换后的数组末尾插入0;第34行代码输出新数组的值。案例程序在Chrome浏览器控制台的输出结果,如图3-5所示。
图3-5 案例输出结果