流倏MFC24点游戏

    大二自学MFC以来,已经有一年的光景。期间照着书本和网络教程也做了不少基本项目,然而基本只上都是练习抄写代码而已,大多不理解。大三这学期开始,我试着想要自己编写程序。

    首先想到的是把以前C语言的课程设计用MFC做成有界面的实用软件。基于编程的趣味性,我选择从做24点游戏开始。虽然用C语言做过,但用MFC来做,还是有很大的不同,这并不是直接把代码移植过来就能解决问题的,对于一些基本控件操作都还很陌生得我来说,这不得不说还是蛮有挑战性的。

    要让程序顺利编写出来,首先当然得熟悉基础,于是我把以前做过的基本项目重新翻出来看看,并且不时借助网络和图书馆查阅了大量资料,慢慢的明白以前那些没看懂的代码,基本算是熟悉了要用到的控件的基本操作。

    但这还只是基本中的基本而已。要编写出程序,还得想出好的算法并写出代码。

    参考以前的C程序,想了想,得到下面的算法过程:

    程序主要分为4个功能大块:

    1. 发牌系统(Deal System);

    2. 用户计算系统(User Caculate System);

    3. 计算机解题系统(Computer Caculate System);

    4. 帮助系统(Help System)。

    以及若干功能小块,包括:难度等级、分数统计、局数统计、背景音乐等等。

    以下主要说明4个功能大块。

    1. 发牌系统(Deal System)

    利用Srand()和Rand()函数产生4个随机数,每个随机数对应牌的整形ID号,这个部分比较简单,略谈。用到函数Void DealSystem();

    2. 用户计算系统(User Caculate System)

    首先,该模块要接受用户输入的表达式数据;判断数据是否合法,包括括号匹配、数字是否与牌面相符、是否输入了无关字符,如果合法,则利用堆栈,计算出表达式结果,若果非法,则提示重新输入。

    l 接受数据部分利用编辑框控件很好实现,添加Onchange()函数就能解决;

    l 判断合法部分分为括号匹配、数字是否与牌面相符、是否输入了无关字符三个部分。

    该部分在函数Bool bIsLeagal(char *Inpute)中实现。算法为,首先建立数组两个栈:一个整型,一个字符型,分别用来存储数字和运算符及括号。char *Inpute为指向用户输入字符串的指针,利用While循环,一个一个向后查找,嵌套if语句。

    while(*Input!=’\0′)//Inputer非空

    {

    if(*Inpute >=’0’&&*Inpute <=’9′)

    压入数字栈,其中要用嵌套一个While循环,因为判断的是单个字符,但输入的数字可能是两位数,这就必须把前一个数字乘以10再加上当前字符值。

    if(*Inpute ==‘(‘)

    压入字符栈;

    else if(*Inpute== ‘)’)

    栈顶指针是否为“(”,如果是,栈顶指针退一个单元,“(”出栈

    else if(*temp>=65)//ASCII值大于65即含英文字符,非法

    设置非法标志bIsOverFlow=true;

    }

    利用以上结果,如果字符栈非空,则括号不匹配;如果数字栈长度大于4,则输入的字符过多,非法;bIsOverFlow为真,非法。如果数字栈长度刚好为4,还得判断是后与牌面相符。这里要用到发牌系统的结果,4个随机数,如果数字栈中的4个数字与4随机数相同,则输入合法。判断完毕。

    l 计算部分,函数:void OnCalc();该部分比较繁琐,参照以前算法,基本思路如下:先定义好四则运算法则。同合法判断一样,用一个While循环。

    while(*Input!=’\0′)

    {

    switch(*Input)

    {

    case ‘(‘:

    入字符栈。

    case ‘)’:

    从合法数字栈中弹出两个数,从字符栈中弹出一个运算符,利用法则运算,结果压入数字栈,同时字符栈退一单元。

    case ‘+’:

    case ‘-‘:

    case ‘*’:

    case ‘/’:

    利用法则运算,结果压入数字栈,同时字符栈退一单元

    }

    然后用一个变量保存数字栈中的第一个元素,即运算的最终结果。

    3. 计算机解题系统(Computer Caculate System);

    该部分用另一个窗口给出。由于函数较多,算法繁琐,另外建立一个类OnComputer成员函数有:

    void OnComputer::faze(float x, float y);//运算法则,

    void OnComputer::jieguo1(int w, float x, float y);//中间结果1

    void OnComputer::jieguo2(int w, float x);//中间结果2

    void OnComputer::computer();//计算结果

    基本算法为:首先利用主窗口类传递过来的四个参数。利用四个函数,计算穷举所有运算,如果等于24,则用Cstring 的一个变量保存起来,一条一条添加到列表控件中。

    4. 帮助系统(Help System)。

    添加一些软件版本信息,版权,作者等内容,没有涉及什么算法,略过。

    其他一些小功能模块比较简单,在此略过。

    接下来就是界面设计,添加图片资源,根据算法,一个一个写出实现代码,由于代码太过繁琐,在此略过。

    软件运行效果如下:

    主界面:

    a8710cef4b9bb0d5b0fb9569

    用户解题系统:

    b4156f8649a6d004c45cc369f1d83208c9c595e139c7636a
    21b7a6df6079697a96ee3769


    0c6df31f5c2418314334176a

    提示(计算机解题系统)

    586e813e956c41ec7f1e716a

    帮助系统:

    2f6dd2d77f877b0105088b6b

     

    下载地址:

    http://download.csdn.net/detail/sharlon123/1764928

    http://download.csdn.net/detail/sharlon123/1764456 (源码)



    本站所有文章如无特别注明均为原创。
    转载请注明:流倏 » 流倏MFC24点游戏

    点赞 | 0

已经有1 人抢在你前面了~

  • Coltin 1年前 (2017-01-06)

    I was really confused, and this answered all my qusntioes.