纸牌益智游戏-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

相关文章

Python实例题之pygame开发打飞机游戏实例代码

《Python实例题之pygame开发打飞机游戏实例代码》对于python的学习者,能够写出一个飞机大战的程序代码,是不是感觉到非常的开心,:本文主要介绍Python实例题之pygame开发打飞机... 目录题目pygame-aircraft-game使用 Pygame 开发的打飞机游戏脚本代码解释初始化部

Python开发文字版随机事件游戏的项目实例

《Python开发文字版随机事件游戏的项目实例》随机事件游戏是一种通过生成不可预测的事件来增强游戏体验的类型,在这篇博文中,我们将使用Python开发一款文字版随机事件游戏,通过这个项目,读者不仅能够... 目录项目概述2.1 游戏概念2.2 游戏特色2.3 目标玩家群体技术选择与环境准备3.1 开发环境3

Python开发围棋游戏的实例代码(实现全部功能)

《Python开发围棋游戏的实例代码(实现全部功能)》围棋是一种古老而复杂的策略棋类游戏,起源于中国,已有超过2500年的历史,本文介绍了如何用Python开发一个简单的围棋游戏,实例代码涵盖了游戏的... 目录1. 围棋游戏概述1.1 游戏规则1.2 游戏设计思路2. 环境准备3. 创建棋盘3.1 棋盘类

国产游戏崛起:技术革新与文化自信的双重推动

近年来,国产游戏行业发展迅猛,技术水平和作品质量均得到了显著提升。特别是以《黑神话:悟空》为代表的一系列优秀作品,成功打破了过去中国游戏市场以手游和网游为主的局限,向全球玩家展示了中国在单机游戏领域的实力与潜力。随着中国开发者在画面渲染、物理引擎、AI 技术和服务器架构等方面取得了显著进展,国产游戏正逐步赢得国际市场的认可。然而,面对全球游戏行业的激烈竞争,国产游戏技术依然面临诸多挑战,未来的

火柴游戏java版

代码 /*** 火柴游戏* <p>* <li>有24根火柴</li>* <li>组成 A + B = C 等式</li>* <li>总共有多少种适合方式?</li>* <br>* <h>分析:</h>* <li>除去"+"、"="四根,最多可用火柴根数20根。</li>* <li>全部用两根组合成"1",最大数值为1111。使用枚举法,A和B范围在0~1111,C为A+B。判断</li>** @

国产游戏行业的崛起与挑战:技术创新引领未来

国产游戏行业的崛起与挑战:技术创新引领未来 近年来,国产游戏行业蓬勃发展,技术水平不断提升,许多优秀作品在国际市场上崭露头角。从画面渲染到物理引擎,从AI技术到服务器架构,国产游戏已实现质的飞跃。然而,面对全球游戏市场的激烈竞争,国产游戏技术仍然面临诸多挑战。本文将探讨这些挑战,并展望未来的机遇,深入分析IT技术的创新将如何推动行业发展。 国产游戏技术现状 国产游戏在画面渲染、物理引擎、AI

Science|癌症中三级淋巴结构的免疫调节作用与治疗潜力|顶刊精析·24-09-08

小罗碎碎念 Science文献精析 今天精析的这一篇综述,于2022-01-07发表于Science,主要讨论了癌症中的三级淋巴结构(Tertiary Lymphoid Structures, TLS)及其在肿瘤免疫反应中的作用。 作者类型作者姓名单位名称(中文)通讯作者介绍第一作者Ton N. Schumacher荷兰癌症研究所通讯作者之一通讯作者Daniela S. Thomm

第四次北漂----挣个独立游戏的素材钱

第四次北漂,在智联招聘上,有个小公司主动和我联系。面试了下,决定入职了,osg/osgearth的。月薪两万一。 大跌眼镜的是,我入职后,第一天的工作内容就是接手他的工作,三天后他就离职了。 我之所以考虑入职,是因为 1,该公司有恒歌科技的freex平台源码,可以学学,对以前不懂的解解惑。 2,挣点素材钱,看看张亮002的视频,他用了6000多,在虚幻商城买的吸血鬼游戏相关的素材,可以玩两年。我

nyoj 1038 纸牌游戏

poj 的一道改编题,说是翻译题更恰当,因为只是小幅度改动。 一道模拟题,代码掌控能力比较好,思维逻辑清晰的话就能AC。 代码如下: #include<stdio.h>#include<string.h>#include<algorithm>using namespace std;struct node{char c[5];int rk;char da[5];int nu

纸牌函数生成器

此模板用来生成纸牌类的测试数据,本人手打,不合理或缀余的地方希望大神指出。 T=10000(测试数据组数), t (两摞相等的牌,每摞牌的数量); 每张牌用A,2~9,T,J,Q,K;表示牌面大小; 用S,H,C,D;表示花色。 共52张牌。 #include<stdio.h>#include<time.h>#include<stdlib.h>#include<string.