计算24点游戏c++
C语言写的24点游戏

if((m%4)==0&&newp[j]%newp[q]==0&&c==3&&newp[q+1]%s2==0)
printf("%d%c((%d%c%d)%c%d)=%d\n",p[3],p1[2],p[0],p1[0],p[1],p1[1],p[2],s3);
}
}
}
}
}
}
}
}
for(c=0;c<4;c++)
{
switch(b[c])
{
case 1:s3=s2+newp[q+1];sign='+';break;
case 2:s3=s2-newp[q+1];sign='-';break;
int a[4],newp[4],b[4]={1,2,3,4};//a[4]数组存放随机生成的四个数
char p1[3],sign; //定义存储运算符的字符数组
printf("四个数是:");
for(i=0;i<4;i++)
{
a[i]=rand()%13+1; //获得随机数
printf("(%d%c%d)%c(%d%c%d)=%d\n",p[2],p1[2],p[3],p1[1],p[0],p1[0],p[1],s3);
else
printf("(%d%c%d)%c(%d%c%d)=%d\n",p[0],p1[0],p[1],p1[1],p[2],p1[2],p[3],s3);
24点游戏C++ 代码

out<<"("<<obj.Q[1];
print(out,obj.Sign[1]);
out<<obj.Q[2]<<"))";
out<<obj.Q[3]<<"))";
break;
}
default:out<<"方法代码参数错误!!!";
}
out<<"="<<M;
{
Q[0]=a;
Q[1]=b;
Q[2]=c;
Q[3]=d;
method=m;
Sign[0]=s1;
Sign[1]=s2;
Sign[2]=s3;
}
ostream& operator<<(ostream& out,const Four &obj)
bool judge4(double a1,int b1,double a2,int b2,double a3,int b3,double a4);/*a1@((a2@a3)@a4)*/
bool judge5(double a1,int b1,double a2,int b2,double a3,int b3,double a4);/*a1@(a2@(a3@a4))*/
class Four
{
private:
int Sign[3];/*储存运算符*/
int Q[N2];/*储存原始顺序,即未排序前的顺序,是输出函数的依据*/
经典游戏--24点--c++代码实现和总体思路(简单暴力向)

经典游戏--24点--c++代码实现和总体思路(简单暴⼒向)24点 24点是⼀个⾮常经典的游戏,从扑克牌⾥抽4张牌,其中J=11,Q=12,K=13,然后经过+,-,*,/,(),的计算后,使得计算得值为24,例如抽到1,2,2,5四张牌,那么 (1+5)*(2+2)=24; 这就是可以凑成24点的⼀种情况,作为⼀个经典题⽬,在leetcode上也有对应的题⽬进⾏练习 PS 看见知乎⼤佬有⼀种必24点的算法,但是要⽤到阶乘和次⽅式⼦为(a0+b0+c0+d0)! =24⼀、总体思路 1.因为是简单暴⼒向的,所以我们的做法就是直接穷举出所有可能的情况,⾸先是考虑四个数a,b,c,d的排列情况 如b,a,c,d等等,通过排列组合可以得到 4*3*2*1 = 24 种情况 2.然后考虑a,b,c,d中的三个运算符的情况设⼀个⾃定义的运算符为,可以是+,-,*,/中的任意⼀个 则有 a b c$d 这个式⼦,同样,运算符的可能性有 3*4 = 12 种 3.最后考虑()的情况,我们规定,每次⼀对()只框住两个数,⽐如a+b+c+d =(((a+b)+c)+d) = ((r1+c)+d)=(r2+d)=r3(其中r1=a+b,r2=r1+c,r3=r2+d) ()的情况其实就是运算优先级的问题,⽆论运算符是什么,都⼀定是先运算括号⾥的内容 所以我们可以穷举出情况 第⼀种r1=a b,r2=r1c,r3=r2$d; 第⼆种r1=b c,r2=a r1,r3=r2$d; 第三种r1=b c,r2=r1d,r3=a$r2; 第四种r1=c d,r2=b r1,r3=a$r2; 第五种r1=a b,r2=c d,r3=r1$r2; 仔细观察不难发现,我们控制了运算符和数字的绝对顺序从左到右的顺序严格是a b c$d,不论任何情况都不会改变abcd的顺序,是因为我们在上⾯已经排出来了所有的24种情况,所以我们这就可以严格控制abcd的顺序了⼆、代码实现1 #include <iostream>2 #include <string>3using namespace std;4int mark_int[4] = { 1,2,3,4 };5string mark_char = "+-*/";6double cal(double a, int m, double b)7 {8switch (m)9 {10case1: return a + b;11case2: return a - b;12case3: return a * b;13case4: return a / b;14 }15 }1617bool cal1(double a, double b, double c, double d, int m1, int m2, int m3)18 {19double r1;20double r2;21double r3;22 r1 = cal(a, m1, b);25if (r3 == 24)26 {27 cout << "(((" << a << mark_char[m1 - 1] << b << ")" << mark_char[m2 - 1] << c << ")" << mark_char[m3 - 1] << d << ")" << endl;28return1;29 }30return0;31 }3233bool cal2(int a, int b, int c, int d, int m1, int m2, int m3)34 {35double r1;36double r2;37double r3;38 r1 = cal(b, m1, c);39 r2 = cal(a, m2, r1);40 r3 = cal(r2, m3, d);41if (r3 == 24)42 {43 cout << "((" << a << mark_char[m1 - 1] << "(" << b << mark_char[m2 - 1] << c << "))" << mark_char[m3 - 1] << d << ")" << endl;44return1;45 }46return0;47 }4849bool cal3(int a, int b, int c, int d, int m1, int m2, int m3)50 {51double r1;52double r2;53double r3;54 r1 = cal(b, m1, c);55 r2 = cal(r1, m2, d);56 r3 = cal(a, m3, r2);57if (r3 == 24)58 {59 cout << "(" << a << mark_char[m1 - 1] << "((" << b << mark_char[m2 - 1] << c << ")" << mark_char[m3 - 1] << d << "))" << endl;60return1;61 }62return0;63 }6465bool cal4(int a, int b, int c, int d, int m1, int m2, int m3)66 {67double r1;68double r2;69double r3;70 r1 = cal(c, m1, d);71 r2 = cal(b, m2, r1);72 r3 = cal(a, m3, r2);73if (r3 == 24)74 {75 cout << "(" << a << mark_char[m1 - 1] << "(" << b << mark_char[m2 - 1] << "(" << c << mark_char[m3 - 1] << d << ")))" << endl;76return1;77 }78return0;79 }8081bool cal5(int a, int b, int c, int d, int m1, int m2, int m3)82 {83double r1;84double r2;85double r3;86 r1 = cal(a, m1, b);87 r2 = cal(c, m3, d);88 r3 = cal(r1, m2, r2);89if (r3 == 24)90 {91 cout << "((" << a << mark_char[m1 - 1] << b << ")" << mark_char[m2 - 1] << "(" << c << mark_char[m3 - 1] << d << "))" << endl;92return1;93 }94return0;95 }969798bool all_cal(int a, int b, int c, int d)99 {100for (int i = 1; i <= 4; i++)101for (int j = 1; j <= 4; j++)102for (int k = 1; k <= 4; k++)103 {104if (cal1(a, b, c, d, i, j, k) == true || cal2(a, b, c, d, i, j, k) == true || cal3(a, b, c, d, i, j, k) == true || cal4(a, b, c, d, i, j, k) == true || cal5(a, b, c, d, i, j, k) == true) 105return1;106 }107return0;108 }110111bool judge(int a, int b, int c, int d)112 {113int all[24][4] = {114 {a,b,c,d},{a,b,d,c},{a,c,b,d},{a,c,d,b},{a,d,b,c},{a,d,c,b},115 {b,a,c,d},{b,a,d,c},{b,c,a,d},{b,c,d,a},{b,d,a,c},{b,d,c,a},116 {c,a,b,d},{c,a,d,b},{c,b,a,d},{c,b,d,a},{c,d,a,b},{c,d,b,a},117 {d,a,b,d},{d,a,d,b},{d,b,a,c},{d,b,c,a},{d,c,a,b},{d,c,b,a},118 };119for (int i = 0; i < 24; i++)120 {121if (all_cal(all[i][0], all[i][1], all[i][2], all[i][3]))122return1;123 }124return0;125 }126127int main()128 {129int a, b, c, d;130 cin >> a >> b >> c >> d;131if (!judge(a, b, c, d))132 cout << "凑不成24点" << endl;133134 }三、代码解释先做⼀个计算两个数的函数,⽤数组int mark_int[4] = {1,2,3,4}的四个数表⽰+ - * /,string mark_char是⽤来最后显⽰的1int mark_int[4] = { 1,2,3,4 };2string mark_char = "+-*/";3double cal(double a, int m, double b)4 {5switch (m)//⽤switch来进⾏运算符的选择6 {7case1: return a + b;8case2: return a - b;9case3: return a * b;10case4: return a / b;11 }12 }我们在实现五种括号的函数,并且我们规定运算⼀定是 a m1 b m2 c m3 d(m1,m2,m3是三个运算符的代号),意思就是abcd的从左到右顺序不乱,m1m2m3从左到右的顺序也不会乱,⽐较粗暴的理解就是ab之间⼀定是m1,bc之间⼀定是m2,cd之间⼀定其实m3,然后如果成功返回运算的过程和true,否则返回false1bool cal1(double a, double b, double c, double d, int m1, int m2, int m3)2 {3double r1;4double r2;5double r3;6 r1 = cal(a, m1, b);7 r2 = cal(r1, m2, c);8 r3 = cal(r2, m3, d);9if (r3 == 24)10 {11 cout << "(((" << a << mark_char[m1 - 1] << b << ")" << mark_char[m2 - 1] << c << ")" << mark_char[m3 - 1] << d << ")" << endl;12return1;13 }14return0;15 }//第⼀种r1=a$b,r2=r1$c,r3=r2$d;1617bool cal2(int a, int b, int c, int d, int m1, int m2, int m3)18 {19double r1;20double r2;21double r3;22 r1 = cal(b, m1, c);23 r2 = cal(a, m2, r1);24 r3 = cal(r2, m3, d);25if (r3 == 24)26 {27 cout << "((" << a << mark_char[m1 - 1] << "(" << b << mark_char[m2 - 1] << c << "))" << mark_char[m3 - 1] << d << ")" << endl;28return1;29 }30return0;31 }//第⼆种r1=b$c,r2=a$r1,r3=r2$d;33bool cal3(int a, int b, int c, int d, int m1, int m2, int m3)34 {35double r1;36double r2;37double r3;38 r1 = cal(b, m1, c);39 r2 = cal(r1, m2, d);40 r3 = cal(a, m3, r2);41if (r3 == 24)42 {43 cout << "(" << a << mark_char[m1 - 1] << "((" << b << mark_char[m2 - 1] << c << ")" << mark_char[m3 - 1] << d << "))" << endl;44return1;45 }46return0;47 }//第三种r1=b$c,r2=r1$d,r3=a$r2;4849bool cal4(int a, int b, int c, int d, int m1, int m2, int m3)50 {51double r1;52double r2;53double r3;54 r1 = cal(c, m1, d);55 r2 = cal(b, m2, r1);56 r3 = cal(a, m3, r2);57if (r3 == 24)58 {59 cout << "(" << a << mark_char[m1 - 1] << "(" << b << mark_char[m2 - 1] << "(" << c << mark_char[m3 - 1] << d << ")))" << endl;60return1;61 }62return0;63 }//第四种r1=c$d,r2=b$r1,r3=a$r2;6465bool cal5(int a, int b, int c, int d, int m1, int m2, int m3)66 {67double r1;68double r2;69double r3;70 r1 = cal(a, m1, b);71 r2 = cal(c, m3, d);72 r3 = cal(r1, m2, r2);73if (r3 == 24)74 {75 cout << "((" << a << mark_char[m1 - 1] << b << ")" << mark_char[m2 - 1] << "(" << c << mark_char[m3 - 1] << d << "))" << endl;76return1;77 }78return0;79 }//第五种r1=a$b,r2=c$d,r3=r1$r2;接下来是12种的符号的排列情况,如果有⼀种括号情况满⾜,我们就返回true,否则返回false1bool all_cal(int a, int b, int c, int d)2 {3for (int i = 1; i <= 4; i++)4for (int j = 1; j <= 4; j++)5for (int k = 1; k <= 4; k++)6 {7if (cal1(a, b, c, d, i, j, k) == true || cal2(a, b, c, d, i, j, k) == true || cal3(a, b, c, d, i, j, k) == true || cal4(a, b, c, d, i, j, k) == true || cal5(a, b, c, d, i, j, k) == true) 8return1;9 }10return0;11 }最后是在总判断函数中写⼊24种的abcd排列情况1bool judge(int a, int b, int c, int d)2 {3int all[24][4] = {4 {a,b,c,d},{a,b,d,c},{a,c,b,d},{a,c,d,b},{a,d,b,c},{a,d,c,b},5 {b,a,c,d},{b,a,d,c},{b,c,a,d},{b,c,d,a},{b,d,a,c},{b,d,c,a},6 {c,a,b,d},{c,a,d,b},{c,b,a,d},{c,b,d,a},{c,d,a,b},{c,d,b,a},7 {d,a,b,d},{d,a,d,b},{d,b,a,c},{d,b,c,a},{d,c,a,b},{d,c,b,a},8 };9for (int i = 0; i < 24; i++)10 {11if (all_cal(all[i][0], all[i][1], all[i][2], all[i][3]))12return1;13 }14return0;15 }主函数调⽤judge就完成整个算法了✿✿ヽ(°▽°)ノ✿1int main()4 cin >> a >> b >> c >> d;5if (!judge(a, b, c, d))6 cout << "凑不成24点" << endl;78 }失败的话会显⽰“凑不成24点”其实这个算法的话我写的可以说基本没有优化,就是枚举所有情况实现的,csdn上有⼤佬是有更好的思路的,这篇⽂章也是看了csdn的⼤佬的代码然后⾃⼰修修补补写出来的(我原来看的那篇有bug,⼤佬⾃⼰没发现好像。
24点游戏

“算24点”是一种数学游戏,正如象棋、围棋一样是一种人们喜闻乐见的娱乐活动。
它始于何年何月已无从考究,但它以自己独具的数学魅力和丰富的内涵正逐渐被越来越多的人们所接受。
这种游戏方式简单易学,能健脑益智,是一项极为有益的活动。
“算24点”的游戏内容如下:一副牌中抽去大小王剩下52张,(如果初练也可只用1~10这40张牌)任意抽取4张牌(称牌组),用加、减、乘、除(可加括号)把牌面上的数算成24。
每张牌必须用一次且只能用一次,如抽出的牌是3、8、8、9,那么算式为(9—8)×8×3或(9—8÷8)×3等。
“算24点”作为一种扑克牌智力游戏,还应注意计算中的技巧问题,不能瞎碰乱凑。
这里向大家介绍几种常用的、便于学习掌握的方法:1.利用3×8=24、4×6=24求解。
把牌面上的四个数想办法凑成3和8、4和6,再相乘求解。
如3、3、6、10可组成(10—6÷3)×3=24等。
又如2、3、3、7可组成(7+3—2)×3=24等。
实践证明,这种方法是利用率最大、命中率最高的一种方法。
2.利用0、11的运算特性求解。
如3、4、4、8可组成3×8+4—4=24等。
又如4、5、J、K可组成11×(5—4)+13=24等。
3.最为广泛的是以下七种解法(我们用a、b、c、d表示牌面上的四个数)①(a—b)×(c+d)如(10—4)×(2+2)=24等。
②(a+b)÷c×d 如(10+2)÷2×4=24等。
③(a-b÷c)×d 如(3—2÷2)×12=24等。
④(a+b-c)×d 如(9+5—2)×2=24等。
⑤a×b+c—d 如11×3+l—10=24等。
⑥(a-b)×c+d 如(4—l)×6+6=24等。
24点游戏求解算法

24点游戏求解算法24点游戏简介一副牌中抽去大小王,从剩下的52张中任意抽取4张牌,用加、减、乘、除和括号把牌面上的数算成24,每张牌都必须使用,且只能用一次。
举例如下:【1】 1、2、3、4,那么1x2x3x4 = 24,4/(1/(2x3)) = 24,(1+2+3)x4 = 24等等。
【2】 4、6、8、10,那么(8-6)x10+4 = 24,(10-6)x4+8 = 24。
【3】 5、4、3、3,那么(5+4)x3-3 = 24,(5-3)x4x3 = 24,(3/3+5)x4 = 24等等。
求解算法用穷举法列出所有公式,如果结果等于24则输出。
那么如何排气呢?•经过观察,无论什么样的算式,不管运算符顺序怎么样,不管括号怎么加,都可以用如下方法穷举:【1】最开始是4个数,例如 6、7、8、9。
【2】从4个数中选择两个数,例如6和7。
4选2共6中选法。
【3】将两个数进行加减乘除运算,例如加法运算,6+7。
【4】运算结果13和剩余的2个数8和9组成3个数,13、8、9。
【5】从三个数中选择两个数,例如13和8。
3选2共3中选法。
【6】将两个数进行加减乘除运算,例如除法运算,13/8,或者8/13。
【7】运算结果和剩余的1个数组成2个数,例如13/8、9。
【8】最后一步加减乘除运算,例如乘法运算,13/8 x 9。
注意步骤【3】、【6】、【8】,因为加法和乘法符合交换律,不分顺序,所以一共6中四则运算。
对于除法,还要检查除数是否为0。
•例如上面提到的算式(1+2+3)x4 = 24,可以看做:【1】4个数1、2、3、4。
【2】选择1和2。
【3】选择加法。
【4】运算结果3和剩余2个数组成3个数 3、3、4。
【5】选择3和3。
【6】选择加法。
【7】运算结果6和剩余1个数组成2个数 6、4。
【8】选择乘法。
•再举一个例子,例如算式(11-3)/(5-7) = -4,可以看做:【1】4个数3、5、7、11。
c++24点游戏

c++24点游戏正文第一篇:c++24点游戏 c++24点游戏 #include iostream#include stringusing namespace std; //定义Stack类const maxsize=2022 enum Error_code { success, overflow, underflow };templateclass Stack {public:Stack();bool empty() const;bool full() const;int size() const;void clear();Error_code top(T &item) const;Error_code pop();Error_code push(const T &item);private:int count;T entry[maxsize];};templateStack::Stack() {count=0;}templatebool Stack::empty () const { return count==0;}templatebool Stack::full () const { return count==maxsize;}templateint Stack::size() const {return count;}templatevoid Stack::clear() {count=0;}templateError_code Stack::top (T &item) const { if (empty()) return underflow;item= entry[count-1];return success;}templateError_code Stack::pop () {if (empty()) return underflow;count--;return success;}templateError_code Stack::push (const T &item) {if (full()) return overflow;entry[count++]=item;return success;} Stack sign;Stack num;int set; // 判断程序中的异常,以便适时退出?//void process(char c) //计算两个数的 + - * / 运算// { int k=0;double a,b;sign.pop();if (num.top(b)==success) {num.pop();if (num.top(a)==success) {num.pop();k=1;}}if (k) {switch (c) {case '+': num.push(a+b); break; case '-': num.push(a-b); break; case '*': num.push(a*b); break; case '/':if (b==0) { set=4;num.push(-1);}elsenum.push(a/b);break;}}else {set=1;num.push(-1);}}void get_command(string &str) {coutstr;}double do_command(const string &str) {string s=;double outcome=-1;char c;for (int i=0;str[i]!='\0';i++){if (set!=0) break; //例外则停止运行while (1) { //分离数据与运算符if (str[i]='0' || str[i]=='.') {s+=str[i];i++;}else {if(s!=) {if (num.push(atof(s.c_str ()))==overflow)set=3;s=;break;}}char ch= str[i];switch (ch) { //处理运算的优先级,并注意例外抛出case '*':case '/':if (sign.top(c)==success)if(c=='*'||c=='/') process(c);if (sign.push(ch)==overflow)set=3;break;case '+':case '-':while (sign.top(c)==success) {if (c!='(') process(c);else break;if (sign.push(ch)==overflow) set=3;break;case '(':if (sign.push(ch)==overflow) set=3;break;case ')':while (sign.top(c)==success) { if (c!='(') process(c);else break;}sign.pop();break;case '=':while (sign.top(c)==success) { if (c!='(') process(c);else break;}break;default: set=2;break;}}if (num.size()==1 && sign.size()==0)num.top(outcome);else set=1;if (set==0) coutout; cout>jj;cout13 || a[i]!=int(a[i])) 在输出方面,运算结果等于 24就输出,利用调用的参数判断输出形式,有5种:(a+b)*(c+d),a*(b*(c+d)) ,(a*(b+c))*d ,a*((b+c)*d) ,((a+b)*c)*d。
24点游戏规则和解题方法

24点游戏规则和解题方法“巧算24点”的游戏内容如下:一副牌中抽去大小王剩下52张,(如果初练也可只用1~10这40张牌)任意抽取4张牌(称牌组),用加、减、乘、除(可加括号)把牌面上的数算成24。
每张牌必须用一次且只能用一次,如抽出的牌是3、8、8、9,那么算式为(9—8)×8×3或3×8+(9—8)或(9—8÷8)×3等。
“算24点”作为一种扑克牌智力游戏,还应注意计算中的技巧问题。
计算时,我们不可能把牌面上的4个数的不同组合形式——去试,更不能瞎碰乱凑。
这里向大家介绍几种常用的、便于学习掌握的方法:1.利用3×8=24、4×6=24求解。
把牌面上的四个数想办法凑成3和8、4和6,再相乘求解。
如3、3、6、10可组成(10—6÷3)×3=24等。
又如2、3、3、7可组成(7+3—2)×3=24等。
实践证明,这种方法是利用率最大、命中率最高的一种方法。
2.利用0、11的运算特性求解。
如3、4、4、8可组成3×8+4—4=24等。
又如4、5、J、K可组成11×(5—4)+13=24等。
3.在有解的牌组中,用得最为广泛的是以下六种解法:(我们用a、b、c、d表示牌面上的四个数)①(a—b)×(c+d)如(10—4)×(2+2)=24等。
②(a+b)÷c×d如(10+2)÷2×4=24等。
③(a-b÷c)×d如(3—2÷2)×12=24等。
④(a+b-c)×d如(9+5—2)×2=24等。
⑤a×b+c—d如11×3+l—10=24等。
⑥(a-b)×c+d如(4—l)×6+6=24等。
游戏时,同学们不妨按照上述方法试一试。
需要说明的是:经计算机准确计算,一副牌(52张)中,任意抽取4张可有1820种不同组合,其中有458个牌组算不出24点,如A、A、A、5。
“24点”的玩法

“24点”的玩法介绍“24点”数学游戏,它能把枯燥的基本数字计算变得趣味盎然,能大大提高计算能力和计算速度,使得思维灵活敏捷,是一种寓教于乐的的智力竞赛游戏。
游戏规则:给定4个自然数,通过加、减、乘、除四则运算,可以任意交换数的位置,可以随意的添加括号,但是每个数只能且必须用上一次,连起来组成一个计算式子,得数就是24。
“24点”数学游戏通常是用扑克牌进行的,此时,给定的4个数就被限定在1~13的范围内。
“24点”数学游戏可以是1个人玩,也可以是多人玩,比如4个人玩,把扑克牌中的大、小王拿掉,剩下的52张牌洗好后,每人分给13张,然后就是每人出一张牌,其中J、Q、K分别代表11、12、13,其他的牌就代表相应的1~10的自然数,谁先算出“24点”,谁就把这4张牌赢走,然后继续玩牌,最后谁的牌多谁就获胜。
当如果算不出“24点”的话,各自就拿回来自己的牌,然后洗牌,再次继续进行。
要想算得又快又准,这就要靠平时的基本功了,而要有好的过硬的基本功,就要多练习了,只有多练,才能算得好,而且这又能很好地锻炼自己的反应能力和敏捷的判断能力,对学好数学很有帮助。
而要玩好这个游戏,最重要的有2条:1、熟悉加法口诀和乘法口诀;2、利用括号,因为括号既能改变运算顺序,也可以改变运算符号。
下面通过一些例子来说明“24点”的一些基本算法。
例1.3、3、5、6解法一、根据3×8=24,3已经有了,只要将其他3个数凑成8,有3×(5+6-3)=24。
解法二、根据4×6=24,6已经有了,只要将其他3个数凑成4,有6×(5-3÷3)=24或者6×(3×3-5)=24。
解法三、还是根据3×8=24,要将2个数凑成3,要将另2个数凑成8有(6-3)×(5+3)=24。
解法四、先把其中两个数相乘,积不足24的用另外2个数补足,有3×5+3+6=24解法五、先把其中两个数相乘,积超过24的用另外2个数割去,有5×6-3-3=24例2.2、2、4、8解法一、根据3×8=24,8已经有了,只要将其他3个数凑成8,有8×【(2+4)÷2】=24或者8×【4-2÷2】=24。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
24点游戏软件的开发1 概述1.1 课程设计目的a、巩固并加深学生对C++语言程序设计知识的理解;b、培养学生面向对象的程序设计思想,使学生认识面向过程和面向对象两种设计方法的区别;c、进一步掌握和应用VC++ 6.0集成开发环境;d、提高运用C++语言解决实际问题的能力;e、初步掌握开发小型实用软件的基本方法,能独立设计、实现基本的MIS系统;f、掌握书写程序设计开发文档的能力(书写课程设计实验报告)。
1.2 课程设计内容课题名称:24点游戏软件的开发说明:24点游戏是一种常见的纸牌游戏说明要求:a)实现随机发牌;b)能进行结果验算;c)计分;d)难度设置。
2 系统需求分析2.1 系统目标24点游戏是个流行的数学运算游戏。
本次课程设计通过24点游戏来加深我们对对话框编程的认识和理解,并介绍Visual C++在数学计算方面的应用,以及在按钮上设置位图和设置计时器的方法。
24点扑克游戏的规则是:由系统发出4张扑克牌,要求用户利用扑克牌上显示的数字(JQKA算10),通过加减乘除运算得出24。
2.2 主体功能a.对游戏设计三个难易级别,分别为低级、中级和高级。
每次开始游戏前可以根据玩家的需要进行难度设置,如若不设置,系统默认难度级别为中级,设置完难度级别之后就可以开始游戏了,单击“发牌”按钮,桌面上出现四张翻开的扑克牌,与此同时,游戏开始计时,进度条开始前进。
b.在规定的时间内,玩家可以在“输入算式”的编辑框中输入自己想好的算式,然后点击“验算”按钮:如果输入的算式经运算后所的答案正确,则会在编辑框中显示“正确!”;如果输入的数字与给出的牌的数字不符或者符号不合法,则会弹出“内部错误!”的窗口;如果输入的数字与四张牌相符、字符亦合法但是答案不正确,则会在编辑框中显示“错误”;如果未输入任何的数字和算符,则会弹出“内部错误!”的窗口。
c.如果在规定的时间内,玩家没有点击验算按钮,则会弹出“内部错误”的窗口。
d.在结束本轮游戏后,如果玩家想继续游戏,则可点击“发牌”按钮即可重新发牌,开始下一轮的游戏;如果玩家想结束游戏,则可点击“结束”按钮即可结束游戏。
2.3 开发环境Microsoft Visual C++ 6.03 系统概要设计3.1 系统功能模块划分a.建立一个随机产生扑克牌的模块。
由程序随机产生4张扑克牌,每张牌对应一个整数。
b.计时的模块。
定义一个计时器,以便对使用时间进行计数。
c.计算表达式的模块。
主要是通过函数来确定运算式各符号优先级和最终计算出输入算式的结果。
d.验算表达式正误的模块。
在规定的时间内输入算式进行验算,根据不同的情况会出现不同的对话框。
3.2 系统流程图图3-1 系统流程图说明:按下“发牌”按钮游戏开始,通过调用函数,桌面上随机显示4张纸牌。
这4张纸牌从1-K 中随机调出。
与此同时,标识耗时时标的进度条开始前进。
计时同步开始。
设置了时间限制,如果玩家没有在规定时间内输入表达式,本轮游戏结YNNYNYYN是否设置难度?1.低级2.中级3.高级系统默认难度级别为中级初始化 发牌 计时开始输入算式,进行计算比较函数值与参数值得大小显示“错误!”验算函数判断计算结果是否为24?超时,输入空白显示:“错误!”输入字符错误: 显示:“错误!”运算结果正确:“正确!”运算结果错误: 显示:“错误!”继续否?结束开始束,在函数OnTimer()的作用下,会弹出对话“内部错误”。
若用户在规定时间内点击了“验算”按钮,系统进行相应运算,紧接着系统调用验算函数对编辑框中运算出的结果进行验算,根据验算情况给出相应的结果。
出现的结果有以下四中情况:(1)如果用户没在输入算式中输入算式,直接按“验算”按钮,会弹出“错误!”的提示。
(2)如果输入的数字与给出的不符或者符号不合法,会弹出“错误!”的提示。
(3)如果输入的数字与四张牌相符、字符亦合法但是答案不正确,会弹出“错误!”。
(4)如果输入算式经运算后所得答案正确,则会弹出“正确!”,点击弹出框中的“发牌”按钮,系统会自动给出本局的得分和耗时。
本轮游戏结束后,用户可以选择重新开始,否则,可以点击“结束游戏”按钮退出游戏。
4系统详细设计4.1 设计步骤(a)在VC++6.0中,建立一个MFC?AppWizard(exe)工程,在应用程序类型中选择“基本对话框”,其余的都采用默认选项,即可完成对话框的创建。
(b)在对话框中添加4个图像(分别用于四张扑克牌),4个按钮(分别是发牌、输入算式、验算、结束游戏),1个编辑框(输入算式),一个进度条和一个下拉式按钮(用于选择难度级别),接着根据属性对以上所添加的控件进行属性修改,主要进行重命名,以便编辑源代码的时候区分,另外对图像的处理除了对其进行重命名外还要对其添加位图。
通过插入-资源-Bitmap加载图片,图片通过拷贝和复制等操作加载完成。
加载完成的图片在对应的工作区可以找到,选中对其名字进行修改。
(c)接着对以上添加的控件建立类向导。
主要有Add?Function、Add?Variable 和Edit?Code这三项的添加。
(d)根据流程图在类的原文件中逐一添加实现各个模块其功能所需要的各种函数,并添加相应的源代码,同时在头文件中添加对各种函数及变量的声明。
(e)对编译好的程序进行保存,开始进行调试,边调试边根据报错对原程序进行修改,直至程序不再报错,并且可以实现预计的各种功能。
4.2 界面设计界面设计主要是创建控件,在Resoure View选项卡中打开Dialog资源组,双击IDD_ZHOUTONG_DIALOG,在右边的窗口中显示出待编辑的对话框。
开始摆放控件,包括编辑框和按钮的创建。
按钮的创建以“1”为例进行介绍,其他按钮的创建可参照此进行操作。
(a)在Controls的“编辑框”按钮上单击鼠标左键,在对话框编辑窗口上合适的位置按下鼠标左键并拖动鼠标画出一个大小合适的编辑框。
在编辑框上单击鼠标右键,在弹出的快捷菜单中选择属性选项,此时弹出Edit属性对话框,在该对话框中输入ID属性。
按照上面的操作过程编辑其他按钮和编辑框等对象的属性。
表4-1 各按钮和编辑框等对象的属性控件对象ID Caption 显示纸牌的静态控件1 IDC_STATIC1 /显示纸牌的静态控件2 IDC_STATIC2 /显示纸牌的静态控件3 IDC_STATIC3 /显示纸牌的静态控件4 IDC_STATIC4 /耗时标识提示静态控件IDC_STATIC 耗时标识:难度级别提示静态控件IDC_STATIC5 难度级别:当前得分提示静态控件IDC_STATIC6 当前得分:显示当前得分静态控件IDC_STATIC7 /历史记录提示静态控件IDC_STATIC8 历史记录发牌按钮IDC_BUTTON1 发牌输入算式按钮IDC_BUTTON2 输入算式验算按钮IDC_BUTTON3 验算结束游戏按钮IDC_BUTTON4 结束游戏进度条IDC_PROGRESS1 / 输入算式编辑框IDC_EDIT1 / 显示历史记录列表控件IDC_COMBO1 /难度级别选择组合框IDC_LIST1 /4.3 关键功能的实现a.发牌功能的实现,首先,通过BOOL CDingluDlg::OnInitDialog()中,根据纸牌对应的ID号加载纸牌,。
利用函数加载了标号1~10的十张纸牌和两张背景纸牌。
然后运行代码,即可在图像框中得到四张铺开的纸牌。
b.计时功能的实现,在CPoint24Dlg::OnTimer中通过m_progress.StepIt()设置是否超时。
如果(m_progress.GetPos()>=100)代表游戏结束,用户没有时间进行思考了,本轮游戏结束,在函数OnTimer()的作用下,会弹出对话“超时!”c.计算功能的实现,对于输入结果的验算,主要是通过函数来确定运算式各符号优先级和最终计算出输入算式的结果。
对于编辑框中输入的表达式进行计算,借助于Str=Left+Middle+Right;将有优先级差别同时表达式传送到SubCompute()函数中,最终计算出输入到编辑框中的表达式结果Result,并将其返回。
d.验算功能的实现,在规定的时间内输入算式进行验算,根据不同的情况会出现不同的对话框。
有以下四种情况:如果用户没在输入算式中输入算式,直接按“验算”按钮,如果输入的数字与给出的不符或者符号不合法,会弹出“内部错误!”的提示对话框;如果输入的数字与四张牌相符、字符亦合法但是答案不正确,会弹出“错误!”;如果输入算式经运算后所得答案正确,则会弹出“正确!”。
e.计分功能的实现,当用户在每局游戏结束后,如果没有计算出正确结果,则会在历史记录中显示1题错误;如果计算出了正确结果,则会在记录中显示1题正确并显示一个0~100之间的整数值。
用户最终得分的确定是由其选择的游戏级别和游戏所花费时间长短来确定的。
5 测试5.1 测试方案测试过程中,由于既涉及到纸牌点数和运算符,又会涉及到运算式结果,于是相应地会显示出四种结果,(a)如果玩家在编辑框中没有输入任何数字和算符而直接按下了“验算”按钮,则会弹出“内部错误!”的提示对话框。
(b)如果玩家输入的数字与扑克牌给出的数字不符合,则会弹出“内部错误!”的提示对话框。
(c)如果玩家输入的数字与四张牌相符、字符亦合法但是计算结果不为24,会弹出“内部错误!”的提示对话框并在表达式编辑框中显示“错误!”(d)如果玩家输入算式经运算后所得答案正确,则会在编辑表达式框中显示“正确!”5.2 测试结果(a)进入游戏界面图5-1 游戏界面说明:本界面为游戏初始界面,默认难度级别为中级。
(b)发牌图5-2 发牌界面说明:点击“发牌”按钮,自动发牌,计时进度条开始滚动。
(c)不输入验算公式界面图5-3 错误界面说明:当不输入验算公式时,游戏界面会显示错误的提示。
(d)输入验算公式图5-4 输入算式界面图5-5正确输出界面图5-6 错误输出界面说明:点击输入算式后耗时标识停止,在旁边的输入框中输入算式后点击验算,正确或错误的界面会显示(e)没有来的及输入表达式,超过限制时间,页面显示为图5-7 超时输出界面说明:.如果在规定的时间内,玩家没有点击验算按钮,则会弹出“内部错误”的窗口。
6.小结这次课程设计,还是像往常一样,先由班长进行分组,每个小组完成一个任务。
这次我分到的学习任务是完成二十四点游戏软件开发的编程。
由于没有接触过游戏编程,一看到这个题目我就懵了。
但是课程设计还要继续,我先试着从网上搜寻我所需要的资料,可网上资料比较零散,在老师的提醒下,我去图书馆找到了我所需要的。
书中一些案例和我所要做的课程设计类似,经过自己知识上的补充和同组成员的协助,我顺利的完成了这次课程设计。