ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

qt实现24点计算

2022-03-20 18:34:48  阅读:171  来源: 互联网

标签:24 qt int unsigned char flag num 计算


突然接触24点游戏,突发奇想,是否可以全排列方式来进行计算,首先,建立一个类

class S_24_C
{
public:
    #define Max_Num (4*3*2)
    //#define Max_Num1 (4*4*4*4)
    S_24_C();
    unsigned char sour_num[4];
    unsigned char sour_num_order;//填入sour_num的下标
    unsigned char order_date[Max_Num][4];
    unsigned char result_date[4] = {24,24,24,24};
    unsigned char fuhao_date[4] = {0,0,0,0};
    //unsigned char yunsuan_date[Max_Num1][4];
    enum
    {
        no_err,
        reduce_err,//减法错误
        chu_err,//除法法错误
    }error_code;
    void set_sour_num(unsigned char num);
    void clr_sour_num();
    void paixu_2(unsigned char *num1,unsigned char *num2);//两个数排序
    void paixu_3(unsigned char *num,unsigned char flag);
    void paixu_4(unsigned char (*dest)[4], unsigned char *num,unsigned char flag);
    void fill_yunsuan(unsigned char dest[][3], unsigned char *num,unsigned char flag);
    unsigned int cal(unsigned int num,unsigned int num1,unsigned char flag);
    void start_c(const unsigned char* num);//进行计算
    unsigned int add    (unsigned int a,unsigned int  b);//加运算
    unsigned int reduce (unsigned int a,unsigned int  b);//减运算
    unsigned int cheng  (unsigned int a,unsigned int  b);//乘法运算
    unsigned int chu    (unsigned int a,unsigned int  b);//除法运算
    void memcpy(unsigned char *dest,unsigned char*sour,unsigned int length);
private:

};

全排列的方式为,先做两个数的排列,有两种情况,本质为两个数交换

void  S_24_C::paixu_2(unsigned char *num1,unsigned char *num2)
{
    unsigned char temp;
    temp = num1[0];
    num1[0] = num2[0];
    num2[0] = temp;
}

三个数全排列

void  S_24_C::paixu_3(unsigned char *num,unsigned char flag)
{
    unsigned char temp;
    if(0 == flag)
    {

    }
    else if(1 == flag)
    {
        paixu_2(&num[1],&num[2]);
    }
    else if(2 == flag)
    {
        paixu_2(&num[0],&num[1]);
        paixu_2(&num[0],&num[2]);
    }
    else if(3 == flag)
    {

        paixu_2(&num[1],&num[2]);
    }
    else if(4 == flag)
    {
        paixu_2(&num[0],&num[1]);
        paixu_2(&num[0],&num[1]);
    }
    else if(5 == flag)
    {

        paixu_2(&num[1],&num[2]);
    }

}

四个数的全排列,将一个序列的首字符与其他位对换,使用三个排列的函数进行排列,将所得的序列考入到一个二维数组中。

void  S_24_C::paixu_4(unsigned char (*dest)[4], unsigned char *num,unsigned char flag)
{
    unsigned char temp;
    unsigned char i = 0,k = 0,a =0;
    unsigned int j = 0;
    unsigned char buffer[4];
    for(k = 0;k<4;k++)
    {
        //此处对buffeer重新赋值
        memcpy(buffer,num,4);
        if(k)
            paixu_2(&buffer[0],&buffer[k]);
#if 1
        for(i = 0;i<6;i++)
        {
            paixu_3((buffer+1),i);
#if 0
            for(a = 0;a< 4;a++)
            {
                order_date[j][a] = buffer[a];
            }
            j++;
#endif
            memcpy((unsigned char*)dest[j++],buffer,4);
        }
#endif
    }

}

同时也要将各种计算的加减乘除各种排列排列出来,1代表加,2代表减,3代表乘,4代表除法,排列

void  S_24_C::fill_yunsuan(unsigned char dest[][3], unsigned char *num,unsigned char flag)
{
    unsigned char temp;
    unsigned char i = 0,j = 0,k = 0,a = 0;
    unsigned int b = 0;
    unsigned char buffer[3];


    for(a = 0;a <4;a++)
    {
        buffer[0] = num[a];
        for(k = 0;k < 4;k++)
        {
            buffer[1] = num[k];
            for(j = 0;j <4;j++)
            {
                buffer[2] = num[j];
                memcpy(dest[b++],buffer,3);
            }
        }
    }
}

