24点游戏
2017-08-08 21:26
197 查看
Think:
部分 卡牌 会出错, 近期会进行改正修改。
C语言实现纸牌计算24点小游戏
利用系统时间设定随机种子生成4个随机数,并对4个数字之间的运算次序以及运算符号进行枚举,从而计算判断是否能得出24,以达到程序目的。程序主要功能已完成,目前还有部分细节未处理,待完成ing…对于代码中的错误,恳请批评指正。
游戏描述:
A-10:分别代表数字 1-10。
J,Q,K:均代表数字1。
考虑到部分地方的规则,J,Q,K 也可以当成10 ,或者直接代表本身所代表的数字,即11、12、13来运算。
使用加减乘除,能得出24者为赢,存在无解情况。
游戏开始得分为1000分,每一秒钟减少1分,当答对一次时,分数增加100分。(暂未实现)
代码展示:
部分 卡牌 会出错, 近期会进行改正修改。
C语言实现纸牌计算24点小游戏
利用系统时间设定随机种子生成4个随机数,并对4个数字之间的运算次序以及运算符号进行枚举,从而计算判断是否能得出24,以达到程序目的。程序主要功能已完成,目前还有部分细节未处理,待完成ing…对于代码中的错误,恳请批评指正。
游戏描述:
A-10:分别代表数字 1-10。
J,Q,K:均代表数字1。
考虑到部分地方的规则,J,Q,K 也可以当成10 ,或者直接代表本身所代表的数字,即11、12、13来运算。
使用加减乘除,能得出24者为赢,存在无解情况。
游戏开始得分为1000分,每一秒钟减少1分,当答对一次时,分数增加100分。(暂未实现)
代码展示:
#include<stdio.h> #include<stdlib.h> #include<windows.h> #include<conio.h> #include<time.h> #include<math.h> #include<iostream> using namespace std; char GetCard(int key) //转换卡牌 { if (key == 1) return 'A'; if (key < 10) return key + '0'; if(key == 10) return '0'; if(key == 11) return 'J'; if(key == 12) return 'Q'; if(key == 13) return 'K'; return 0; } void PrintfAnswer(int flag, int *pocket, char *oper, char *answer) { char a = GetCard(pocket[0]); //赋予输出 char b = GetCard(pocket[1]); char c = GetCard(pocket[2]); char d = GetCard(pocket[3]); switch(flag) //列举输出情况 ———— 共5种 { //((A B) C) D case 1: printf("((%c%c%c)%c%c)%c%c\n", a, oper[0], b, oper[1], c, oper[2], d); break; //(A (B C)) D case 2: printf("(%c%c(%c%c%c))%c%c\n", a, oper[0], b, oper[1], c, oper[2], d); break; //(A B) (A B) case 3: printf("(%c%c%c)%c(%c%c%c)\n", a, oper[0], b, oper[1], c, oper[2], d); break; //A (B (C D)) case 4: printf("%c%c(%c%c(%c%c%c))\n", a, oper[0], b, oper[1], c, oper[2], d); break; //A ((B C) D) case 5: printf("%c%c((%c%c%c)%c%c)\n", a, oper[0], b, oper[1], c, oper[2], d); break; default : break; } return ; } double Sum(double num1, double num2, char oper) //计算函数 { double ans; switch(oper) { case '+': ans = num1 + num2; break; case '-': ans = fabs(num1 - num2); break; case '*': ans = num1 * num2; break; case '/': ans = num1 / num2; break; default : break; } return ans; } int GetResult(int *pocket, char *oper, char *answer) //利用fabs减小误差 { double temp; int a, b, c, d; //储存 计算结果 if (pocket[0] > 10) a = 1; else a = pocket[0]; if (pocket[1] > 10) b = 1; else b = pocket[1]; if 4000 (pocket[2] > 10) c = 1; else c = pocket[2]; if (pocket[3] > 10) d = 1; else d = pocket[3]; //((A B) C) D 开始穷举计算 temp = 0; temp = Sum(a, b, oper[0]); temp = Sum(temp, c, oper[1]); temp = Sum(temp, d, oper[2]); if(fabs(temp - 24) <= 1e-6) { PrintfAnswer(1, pocket, oper, answer); return 1; } //(A (B C)) D temp = 0; temp = Sum(b, c, oper[1]); temp = Sum(a, temp, oper[0]); temp = Sum(temp, d, oper[2]); if(fabs(temp - 24) <= 1e-6) { PrintfAnswer(2, pocket, oper, answer); return 1; } //(A B) (C D) double t = Sum(a, b, oper[0]); temp = Sum(c, d, oper[2]); temp = Sum(t, temp, oper[1]); if(fabs(temp - 24) <= 1e-6) { PrintfAnswer(3, pocket, oper, answer); return 1; } //A (B (C D)) temp = 0; temp = Sum(c, d, oper[2]); temp = Sum(b, temp, oper[1]); temp = Sum(a, temp, oper[0]); if(fabs(temp - 24) <= 1e-6) { PrintfAnswer(4, pocket, oper, answer); return 1; } //A ((B C) D) temp = 0; temp = Sum(b, c, oper[1]); temp = Sum(temp, d, oper[2]); temp = Sum(a, temp, oper[0]); if(fabs(temp - 24) <= 1e-6) { PrintfAnswer(5, pocket, oper, answer); return 1; } return 0; } void Total(int *pocket, char *answer) { char Operator[] = {'+', '-', '*', '/'}; char oper[4]; int i, j, k; int cnt = 0;// 记录解题方案个数 for (i = 0; i <= 3; i ++) for (j = 0; j <= 3; j ++) for (k = 0; k <= 3; k ++) { oper[0] = Operator[i]; oper[1] = Operator[j]; oper[2] = Operator[k]; if (GetResult(pocket, oper, answer)) cnt ++; } if (cnt != 0) printf("共有%d种解法\n", cnt); else printf("此题无解\n"); } void PrintfPocketCard(int *pocket) { int i; for (i = 0; i < 4; i ++) { printf("%c ", GetCard(pocket[i])); } printf("\n"); } void GetRandomCard(int *pocket) //得到随机的 4张卡牌 { int i; srand((unsigned)time(NULL)); for (i = 0; i < 4; i ++) { pocket[i] = rand()%12 + 1; } } void Display() { printf("*********************************************\n"); Sleep(500); printf("*** 计算24点 ***\n"); Sleep(500); printf("*** ***\n"); Sleep(500); printf("*** ___by 棺木酥 ***\n"); Sleep(500); printf("*********************************************\n"); } void QuitSystem() { printf("*********************************************\n"); Sleep(500); printf("*** 欢迎再次使用 ***\n"); Sleep(500); printf("*** ***\n"); Sleep(500); printf("*** ___by 棺木酥 ***\n"); Sleep(500); printf("*********************************************\n"); } int main() { system("color 9E"); Display(); int pocket[10]; char answer[30]; char ch; while(1) { GetRandomCard(pocket); //获得卡牌 printf("随机卡牌为:\n"); PrintfPocketCard(pocket); //输出卡牌 printf("任意键查看结果\n"); //计算输出结果 system("pause"); Total(pocket, answer); printf("任意键继续, ESC键退出\n"); ch = getchar(); if (ch == 27) break; } QuitSystem(); }
相关文章推荐