24点卡牌游戏C++实现

article/2025/10/24 6:43:00

问题描述:
24点游戏是经典的纸牌益智游戏。
常见游戏规则:
从扑克中每次取出4张牌。使用加减乘除,第一个能得出24者为赢。(其中,J代表11,Q代表12,K代表13,A代表1),按照要求编程解决24点游戏。
基本要求: 随机生成4个代表扑克牌牌面的数字字母,程序自动列出所有可能算出24的表达式,用擅长的语言(C/C++/Java或其他均可)实现程序解决问题。
1.程序风格良好(使用自定义注释模板)
2.列出表达式无重复。
提高要求:用户初始生命值为一给定值(比如3),初始分数为0。随机生成4个代表扑克牌牌面的数字或字母,由用户输入包含这4个数字或字母的运算表达式(可包含括号),如果表达式计算结果为24则代表用户赢了此局。
1. 程序风格良好(使用自定义注释模板)
2.使用计时器要求用户在规定时间内输入表达式,如果规定时间内运算正确则加分,超时或运算错误则进入下一题并减少生命值(不扣分)。
3.所有成绩均可记录在TopList.txt文件中。

算法分析

一、采用srand()和rand()配合使用随机生成1~13之间的四个数字,分别为a,b,c,d将4个整数放入数组num[ ]中

二、 在字符数组中存入 +– * / – -/运算符,分别对应flag的0,1,3,4,5。因为除法和减法不存在交换律,所以定义了反除和反减。

三、将用户输入的4个数字与4个运算符进行穷举组合排列,以构成多种不同的表达式,计算每一种表达式的值。

四、若表达式计算结果为24,则输入该表达式,程序运行结果输出所有可能性的排列组合

程序代码

