纸牌益智游戏-24点游戏

2023-10-30 10:10
文章标签 游戏 24 纸牌 益智

本文主要是介绍纸牌益智游戏-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.没括号的(形如a
b
c*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点游戏的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/307174

相关文章

2024.6.24 IDEA中文乱码问题(服务器 控制台 TOMcat)实测已解决

1.问题产生原因: 1.文件编码不一致:如果文件的编码方式与IDEA设置的编码方式不一致,就会产生乱码。确保文件和IDEA使用相同的编码,通常是UTF-8。2.IDEA设置问题:检查IDEA的全局编码设置和项目编码设置是否正确。3.终端或控制台编码问题:如果你在终端或控制台看到乱码,可能是终端的编码设置问题。确保终端使用的是支持你的文件的编码方式。 2.解决方案: 1.File -> S

高仿精仿愤怒的小鸟android版游戏源码

这是一款很完美的高仿精仿愤怒的小鸟android版游戏源码,大家可以研究一下吧、 为了报复偷走鸟蛋的肥猪们,鸟儿以自己的身体为武器,仿佛炮弹一样去攻击肥猪们的堡垒。游戏是十分卡通的2D画面,看着愤怒的红色小鸟,奋不顾身的往绿色的肥猪的堡垒砸去,那种奇妙的感觉还真是令人感到很欢乐。而游戏的配乐同样充满了欢乐的感觉,轻松的节奏,欢快的风格。 源码下载

剑指offer(C++)--孩子们的游戏(圆圈中最后剩下的数)

题目 每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0...m-1报数....这样下去

【服务器08】之【游戏框架】之【加载主角】

首先简单了解一下帧率 FixedUpdate( )   >   Update( )   >   LateUpdate( ) 首先FixedUpdate的设置值 默认一秒运行50次 虽然默认是0.02秒,但FiexedUpdate并不是真的0.02秒调用一次,因为在脚本的生命周期内,FixedUpdate有一个小循环,这个循环也是通过物理时间累计看是不是大于0.02了,然后调用一次。有

2024年6月24日-6月30日(ue独立游戏为核心)

试过重点放在独立游戏上,有个indienova独立游戏团队是全职的,由于他们干了几个月,节奏暂时跟不上,紧张焦虑了。五一时也有点自暴自弃了,实在没必要,按照自己的节奏走即可。精力和时间也有限,放在周末进行即可。除非哪天失业了,再也找不到工作了,再把重心放在独立游戏上。 另外,找到一个同样业余的美术,从头做肉鸽游戏,两周一次正式交流即可。节奏一定要放慢,不能影响正常工作生活。如果影响到了,还不如自

植物大战僵尸杂交版2.1版本终于来啦!游戏完全免费

在这个喧嚣的城市里,我找到了一片神奇的绿色世界——植物大战僵尸杂交版。它不仅是一款游戏,更像是一扇打开自然奥秘的窗户,让我重新认识了植物和自然的力量。 植物大战僵尸杂交版最新绿色版下载链接: https://pan.quark.cn/s/d60ed6e4791c 🌱 🔥 激情介绍:不只是游戏,更是生态课 植物大战僵尸杂交版将经典的策略塔防游戏带入了一个全新的维度。这里,每一种植物都拥

兰州理工大学24计算机考研情况,好多专业都接受调剂,只有计算机专硕不接收调剂,复试线为283分!

兰州理工大学(Lanzhou University of Technology),位于甘肃省兰州市,是甘肃省人民政府、教育部、国家国防科技工业局共建高校,甘肃省高水平大学和“一流学科”建设高校;入选国家“中西部高校基础能力建设工程”、教育部“卓越工程师计划”、“111计划”、新工科研究与实践项目、国家大学生创新性实验计划,是国家国防教育特色学校、全国毕业生就业典型经验高校、中国政府奖

游戏高度可配置化(一)通用数据引擎(data-e)及其在模块化游戏开发中的应用构想图解

游戏高度可配置化(一)通用数据引擎(data-e)及其在模块化游戏开发中的应用构想图解 码客 卢益贵 ygluu 关键词:游戏策划 可配置化 模块化配置 数据引擎 条件系统 红点系统 一、前言 在插件式模块化软件开发当中,既要模块高度独立(解耦)又要共享模块数据,最好的方法是有个中间平台(中间件)提供标准的接口来进行数据的交换,这在很多行业软件开发中已经广泛应用。但是,由于中间件的抽象和封

人工智能在数字病理切片虚拟染色以及染色标准化领域的研究进展|顶刊速递·24-06-23

小罗碎碎念 本期推文主题:人工智能在数字病理切片虚拟染色以及染色标准化领域的研究进展 这一期的推文是我发自内心觉得为数不多,特别宝贵的一篇推文,原因很简单——可参考的文献相对较少&方向非常具有研究意义&现在不卷。 数字病理方向的老师/同学应该清楚,不同中心提供的切片,染色方案是存在差异的,并且还存在各种质量问题,所以我们在数据预处理的时候,通常会先对切片的质量执行一遍筛选,然后再进行染

leetcode刷题(36)——24.两交换链表中的节点

给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。 示例: 给定 1->2->3->4, 你应该返回 2->1->4->3 题解: 这个题目有2种解法,一个是比较容易想到的循环求解,另外一个是比较难想到的递归求解 解法1:循环求解 关键点在于设置一个pre节点指向链表的头节点,很多链表题目的技巧都是这样设置一个pre