24点游戏
来源:互联网 发布:淘宝手机怎么五星好评 编辑:程序博客网 时间:2024/06/16 20:14
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分。(暂未实现)
代码展示:
#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 (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();}
阅读全文
0 0
- 24点游戏代码
- 24点游戏
- 24点扑克牌游戏
- 24点游戏
- 24点游戏
- 《24点游戏》
- 24点游戏
- 24点游戏
- 24点游戏
- 24点游戏
- 24点游戏
- 24点游戏
- 24点游戏
- 24点游戏源码
- 24点游戏
- 24点游戏-hero
- 24点游戏
- 24点游戏算法
- 【C++】各种排序运行时间的测试
- 机器学习和数据挖掘(9):线性模型
- 2017年8月8日提高组T3 题目
- 如何获取data-id中的值
- 剑指offer之斐波那契数列
- 24点游戏
- GZSD6410板子 UBOOT + 内核 + 文件系统布置成功
- 【SSLGZ 2670】2017年8月8日提高组T1 作业
- C语言数据结构——数据结构有序二叉树的函数实现
- SVN版本库的备份迁移
- Java:按值传递还是按引用传递详细解说
- chinese hacker:
- 划分树
- Jquery dataTable详解