24点游戏的开发和实现—vc毕业设计内容摘要:

UpdateData(true)。 temp=m_edit。 timercount。 m_edit4=timercount。 UpdateData(FALSE)。 } if(timercount=0) {KillTimer(1)。 timercount=30。 (CButton*)CWnd::GetDlgItem(IDC_BUTTON5)EnableWindow(TRUE)。 } 查看如上函数,我们看到的关键函数就只有一个,那就是 KillTimer 函数。 我们从他的拼写可以看 到,其意思是消除时间。 其中还用到了控制时间秒数的变量 timercount,在如上函数中其最大直为 30,则说明游戏将在 30 秒内结束。 另外在时间控制下,其他一些控件也要实行相应的变化。 在如上程序中, id 为IDCBUTTON5 的空件在时间结束的时候要消除灰化。 游戏的开始和结束控制 每个游戏都有其游戏的开始控制和结束控制,当然 24 点游戏也不例外。 因此要控制游戏的开始结束也是游戏中必要的控件。 我们来看下其程序: void CWorkView::OnButton5() {if(istimer==false) {SetTimer(1,1000,NULL)。 (CButton*)CWnd::GetDlgItem(IDC_BUTTON5)EnableWindow(FALSE)。 (CButton*)CWnd::GetDlgItem(IDC_BUTTON3)EnableWindow(FALSE)。 (CButton*)CWnd::GetDlgItem(IDC_BUTTON2)EnableWindow(FALSE)。 (CButton*)CWnd::GetDlgItem(IDC_BUTTON4)EnableWindow(FALSE)。 }} 其中在控件中我们添加了控件 BUTTOM5,用于控制游戏的开始。 当按下开始按钮时,我们将控件 BUTTTON3, 2, 4都灰化。 这就实现了简单的游戏开始控制。 结束按钮和开始按钮大同小异,这里我们就不详细介绍了。 游戏的实现其具体的函数 游戏实现后的主要界面 完成了以上 4 大节工作之后,一个简单的 24 点游戏程序就基本生成了。 接着就是在程序上做简单的修改,查漏补缺。 通过游戏的连接,编译并运行。 运行没有出错,程序就运行如下。 从界面中我们看到了其中的主要功能都 具备了。 有相应的表达式输入功能,查看结果功能,显示正确答案功能,重新发牌,牌面设置以及定时控制。 在菜单中有文件和帮助两个主菜单。 其中文件菜单中有开始和结束控制。 如下分细节对系统实现进行分析,首先我们来看下按下设置牌面产生的效果。 我们看到,在按下了设置牌面的时候,弹出一个牌面设置的窗口。 在请输入牌面的输入框中默认了牌面数字全为 1,当然我么可以将其改写,比如我们改为 3 4 3 5 并按下确定,则弹出如下窗口。 我们可以看到按照如上的 要求我们实现了牌面的自定义功能。 接着我们来看看表达式输时产生的一些错误信息提示,包括语法错误,括号匹配,数字匹配等。 我在如下一一都显示出来。 其中的 3 个错误我们可以清楚的看到,当我们看到在第一个窗口中输入了与纸牌数字不正确的数字之后,提示了“请注意输入的数值是否正确”。 在第二个窗口中输入了左括号后直接点击“单机查看结果”键时弹出“括号不匹配”的错误提示。 在第三个窗口中输入“方法”俩汉字 的时候,我们看到了“输入语法错误”的提示。 以上我将所有的错误信息都做了很好的图文说明。 以下是输入正确表达式,并得出 24 点算法后的界面显示。 我们在牌面设置的时候输入 5 5 5 1 4 个数字的时候,显示正确结果的截面如下。 如上我们看到界面中弹出了“计算正确”的消息框,实现了 24 点游戏表达式的最后判别。 24 点算法的程序实现 //计算 24点的答案程序 BOOL Calc24(int iNum1, int iNum2, int iNum3, int iNum4, CStringamp。 strResult) // { //括号的几种情况 //无括号 //2 (a b) c d 同 a b (c d), 下省略 //3 (a b c) d //4 a (b c)d //5 (a b) (c d) //6 ((a b) c) d //7 (a (b c)) d int iNumArr[4]。 //定义一维数组 用于存放输入的数值 iNumArr[0] = iNum1。 iNumArr[1] = iNum2。 NumArr[2] = iNum3。 iNumArr[3] = iNum4。 if (CalcArray1(iNumArr, strResult))//调用 CalcArray1 函数判断其是否能算出24 { return TRUE。 } if (CalcArray2(iNumArr, strResult)) //调用 CalcArray2 函数判断其是否能算出24 { return TRUE。 } if (CalcArray3(iNumArr, strResult)) 调用 CalcArray3 函数判断其是否能算出24 { return TRUE。 } if (CalcArray4iNumArr, strResult)) 调用 CalcArray4 函数判断其是否能算出 { return TRUE。 } if (CalcArray6(iNumArr, strResult)) 调用 CalcArray6 函数判断其是否能算出 { return TRUE。 } if (CalcArray7(iNumArr, strResult)) 调用 CalcArray7 函数判断其是否能算出 { return TRUE。 } return FALSE。 } BOOL CalcArray1(int iNumInput[], CStringamp。 strResult)//没有括号的一个函 //数,类似的函数还有 6 个,这里不另外写上去了。 { // a * b * c * d 7 number int iNumMaths[7][2]。 //其中包括数值变量和运算符号有 7 个字符 for(int i=0。 i4。 i++)//循环语句判断输入的 4 个数字 { for(int j=0。 j4。 j++) { if(j==i) { continue。 } for(int k=0。 k4。 k++) { if(k==i||k==j) { continue。 } for(int l=0。 l4。 l++) { if(l==i||l==j||l==k) { continue。 } iNumMaths[0][0]=iNumInput[i]。 //将数值存入数组中 iNumMaths[2][0]=iNumInput[j]。 iNumMaths[4][0]=iNumInput[k]。 iNumMaths[6][0]=iNumInput[l]。 iNumMaths[0][1]=eNumber。 //将此字符代表数值还是运算符号的值存入数组 iNumMaths[2][1]=eNumber。 iNumMaths[4][1]=eNumber。 iNumMaths[6][1]=eNumber。 for (int oneOP = eAdd。 oneOP = eDiv。 oneOP++)//通过循环语句实现运算顺序 for (int twoOP=eAdd。 twoOP=eDiv。 twoOP++) for (int threeOP=eAdd。 threeOP=eDiv。 threeOP++) { iNumMaths[1][0] = oneOP。 //通过循环得到第一个字符的运算符号先 /, *后 + , iNumMaths[1][1] = eOperator。 //表明第一个输入的字符为变量还是运算符号 iNumMaths[3][0] = twoOP。 iNumMaths[3][1] = eOperator。 iNumMaths[5][0] = threeOP。 iNumMaths[5][1] = eOperator。 double dRes = CalcOneExpress(iNumMaths, 7)。 if(Equal24(dRes)) CombineResult(iNumMaths, 7, strResult)。 //合并结果 return TRUE。 } } } }//end for (int oneOP } } } } return FALSE。 } 24 点算法表达式的判别程序 int temp=0。 //用于控制 if 语句的判断 int total。 //用于判断输入数字和牌面数字是否匹配 rrorNum=3。 //3 种错误判断和一种正确结果的变量 CString s。 //用于在输入框中输入字符的变量 UpdateData(true)。 s=m_edit。 int length=()。 int dd。 UpdateData(FALSE)。 int nLength=()。 har * sz=new char[nLength]。 sz=(0)。 UpdateData(true)。 dd=eval_exp(sz)。 m_edit3=dd。 if(errorNum==0)// errorNum 有 4 个值,分别用以判断出错信息和正确消息 { MessageBox(输入语法错误 )。 } else if(errorNum==1) { MessageBox(输入括号不匹配 ) } else if(errorNum==2) { MessageBox(表达式不存在 )。 } else if(errorNum==3)//假如 errorNum 为 3则判断其表达式的长度 { for(j=0。 jlength1。 j++) { int getatq=(j)。 int getath=(j+1)。 if((getatq==39。 139。 )amp。 amp。 (getath==39。 039。 )) { (j,39。 a39。 )。 (j+1,1)。 length=()。 } if((getatq==39。 139。 )amp。 amp。 (getath==39。 139。 )) { (j,39。 b39。 )。 (j+1,1)。 length=()。 } if((getatq==39。 139。 )amp。 amp。 (getath==39。 239。 )) { (j,39。 c39。 )。 (j+1,1)。 length=()。 } if((getatq==39。 139。 )amp。 amp。 (getath==39。 339。 )) { (j,39。 d39。 )。 (j+1,1)。 length=()。 } } for(i=1。 i14。 i++)//循环语句判断输入值和牌面给定的牌是否匹配 { temp=0。 start=0。 while(temp!=(1)) { temp=(d[i],start)。 start=temp+1。 f(temp!=(1)) { a[i]++。 } } } for(i=1。 i14。 i++) { if(c[i]==m_iNum[0]) { a[i]。 } if(c[i]==m_iNum[1]) { a[i]。 } if(c[i]==m_iNum[2]) { a[i]。 } if(c[i]==m_iNum[3]) { a[i]。 } } total=abs(a[1])+abs(a[2])+abs(a[3])+abs(a[4])+abs(a[5])+abs(a[6]) +abs(a[7])+abs(a[8])+abs(a[9])+abs(a[10])+abs(a[11])+abs(a[12])+abs(a[13])。 if(total!=0) //利用 total 变量实现了数字匹配问题,假如 total 为 0则匹配正确 否则错误 Message。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。