//	+	-	*	/	--	-/
//	0	1	2	3	4	5
#include <iostream>
#include<stdio.h>
#include<math.h>
#include <cstdlib>
#include <ctime>
using namespace std;
#define random(a,b) (rand() % (b-a+1))+ a  //random的宏定义,便于rand()的计算
int calculate(float a,float b,float c,float d);  //24点计算函数
float myF(int flag,float m,float n);
void myPrint(int type,int i,int j,int k,float a,float b,float c,float d);int temp=0;
int main()
{int i,j,k,t,again,res,flag;float num[4]; //用于存放四个数字srand((int)time(0));  // 产生随机种子  把0换成NULL也行for (int i = 0; i < 4; i++){num[i]= random(1, 13);    //生成1-13间四个随机数存入num数组中cout<<num[i]<<" "<<endl;}for (i=0;i<4;i++)for (j=0;j<4;j++)if (j!=i)for (k=0;k<4;k++)if (k!=j && k!=i)for (t=0;t<4;t++)if (t!=i && t!=j && t!=k)        //循环对四个数字的计算进行组合{res=calculate(num[i],num[j],num[k],num[t]);}if (res==0)printf ("\nNo answer\n");return 0;
}int calculate(float a,float b,float c,float d)
{int i,j,k;float sum1,sum2,sum3;for (i=0;i<4;i++)for (j=0;j<6;j++)for (k=0;k<6;k++){if ((!(i==3 && b==0)) && (!(j==3 && c==0)) && (!(k==3 && d==0))){sum1=myF(i,a,b);   //  (((a#b)#c)#d)sum2=myF(j,sum1,c);sum3=myF(k,sum2,d);if (fabs(sum3-24)<0.1){temp++;  //type==1myPrint(1,i,j,k,a,b,c,d);   //类型1的输出}}if (k==2){sum1=myF(i,a,b);  //(a#b)*(c#d)sum2=myF(j,c,d);sum3=sum1*sum2;if (fabs(sum3-24)<0.1){temp++;myPrint(2,i,j,k,a,b,c,d);}}if (k==3){sum1=myF(i,a,b);   //(a#b)/(c#d)sum2=myF(j,c,d);if (sum2!=0){sum3=sum1/sum2;if (fabs(sum3-24)<0.1){temp++;myPrint(3,i,j,k,a,b,c,d);}}}}if (temp==0)        //没有能计算出24点的结果return 0;elsereturn 1;
}float myF(int flag,float m,float n)   //判断运算符功能
{if (flag==0)return (m+n);if (flag==1)return (m-n);if (flag==2)return (m*n);if (flag==3)if (n==0)return 30000;elsereturn (m/n);if (flag==4)      //反减return (n-m);if (flag==5)     //反除if (m==0)return 30000;elsereturn (n/m);return 0;
}void myPrint(int type,int i,int j,int k,float a,float b,float c,float d)
{char sigle[6];sigle[0]='+';sigle[1]='-';sigle[2]='*';sigle[3]='/';sigle[4]='-';sigle[5]='/';if (type==1){if(j==4 || j==5){if (k==4 || k==5)printf("%2.0f %c (%2.0f %c (%2.0f %c %2.0f)) =24\n",d,sigle[k],c,sigle[j],a,sigle[i],b);elseprintf("(%2.0f %c (%2.0f %c %2.0f)) %c %2.0f =24\n",c,sigle[j],a,sigle[i],b,sigle[k],d);}else if (k==4 || k==5){printf("%2.0f %c ((%2.0f %c %2.0f) %c %2.0f) =24\n",d,sigle[k],a,sigle[i],b,sigle[j],c);}elseprintf("((%2.0f %c %2.0f) %c %2.0f) %c %2.0f =24\n",a,sigle[i],b,sigle[j],c,sigle[k],d);}if (type==2 || type==3){printf("(%2.0f %c %2.0f) %c (%2.0f %c %2.0f) =24\n",a,sigle[i],b,sigle[k],c,sigle[j],d);}
}

概要设计

概要设计
一、主函数程序流程图
在这里插入图片描述

二、Calculate函数流程图

在这里插入图片描述

calculat函数对四个数字a,b,c,d进行穷举,对每一种的运算结果进行判断,若等于24则该表达式是结果之一。

三、myF函数流程图
在这里插入图片描述

myF函数通过形参得到的flag值进行判断,从而进行相应的运算。

调试

测试
一、测试一:随机数产生测试
测试代码:

srand((int)time(0));  // 产生随机种子  把0换成NULL也行
for (int i = 0; i < 4; i++){num[i]= random(1, 13);    //生成1-13间四个随机数存入num数组中}

测试结果:
在这里插入图片描述

可以看到,程序成功的生成了四个随机数,并且由于srand函数产生随机种子使得每次都可成功产生完全随机的数字。
二、测试主程序输出结果
测试代码:

int main()
{int i,j,k,t,again,res,flag;float num[4]; //用于存放四个数字srand((int)time(0));  // 产生随机种子  把0换成NULL也行for (int i = 0; i < 4; i++){num[i]= random(1, 13);    //生成1-13间四个随机数存入num数组中cout<<num[i]<<" "<<endl;}for (i=0;i<4;i++)for (j=0;j<4;j++)if (j!=i)for (k=0;k<4;k++)if (k!=j && k!=i)for (t=0;t<4;t++)if (t!=i && t!=j && t!=k)        //循环对四个数字的计算进行组合{res=calculate(num[i],num[j],num[k],num[t]);}if (res==0)printf ("\nNo answer\n");return 0;
}

测试结果:
在这里插入图片描述

程序成功将系统随机生成的数字1,3,5,13进行了穷举,列出了所有可能的表达式,根据验证,输出结果正确。

三、测试无法组成24点的数据
在这里插入图片描述

经过多次运行,对于系统随机生成的8,7,12,10这四个数据,无法组成24点,程序输出No answer运行正确。

心得体会

对于此次程序的编写,考虑到的因素较多,在没有思路的初期在网上借鉴了相关的算法思路,对题目的要求进行了分析,对需要的程序模块进行了分解,细化了问题的解法。使得程序的编写变得更为简单,同时学会了在c++中利用srand以及rand函数生成随机数的方法,更加深刻的认识到了程序设计的标准以及流程方法。对以后的学习打下基础。


http://chatgpt.dhexx.cn/article/daCovKtS.shtml

相关文章

Python 小程序:计算24点

今天玩24点的时候&#xff0c;突然希望想编写一个 计算24点的小程序&#xff0c;为python的初学者提供一些帮助。 24点是许多人都会玩的游戏。玩法在这里简单的介绍一下&#xff1a;选4个数字&#xff08;1-13中任意&#xff09;&#xff0c;然后用加减乘除算出24。计算时&…

24点答案生成器

故事背景&#xff1a;晚上拿起扑克牌&#xff0c;奈何没有牌友&#xff0c;百度了一下有什么单人扑克游戏&#xff0c;然后就发现了24点&#xff0c;随意挑出4张牌&#xff0c;只用加减乘除组合成24点&#xff0c;我抽出了7 7 8 Q(12) &#xff0c;然后思索了半天没有答案&…

蓝桥杯 试题 算法训练 24点 C++ 详解

问题描述&#xff1a; 24点游戏是一个非常有意思的游戏&#xff0c;很流行&#xff0c;玩法很简单&#xff1a;给你4张牌&#xff0c;每张牌上有数字&#xff08;其中A代表1&#xff0c;J代表11&#xff0c;Q代表12&#xff0c;K代表13&#xff09;&#xff0c;你可以利用数学中…

24点游戏(python)

24点游戏&#xff08;python&#xff09; 一、题目要求 1.问题描述&#xff1a; 24点游戏是经典的纸牌益智游戏。常见游戏规则&#xff1a; 从扑克中每次取出4张牌。使用加减乘除&#xff0c;第一个能得出24者为赢。&#xff08;其中&#xff0c;J代表11&#xff0c;Q代表12&a…

用java实现24点游戏

前言 用java实现24点游戏 Welocome to Xiang’s world~ 题目ღ( &#xff65;ᴗ&#xff65; ) 24点游戏是经典的纸牌益智游戏。 常见游戏规则&#xff1a; 从扑克中每次取出4张牌。使用加减乘除&#xff0c;第一个能得出24者为赢。&#xff08;其中&#xff0c;J代表11&am…

C++ 实现计算24点

原理 暴力枚举所有的情况&#xff0c;运算符号4个&#xff0c;加减乘除 - * / &#xff0c;整数数字4个&#xff08;易扩展为5个数或者更多&#xff09;。所需要枚举的次数&#xff1a; 数字顺序&#xff1a;4个数的全排列&#xff0c;4! 24。运算符号&#xff1a;4个数需要…

计算机上的24点游戏怎么玩,趣味算数二十四点游戏规则怎么玩技巧

概述&#xff1a;这是一个算数游戏&#xff0c;用四张牌计算得出24。 时间&#xff1a;20分钟 人数&#xff1a;集体参与 目的&#xff1a;锻炼学员的快速计算能力。 道具&#xff1a;扑克牌 步骤&#xff1a; 1.去点大小王&#xff0c;“K”计13点&#xff0c;“Q”计12点&…

【编程|二十四点】关于编程解决二十四点的两种思路

【编程心得系列*24点】 写在前面&#xff1a;编程心得系列不谈具体问题的代码&#xff0c;只谈解决思路。 这是一个关于二十四点的软件。属于典型的先有目的再有初衷的软件。 在此之前我倒是写过一个解数独的软件。但那个的核心代码部分毕竟是抄袭的。这次是觉得对自己更有信…

计算机二十四点游戏怎么玩,扑克牌二十四点怎么玩?扑克牌二十四点游戏规则介绍...

扑克牌二十四点是在国际上很流行的一种扑克游戏玩法&#xff0c;因为游戏计算性较强&#xff0c;较为考验的玩家的心算能力&#xff0c;所以很受扑克玩家的喜爱&#xff0c;那么扑克牌二十四点到底是怎么玩的呢&#xff1f;扑克牌二十四点的游戏规则又是什么呢&#xff1f;下面…

CCF计算机软件能力认证试题练习:201903-2 二十四点

二十四点 来源&#xff1a;CCF 标签&#xff1a; 参考资料&#xff1a; 相似题目&#xff1a; 背景 二十四点是一款著名的纸牌游戏&#xff0c;其游戏的目标是使用 3 个加减乘除运算使得 4张纸牌上数字的运算结果为 24。 题目 定义每一个游戏由 4 个从 1-9 的数字和 3 个四则运…

asdasdas

asdasdasdsadassad 阅读全文: http://gitbook.cn/gitchat/activity/5d634f8c5cbc425420e0e72f 您还可以下载 CSDN 旗下精品原创内容社区 GitChat App &#xff0c;阅读更多 GitChat 专享技术内容哦。

dsada

图2.2 www.sina.com网站系统采用的基本上就是图2.2所示的架构&#xff0c;不同地区的人们在访问www.sina.com站点时&#xff0c;浏览器实际上所访问的服务器是不一样的&#xff0c;例如&#xff0c;吉林省的用户访问的服务器实际是sina放在吉林地区的代理服务器&#xff0c;湖北…

Asdasd

这里写阿阿萨德斯达四大自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义…

dsa-基础

算法与数据结构 0.概念数据结构复杂度时间复杂度空间复杂度 1. 线性表顺序表(数组)链表单链表双链表循环链表静态链表 顺序表/链表栈顺序栈链式栈 队列顺序循环队列链表队列双端队列 2. 递归递归与栈阶乘例子 3. 矩阵对称矩阵三角矩阵稀疏矩阵 4. 字符串 0.概念 数据结构 逻辑…

dsadas

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

DSDA 简介

参考link&#xff1a;千呼万唤&#xff0c;5G双卡双通到底有多重要&#xff1f;__财经头条 (sina.com.cn)

Java 排序算法:折半插入排序

有关排序的基本内容可以查看以下链接&#xff1a; 折半插入排序_360百科折半插入排序,折半插入排序(Binary Insertion Sort)是对插入排序算法的一种改进。所谓插入排序&#xff0c;就是不断的依次将元素插入前面已排好序的序列中。https://baike.so.com/doc/7028767-7251672.h…

Java排序算法——猴子排序(Bogo Sort)

此排序和之前介绍的三种排序没有任何关系&#xff0c;只是单纯在整理排序算法突然想到曾经看到过关于此排序的描述&#xff0c;现在总结一下。 之前三种排序的传送门开一下&#xff1a; 冒泡排序&#xff1a; Java排序算法——冒泡排序&#xff08;Bubble Sort&#xff09;ht…