然后将数值和运算符号进行组合,将加减,乘除使用函数包装为了防止减,出现负数,和除法,有余数,导致计算失误,

unsigned int  S_24_C::cal(unsigned int num,unsigned int num1,unsigned char flag)
{

    unsigned char i;
    unsigned int result;
    #if 1
    if(1 == flag)
        result = add(num,num1);
    else if(2 == flag)
        result = reduce(num,num1);
    else if(3 == flag)
        result = cheng(num,num1);
    else if(4 == flag)
        result = chu(num,num1);
    #endif
    return result;
}

进行运算

unsigned int  S_24_C::cal(unsigned int num,unsigned int num1,unsigned char flag)
{

    unsigned char i;
    unsigned int result;
    #if 1
    if(1 == flag)
        result = add(num,num1);
    else if(2 == flag)
        result = reduce(num,num1);
    else if(3 == flag)
        result = cheng(num,num1);
    else if(4 == flag)
        result = chu(num,num1);
    #endif
    return result;
}
void S_24_C::start_c(const unsigned char* num)//进行计算
{
    unsigned char i,x,y,a,b;
    unsigned char source_date[4];
    unsigned int j = 0,k = 0;

    unsigned char yun[4] = {1,2,3,4};//1代表加,2代表减,3乘法
    unsigned int result = 0;
    unsigned int result_1 = 0;

    #if 0
    for(i = 0;i<sizeof(order_date);i++)
    {
        *((unsigned char*)order_date+i) = 0;//清除数据
    }
    #endif
    for(i = 0;i<sizeof(source_date);i++)
    {
        source_date[i] = num[i];//复制数据
    }

    paixu_4(order_date,source_date,0);//24种情况已经计算好,存储在order_date yunsuan_date
    fill_yunsuan(&yunsuan_date[0],yun,0);


#if 1
    error_code = no_err;
    for(k = 0;k<Max_Num;k++)
    {
        for(j = 0;j< Max_Num1;j++)
        {
                qDebug( "order %d,%d,%d,%d", order_date[k][0],order_date[k][1],order_date[k][2],order_date[k][3]);
                qDebug( "yunsuan %d,%d,%d",yunsuan_date[j][0],yunsuan_date[j][1],yunsuan_date[j][2] );
                if(!error_code)
                {

                    result =cal(order_date[k][0],order_date[k][1],yunsuan_date[j][0]);
                }
                if(!error_code)
                {

                    result =cal(result,order_date[k][2],yunsuan_date[j][1]);
                }
                if(!error_code)
                {

                    result =cal(result,order_date[k][3],yunsuan_date[j][2]);
                }
                qDebug( "result %d",result );

                qDebug( "------------------------------------------------");

                if((24 == result)&&(!error_code))
                {
                    sour_num_order = 10;
                    memcpy(result_date,order_date[k],4);
                    memcpy(fuhao_date,yunsuan_date[j],3);
                    return ;
                }
                else
                {
                    error_code = no_err;
                }

                
                qDebug( "order %d,%d,%d,%d", order_date[k][0],order_date[k][1],order_date[k][2],order_date[k][3]);
                qDebug( "yunsuan %d,%d,%d",yunsuan_date[j][0],yunsuan_date[j][1],yunsuan_date[j][2] );
                if(!error_code)
                {

                    result =cal(order_date[k][0],order_date[k][1],yunsuan_date[j][0]);
                }
                if(!error_code)
                {

                    result_1 =cal(order_date[k][2],order_date[k][3],yunsuan_date[j][2]);
                }
                if(!error_code)
                {

                    result =cal(result,result_1,yunsuan_date[j][1]);
                }
                qDebug( "result %d",result );

                qDebug( "------------------------------------------------");

                if((24 == result)&&(!error_code))
                {
                    sour_num_order = 11;
                    memcpy(result_date,order_date[k],4);
                    memcpy(fuhao_date,yunsuan_date[j],3);
                    return ;
                }
                else
                {
                    error_code = no_err;
                }


        }
    }
#endif
}

运行截图

 

以上数字输入使用按钮控件,数字结果使用label控件,

程序编译后打包使用命令行windeployqt打包程序,解决依赖关系,以上在widow下编译运行

软件包地址qt实现游戏24点计算-其它文档类资源-CSDN下载qt实现24点计算更多下载资源、学习资料请访问CSDN下载频道.https://download.csdn.net/download/qq_43683623/85008672

标签:24,qt,int,unsigned,char,flag,num,计算
来源: https://blog.csdn.net/qq_43683623/article/details/123617738

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有