qt-2048

title: qt-2048
categories: qt
data: 2015-11-30 12:22:11
tages: qt,2048,游戏


2048前言

这个2048是在别人的代码上学习,修改得来的,谢谢别人的分享。

整体思考

使用paintEvent,不停的重绘界面,4 * 4 的方格不停的重绘,
keyPressEvent,控制键盘敲击事件,整体的思路是这样。

qt-2048_第1张图片

难点分析

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来控制计数,


qt-2048_第2张图片

这样一来所有的数据都排列在一起,便于后面的操作,
我们通过比较相邻两个数是否一样可以判断是否可以相加。

随机数

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,没有相同的两个数相邻时,游戏就结束了,
算法判断如上。

完成

qt-2048_第3张图片

我本来想在界面上添加一些button,但是添加完后界面就卡住了,
这是很奇怪的,我想因为重绘界面时没有重绘button,程序卡在主线程,
之后有机会我会在试试。

你可能感兴趣的:(qt-2048)