本文为大家分享了经典24点纸牌益智游戏的具体实现方法,供大家参考,具体内容如下
一.实验内容
24点游戏是经典的纸牌益智游戏。
常见游戏规则:
从扑克中每次取出4张牌。使用加减乘除,第一个能得出24者为赢。(其中,J代表11,Q代表12,K代表13,A代表1),按照要求编程解决24点游戏。
基本要求: 随机生成4个代表扑克牌牌面的数字字母,程序自动列出所有可能算出24的表达式,用擅长的语言(C/C++/Java或其他均可)实现程序解决问题。
1.程序风格良好(使用自html" target="_blank">定义注释模板)
2.列出表达式无重复。
二.算法设计思路
算法描述:
1.通过rand()函数生成4个随机数
2.通过F()函数进行递归调用
3.首先将数组A中的两个数进行运算,得到结果,然后通过递归调用将结果与下一个数字运算,得到结果再通过递归调用,与最后一个数进行运算
4.递归过程中,判断是否(n==1&&A[0]==24),满足条件则输出结果。最后通过count最终知道有多少种解法
三.代码实现
#include<iostream> #include<stdlib.h> #include<math.h> #include<string.h> #include<ctime> using namespace std; int n=4; //三次运算标记值 double A[4]={0}; //存储4个数字 char oper[4]={'+','-','*','/'}; //存储运算符 string B[4]; int count=0; int F(int n){ //判断是否已完成三次运算 if(n==1){ if(A[0]==24) //判断结果是否为24 { cout<<B[0]<<endl; //如果是则输出B[0]里蕴含的整个表达式 count++; } } //递归实现 //从数组中任意取出两个数的组合 for(int i=0;i<n;i++){ for(int j=i+1;j<n;j++){ double a,b; string x,y; a=A[i]; b=A[j]; A[j]=A[n-1]; //将最后一位数赋给A[j] x=B[i]; y=B[j]; B[j]=B[n-1]; //最后一位数字放入B[j]中 //加法 A[i]=a+b; //第一个空间保存前两个数的运算结果 B[i]='('+x+'+'+y+')'; //将运算结果存入数组B中 F(n-1); //减法 //考虑两种情况:1. a-b 2. b-a A[i]=a-b; B[i]='('+x+'-'+y+')'; F(n-1); A[i]=b-a; B[i]='('+y+'-'+x+')'; F(n-1); //乘法 A[i]=a*b; B[i]='('+x+'*'+y+')'; F(n-1); //除法 //考虑两种情况:1. a/b 2. b/a 同时需要判断分母不为零 if(b!=0){ A[i]=a/b; B[i]='('+x+'/'+y+')'; F(n-1); } if(a!=0){ A[i]=b/a; B[i]='('+y+'/'+x+')'; F(n-1); } //当以上四则运算的结果都不能满足条件时 //进入下一个for循环之前, 需要将之前的i和j上的值都找回,即赋值 A[i]=a; A[j]=b; B[i]=x; B[j]=y; } } } class RandNum{ public: RandNum(){ srand(time(0)); } double get(int begin = 0, int end = 1){ return rand()%(end-begin+1)+begin; } }; int main(void) { RandNum r; for (int i = 0; i < 4; i++) { //生成4个1~13之间的数字 A[i]=r.get(1,13); //将生成的数字存入数组A中 cout<<A[i]<<" "; } cout<<endl; for(int i=0;i<4;i++){ if(A[i]==1) B[i]='A'; else if(A[i]==10) B[i]="10"; else if(A[i]==11) B[i]='J'; else if(A[i]==12) B[i]='Q'; else if(A[i]==13) B[i]='K'; else B[i]='0'+A[i]; } F(n); cout<<endl<<"总共有 "<<count<<" 种解法"<<endl; return 0; }
四.测试及运行结果
五.经验归纳
这次的程序设计采用了递归调用的方式,使得问题一步步化简,即每次都是两个数字进行运算,得到结果,结果再与下一个数字进行运算,直到满足终止条件,结束递归。递归这种思想虽然很好写出,但难以理解,尤其是对一些大型的算法。通过这次的程序设计,我对递归有了更深的认识。虽然递归的执行效率很低,但是有一些问题必须使用递归解决,因此我会在以后的程序设计中经常用到递归,提高对于递归的理解能力。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。
本文向大家介绍java实现24点纸牌游戏,包括了java实现24点纸牌游戏的使用技巧和注意事项,需要的朋友参考一下 本文题目为大家分享了java实现24点纸牌游戏的具体代码,供大家参考,具体内容如下 题目 24点游戏是经典的纸牌益智游戏。 常见游戏规则: 从扑克中每次取出4张牌。使用加减乘除,第一个能得出24者为赢。(其中,J代表11,Q代表12,K代表13,A代表1),按照要求编程解决24点游戏
本文向大家介绍C语言实现纸牌计算24点小游戏,包括了C语言实现纸牌计算24点小游戏的使用技巧和注意事项,需要的朋友参考一下 利用系统时间设定随机种子生成4个随机数,并对4个数字之间的运算次序以及运算符号进行枚举,从而计算判断是否能得出24,以达到程序目的。程序主要功能已完成,目前还有部分细节未处理,待完成ing...对于代码中的错误,恳请批评指正。 游戏描述: A-10:分别代表数字 1-10
本文向大家介绍Java编写的24点纸牌游戏,包括了Java编写的24点纸牌游戏的使用技巧和注意事项,需要的朋友参考一下 任意4个1-13数字,加减乘除计算24点。 实现原理: 1)排列组合4个数字 2)计算每次排列组合的可能性 Cal24.java Combination.java 以上所述就是本文的全部内容了,希望大家能够喜欢。
本文向大家介绍C#实现洗牌游戏实例,包括了C#实现洗牌游戏实例的使用技巧和注意事项,需要的朋友参考一下 棋牌类游戏是目前比较火的游戏之一。今天本文就以实例形式实现洗牌游戏。本文实例所采用的算法是:遍历每个位置上的牌,然后与随机位置上的牌交换。 运行结果如下图所示: 对于牌来讲,2个关键的因素是面值和类型(如红桃、梅花等)。 代码如下: 客户端程序有3个方法,一个是初始化牌的数组,一个是遍历所有牌并
我试图用Java实现纸牌游戏“Skat” 规则: 有32张卡片。每张牌在游戏中只存在一次。 颜色有:梅花、黑桃、红心、钻石 价值观是:王牌,国王,王后,杰克,十,九,八,七 那些牌被洗牌了。有三名球员 第一轮:每位玩家有3张牌。然后将两张卡片放入Skat。 第二轮:每位玩家再获赠4张牌。 第三轮:每位玩家再获得3张牌。 期望输出:每个玩家的牌都被展示(每张牌都应该存在一次) 我的产量:钻石七(32
本文向大家介绍C语言实现随机抽取纸牌,包括了C语言实现随机抽取纸牌的使用技巧和注意事项,需要的朋友参考一下 利用数组实现从一副牌中随机抽取纸牌,供大家参考,具体内容如下 一、项目要求 本程序负责发一副标准纸牌,每张标准纸牌都有一种花色(梅花、方块、黑桃、红桃)和一个等级(2,3,4,5,6…K,A)。程序需要用户指明手机有几张牌,格式为: Enter number of cards in hand