C++实现24点游戏算法

朋友上C++语言程序设计才上了3周,老师就布置了一个24点游戏算法的程序设计题目。。因为我们并不是计算机科学专业的,,所以我还是帮他把这个作业做了一下,分享出来给又需要的童鞋吧。非常巧妙地算法我是没有想到,但是一般大家都应该会想到用穷举法把这个问题解决掉。那么我也参考了一下网上一些大神的写法,基本上最好的解决方法还是使用穷举法通过递归来解决这个问题。因为代码我已经把基本注释写的比较清楚了,所以就直接上代码了。。后面其实可以考虑用游戏引擎做一个简单的24点的单机小游戏,嘿嘿(●ˇ∀ˇ●)。。加点AI什么的还是蛮有意思的。。。有什么问题请大家多多指教,毕竟我还是菜及一只,努力学习中!

#include<math.h>
#include<stdlib.h>
#include<string>
#include<iostream>
using namespace std;

#define ZERO 0
#define ArraySize 4




//二十四点算法--穷举法
class  TwentyFourAlgorithm
{
public:
    //默认构造函数
     TwentyFourAlgorithm();
    ~ TwentyFourAlgorithm();
    //含参构造
    TwentyFourAlgorithm(double *numb);
    //是否可以组成24点?
     bool IsTwentyFour(int num);
     //输出当前算式
     void printCurrentFormula();

private:
    //存放用户生成数字的数组
    double *number;
    //存放显示的结果算式
    string *formula;
    //打印当前数据
    void printCurrentNum();
};

TwentyFourAlgorithm::TwentyFourAlgorithm(double *numb)
{
    number = new double[ArraySize];
    formula = new string[ArraySize];
    number = numb;

    for (int i = 0; i < ArraySize; i++)
    {
        bool record = true;
        char buffer[20];
        sprintf_s(buffer, "%f", numb[i]);

        for each (char c in buffer)
        {
            if (c != '.')
            {
                if (record)
                formula[i] += c;
            }
            else
            {
                record=false;
            }
        }

    }


    printCurrentNum();
}

 TwentyFourAlgorithm::TwentyFourAlgorithm()
 {
     number = new double[ArraySize];
     formula = new string[ArraySize];
     for (int i = 0; i < ArraySize; i++)
     {
         number[i] = 0;
     }
     printCurrentNum();
 }

 TwentyFourAlgorithm::~ TwentyFourAlgorithm()
{
    delete number;
    delete formula;
}

 void TwentyFourAlgorithm::printCurrentNum()
 {
     cout << "当前输入数据为: ";
     for (int i = 0; i < ArraySize; i++)
     {
         cout << number[i] << " ";
     }
     cout << endl;
 }

 void TwentyFourAlgorithm::printCurrentFormula()
 {
     cout << "当前算式为 " << formula[0] << endl;
 }
 //是否可以组成24点?
 bool TwentyFourAlgorithm::IsTwentyFour(int num)
{
    if (num > ArraySize)
    {
        cout << "输入数字个数大小越界!" << endl;
        return false;
    }

    //若当前只剩一个数字,检测该数字是否为24?true:false
    if (num == 1)
        return (abs(number[0] - 24) == ZERO);

    //双层循环将num个数字进行所有情况组合
    for (int i = 0; i < num; i++)
    {
        for (int j = i + 1; j < num; j++)
        {
            double firstNum, secondNum;
            string firstFormula, secondFormula;

            //获取组合中两个数字
            firstNum = number[i];
            secondNum = number[j];
            //将最后一个数字存放到j下标中,注:考虑到下一轮递归时num--了,而前两个数字合并进入i下标,j下标为空,但j下标依然存在下一轮的数据处理中
            number[j] = number[num - 1];

            //算式
            firstFormula = formula[i];
            secondFormula = formula[j];
            formula[j] = formula[num - 1];
            //加法算式
            formula[i] = "(" + firstFormula + "+" + secondFormula + ")"; 
            number[i] = firstNum + secondNum;
            //进入递归查看当前选择加法模式时,剩余的数字是否可以组合成24点
            if (IsTwentyFour(num - 1))
                return true;
            //若加法递归不成,则尝试其他情况,以下同理

            //减法 
            formula[i] = "(" + firstFormula + "-" + secondFormula + ")"; 
            number[i] = firstNum - secondNum;
            if (IsTwentyFour(num - 1))
                return true;
            formula[i] = "(" + secondFormula + "-" + firstFormula + ")";
            number[i] = secondNum - firstNum;
            if (IsTwentyFour(num - 1))
                return true;

            //乘法
            formula[i] = "(" + firstFormula + "*" + secondFormula + ")";
            number[i] = firstNum * secondNum;
            if (IsTwentyFour(num - 1))
                return true;
            //除法
            if (secondNum != 0) {
                formula[i] = "(" + firstFormula + "/" + secondFormula + ")"; // 看看除法能否算 
                number[i] = firstNum / secondNum;
            if (IsTwentyFour(num - 1))
                    return true;
            }


            if (firstNum != 0) {
                formula[i] = "(" + secondFormula + "/" + firstFormula + ")";
                number[i] = secondNum / firstNum;
                if (IsTwentyFour(num - 1))
                    return true;

                //情况都无法成功,重置数据,进行下一轮的组合。 
                number[i] = firstNum;
                number[j] = secondNum;
                formula[i] = firstFormula;
                formula[j] = secondFormula;
            }
        }
        return false;
    }
}

简单主程序测试一下

#include"TwentyFourClass.h"
//
TwentyFourAlgorithm *tfAlgorithm;


//判断是否可以组成24点
void JudgeIsTwentyFour()
{
    if (tfAlgorithm->IsTwentyFour(4))
    {
        cout << "可以组成24点" << endl;
        tfAlgorithm->printCurrentFormula();
    }
    else
    {
        cout << "不可以组成24点" << endl;
    }
}


void main()
{
    double demo[] = {1,1,2,12};
    tfAlgorithm = new TwentyFourAlgorithm(demo);
    JudgeIsTwentyFour();
}

最后附上下载项目链接:
http://pan.baidu.com/s/1nttg40x

这个本身的难度并不大,如果有可能的话下次做个24点的网络游戏玩玩吧,嘿嘿嘿。。。。。

你可能感兴趣的:(C++-24点游戏)