qt-2048

作者: jeffleefree | 来源:发表于2016-04-14 20:05 被阅读626次

    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,程序卡在主线程,
    之后有机会我会在试试。

    相关文章

      网友评论

          本文标题:qt-2048

          本文链接:https://www.haomeiwen.com/subject/aunglttx.html