2048前言
这个2048是在别人的代码上学习,修改得来的,谢谢别人的分享。
整体思考
使用paintEvent,不停的重绘界面,4 * 4 的方格不停的重绘,
keyPressEvent,控制键盘敲击事件,整体的思路是这样。
难点分析
2048最难的是算法的实现,我们如何实现方块的移动,数字的叠加,判断是否结束,1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28for (int i = 0; i < 4; i++)
{
int j, k, key = 0;
// move
for (j = 0; j < 4; j++)
{
if (array[i][j] == 0)
continue;
array[i][key++] = array[i][j];
}
// add
for (j = 0, k = 0; j < key-1; j++, k++)
{
if (array[i][j] == array[i][j+1])
{
array[i][k] = array[i][j] * 2;
score += array[i][k];
j++;
}
else
array[i][k] = array[i][j];
}
if (j == key - 1)
array[i][k++] = array[i][j];
// clear others
for (j = k; j < 4; j++)
array[i][j] = 0;
}
用左移来分析一下,将右边的非零数向左移,用将j,k来控制计数,
这样一来所有的数据都排列在一起,便于后面的操作,
我们通过比较相邻两个数是否一样可以判断是否可以相加。
随机数
1 | int i,j; |
开始的两个方块是随机的,每次产生一个方块也是随机的,void qsrand(uint seed),
使用时间做种子,因为时间是一个变量,然后产生x,y坐标就好了。
游戏结束
1 | for (int i=0;i < 4;i++) |
当每一行,每一列,都没有0,没有相同的两个数相邻时,游戏就结束了,
算法判断如上。
完成
我本来想在界面上添加一些button,但是添加完后界面就卡住了,
这是很奇怪的,我想因为重绘界面时没有重绘button,程序卡在主线程,
之后有机会我会在试试。