本文主要是介绍纸牌益智游戏-24点游戏,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一.问题描述
24点游戏是经典的纸牌益智游戏。
常见游戏规则:
从扑克中每次取出4张牌。使用加减乘除,第一个能得出24者为赢。(其中,J代表11,Q代表12,K代表13,A代表1),按照要求编程解决24点游戏。 随机生成4个代表扑克牌牌面的数字字母,程序自动列出所有可能算出24的表达式。随机生成4个代表扑克牌牌面的数字或字母,如果表达式计算结果为24则代表用户赢了此局。将所出现的结果存入文件中。
二.流程图
三.代码
//24点游戏
//2019-04-10
//Dream 张
#include<iostream>
#include<string>
#include<time.h>
#include<stdlib.h>
#include<fstream>
using namespace std;
char card[]={'A','2','3','4','5','6','7','8','9','10','J','Q','K'};
char buf[4];
double nums[4];
char ope[4]={'+','-','*','/'};//生成
void cre()
{// ofstream fout; int i=0; int j; cout<<"生成的四张牌面为:"<<endl; srand((unsigned)time(0)); for(i=0;i<4;i++){j=rand()%13+1; buf[i]=card[j]; }cout<<buf[0]<<";"<<buf[1]<<";"<<buf[2]<<";"<<buf[3]<<"。"<<endl;for(i=0;i<4;i++) {if(buf[i]=='A') nums[i]=1; else if(buf[i]=='2') nums[i]=2; else if(buf[i]=='3') nums[i]=3; else if(buf[i]=='4') nums[i]=4; else if(buf[i]=='5') nums[i]=5; else if(buf[i]=='6') nums[i]=6; else if(buf[i]=='7') nums[i]=7; else if(buf[i]=='8') nums[i]=8; else if(buf[i]=='9') nums[i]=9; else if(buf[i]=='10') nums[i]=10; else if(buf[i]=='J') nums[i]=11; else if(buf[i]=='Q') nums[i]=12; else if(buf[i]=='K') nums[i]=13;}}//计算
double calcute(double a,double b,char index)
{if(index=='+') return a+b; else if(index=='-') return a-b; else if(index=='*') return a*b;else if(index=='/') {if(b!=0) return a/b; }
}//穷举计算
void exh()
{ //ofstream fout; double temp[3],tem[2];//第一个符号放置后,经过计算后相当于剩下三个数,这个数组用于存储这三个数 double sum;//求得的和 int judge=0;//判断是否找到一个合理的解 int score=0; //得分 得分,答错不得分 for(int i=0;i<4;i++) //第一次放置的符号 {for(int j=0;j<4;j++) //第二次放置的符号 {for(int k=0;k<4;k++) //第三次放置的符号 { for(int m=0;m<3;m++) //首先计算的两个相邻数字,共有3种情况,相当于括号的作用 { if(nums[m+1]==0&&ope[i]=='/') break; temp[m]=calcute(nums[m],nums[m+1],ope[i]); temp[(m+1)%3]=nums[(m+2)%4];//先确定首先计算的两个数字,计算完成相当于剩下两个数,按顺序存储在temp数组中 temp[(m+2)%3]=nums[(m+3)%4];//三个数字选出先计算的两个相邻数字,两种情况,相当于第二个括号for(int n=0;n<2;n++) { if(temp[n+1]==0&&ope[j]=='/') break; tem[n]=calcute(temp[n],temp[n+1],ope[j]); tem[(n+1)%2]=temp[(n+2)%3]; if(tem[1]==0&&ope[k]=='/') break; sum=calcute(tem[0],tem[1],ope[k]); if(sum==24) //若和为24 { judge=1; //判断符为1,表示已求得解 if(m==0&&n==0) cout<<"(("<<nums[0]<<ope[i]<<nums[1]<<")"<<ope[j]<<nums[2]<<")"<<ope[k]<<nums[3]<<"="<<sum<<endl; else if(m==0&&n==1) cout<<"("<<nums[0]<<ope[i]<<nums[1]<<")"<<ope[k]<<"("<<nums[2]<<ope[j]<<nums[3]<<")="<<sum<<endl; else if(m==1&&n==0) cout<<"("<<nums[0]<<ope[j]<<"("<<nums[1]<<ope[i]<<nums[2]<<")"<<ope[k]<<nums[3]<<"="<<sum<<endl; else if(m==1&&n==1) cout<<nums[0]<<ope[k]<<"(("<<nums[1]<<ope[i]<<nums[2]<<")"<<ope[j]<<nums[3]<<")="<<sum<<endl; else if(m==2&&n==0) cout<<"("<<nums[0]<<ope[j]<<nums[1]<<")"<<ope[k]<<"("<<nums[2]<<ope[i]<<nums[3]<<")="<<sum<<endl; else if(m==2&&n==0) cout<<nums[0]<<ope[k]<<"("<<nums[1]<<ope[j]<<"("<<nums[2]<<ope[i]<<nums[3]<<"))="<<sum<<endl; } } } } } }if(judge==0) cout<<"这四张扑克牌无法找到一个合理的解:"<<endl; //如果没有找到结果,符号位为0 if(judge==1) { cout<<"恭喜你,答对了!"<<endl; score+=10; cout<<"您的得分为:"<<score<<endl; } else{ cout<<"很遗憾,你没有答对,再接再厉哦!!!"<<endl; }} int main()
{int i; int select=1; ofstream fout; fout.open("TopList.txt"); while(1) { fout<<" ******************************* "<<endl; fout<<" * * "<<endl; fout<<" * 欢迎进入24点游戏 * "<<endl; fout<<" * * "<<endl; fout<<" ******************************* "<<endl; while(select) { fout<<" ###################################################"<<endl; fout<<" # #"<<endl; fout<<" # 是否进入游戏 #"<<endl; fout<<" # #"<<endl; fout<<" # 0.是 1.否 #"<<endl; fout<<" # #"<<endl; fout<<" ###################################################"<<endl; fout<<"请输入您的选择(0或1):"; cin>>i; switch(i) { case 0: cre(); fout<<"所有可能的结果为:"<<endl; exh(); break; case 1: select=0; break; default: fout<<"请在0和1之间选择!"<<endl; } } } fout<<flush; fout.close(); return 0;
}
四.调试
刚写完程序的时候,我运行了一下,但我发现我的程序可以运行出来,但我的文件中没有程序运行出来的东西。
经过调试,文件中只能存储界面,却不能存储随机生成的牌面以及产生的结果。
结果只在程序运行界面显示:
五.测试
六.总结
1.一开始我能懂这个游戏,但当我开始写的时候,我就不知道该从哪开始。对我来说最大的问题就是:将这些结果写入文件中。我的程序中有3个函数:分别是cre()生成牌面函数;calcute(double a,double b,char index)计算函数;exh()穷举计算函数。其中穷举函数中的算法是最难的。
2.穷举法的运用:
穷举法就是列出4个数字加减乘除的各种可能性。首先我们将4个数设为a,b,c,d,,将其排序列出四个数的所有排序序列组合(共有A44=24种组合)。再进行符号的排列表达式,其中算术符号有+,—,,/,(,)。其中有效的表达式有a(b-c/b),ab-cd,等等。列出所有有效的表达式。其中a,b,c,d的范围是1到13。用随机函数产生四个1-13的数。要实现24点的算法,就是通过4个数字,4个运算符号和2对括号(最多为2对),通过各种组合判断其结果是否为24。我们用a,b,c,d代替4个数字。考虑每种可能,总的算法就有7种可能。
a.没括号的(形如abc*d);
b.有括号的(形如(a * b) * c * d);
c.有括号的(形如(a * b * c) * d);
d.有括号的(形如a * (b * c) * d);
e.有括号的(形如(a * b) * (c * d));
f.有括号的(形如((a * b) * c) * d);
g.有括号的(形如(a * (b * c)) * d)。
3.在此程序的基础上,我增加了得分项,如果找到正确的表达式,就得分,否则不得分也不扣分。但这个计分的只是针对一轮游戏,进入下一轮又重新开始。
这篇关于纸牌益智游戏-24点游戏的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!