C++实现经典24点纸牌益智游戏

作者:晴水如蓝 时间:2023-04-22 01:05:02 

本文为大家分享了经典24点纸牌益智游戏的具体实现方法,供大家参考,具体内容如下

一.实验内容

24点游戏是经典的纸牌益智游戏。

常见游戏规则:

从扑克中每次取出4张牌。使用加减乘除,第一个能得出24者为赢。(其中,J代表11,Q代表12,K代表13,A代表1),按照要求编程解决24点游戏。
基本要求: 随机生成4个代表扑克牌牌面的数字字母,程序自动列出所有可能算出24的表达式,用擅长的语言(C/C++/Java或其他均可)实现程序解决问题。
1.程序风格良好(使用自定义注释模板)
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;
}

四.测试及运行结果

C++实现经典24点纸牌益智游戏

C++实现经典24点纸牌益智游戏

五.经验归纳

这次的程序设计采用了递归调用的方式,使得问题一步步化简,即每次都是两个数字进行运算,得到结果,结果再与下一个数字进行运算,直到满足终止条件,结束递归。递归这种思想虽然很好写出,但难以理解,尤其是对一些大型的算法。通过这次的程序设计,我对递归有了更深的认识。虽然递归的执行效率很低,但是有一些问题必须使用递归解决,因此我会在以后的程序设计中经常用到递归,提高对于递归的理解能力。

来源:https://blog.csdn.net/qq_43165874/article/details/89298294

标签:C++,纸牌,游戏
0
投稿

猜你喜欢

  • C#实现简易点餐功能

    2021-10-20 22:14:31
  • Android:如何编写“万能”的Activity

    2023-08-15 17:49:26
  • 解决SpringBoot框架因post数据量过大没反应问题(踩坑)

    2023-11-28 11:59:30
  • Android通过ExifInterface判断Camera图片方向的方法

    2023-02-02 18:43:38
  • C#基于XNA生成随机颜色的方法

    2021-07-05 08:34:50
  • java不可逆加密算法之md5加密算法使用示例

    2023-07-25 09:43:36
  • Mybatis日志模块的适配器模式详解

    2023-11-26 12:45:32
  • Java循环对bean的属性进行赋值的实现

    2023-01-27 10:18:05
  • Gradle修改本地仓库的位置方法实现

    2022-01-17 21:25:52
  • Java的JSTL标签库详解

    2023-07-13 21:58:35
  • Vs2022环境下安装低版本.net framework的实现步骤

    2023-07-04 02:58:12
  • SpringDataJpa like查询无效的解决

    2021-12-02 11:32:40
  • c# 模拟线性回归的示例

    2022-08-26 02:50:49
  • winform实现限制及解除鼠标移动范围的方法

    2023-07-17 22:11:51
  • IntelliJ IDEA多屏后窗口不显示问题解决方案

    2022-11-17 14:40:45
  • Android中NestedScrolling滑动机制详解

    2022-09-16 22:32:13
  • 详解Java 信号量Semaphore

    2021-12-22 11:10:36
  • SpringBoot项目从搭建到发布一条龙

    2023-11-21 09:28:44
  • Java求1+2!+3!+...+20!的和的代码

    2021-12-16 10:55:23
  • 解析Android 8.1平台SystemUI 导航栏加载流程

    2023-06-23 15:21:21
  • asp之家 软件编程 m.aspxhome.com