title: qt-2048
categories: qt
data: 2015-11-30 12:22:11
tages: qt,2048,游戏
2048前言
这个2048是在别人的代码上学习,修改得来的,谢谢别人的分享。
整体思考
使用paintEvent,不停的重绘界面,4 * 4 的方格不停的重绘,
keyPressEvent,控制键盘敲击事件,整体的思路是这样。
难点分析
2048最难的是算法的实现,我们如何实现方块的移动,数字的叠加,判断是否结束,
for (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来控制计数,
这样一来所有的数据都排列在一起,便于后面的操作,
我们通过比较相邻两个数是否一样可以判断是否可以相加。
随机数
int i,j;
memset(&array[0][0],0,sizeof(array));
qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));
i = qrand() % 4;
j = qrand() % 4;
array[i][j] = (qrand() % 2 + 1) * 2;
do {
i = qrand() % 4;
j = qrand() % 4;
}while (array[i][j] != 0);
array[i][j] = (qrand() % 2 + 1) * 2;
score=0;
开始的两个方块是随机的,每次产生一个方块也是随机的,void qsrand(uint seed),
使用时间做种子,因为时间是一个变量,然后产生x,y坐标就好了。
游戏结束
for (int i=0;i < 4;i++)
{
for (int j = 0;j <3;j++)
{
if (array[i][j] == array[i][j+1] || array[i][j] == 0)
{
return false;
}
}
if (array [i][3] == 0)
return false;
}
for (int i = 0;i < 3;i++)
{
for (int j = 0;j < 4;j++)
{
if (array[i][j] == array[i+1][j])
{
return false;
}
}
}
当每一行,每一列,都没有0,没有相同的两个数相邻时,游戏就结束了,
算法判断如上。
完成
我本来想在界面上添加一些button,但是添加完后界面就卡住了,
这是很奇怪的,我想因为重绘界面时没有重绘button,程序卡在主线程,
之后有机会我会在试试。