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

 更新时间:2020年03月06日 11:38:12   作者:晴水如蓝  
这篇文章主要介绍了C++实现经典24点纸牌益智游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文为大家分享了经典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/C++中可变参数的详细介绍(va_list,va_start,va_arg,va_end)

    关于C/C++中可变参数的详细介绍(va_list,va_start,va_arg,va_end

    可变参数的函数原理其实很简单,而va系列是以宏定义来定义的,实现跟堆栈相关.我们写一个可变函数的C函数时,有利也有弊,所以在不必要的场合,我们无需用到可变参数。如果在C++里,我们应该利用C++的多态性来实现可变参数的功能,尽量避免用C语言的方式来实现
    2013-10-10
  • C语言中的奇技淫巧

    C语言中的奇技淫巧

    学习C语言的过程中,总会遇到很多令人眼前一亮的代码,尤其是你写了几十行的代码,别人只用了简单几行的递归就实现的功能。下面我就总结几个C语言中 比较新手向的代码。让你有一种woc!还能这么写的想法
    2018-08-08
  • C语言实现学生成绩管理系统

    C语言实现学生成绩管理系统

    这篇文章主要为大家详细介绍了C语言实现学生成绩管理系统,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • C++利用循环和栈实现走迷宫

    C++利用循环和栈实现走迷宫

    这篇文章主要为大家详细介绍了C++利用循环和栈实现走迷宫,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05
  • C语言数独游戏的求解方法

    C语言数独游戏的求解方法

    这篇文章主要为大家详细介绍了C语言数独游戏的求解方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • C语言结课设计之计算器功能

    C语言结课设计之计算器功能

    这篇文章主要为大家详细介绍了C语言结课设计之计算器功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-02-02
  • C语言 坐标移动详解及实例代码

    C语言 坐标移动详解及实例代码

    这篇文章主要介绍了C语言 坐标移动详解及实例代码的相关资料,需要的朋友可以参考下
    2017-01-01
  • C++使用Kruskal和Prim算法实现最小生成树

    C++使用Kruskal和Prim算法实现最小生成树

    这篇文章主要介绍了C++使用Kruskal和Prim算法实现最小生成树,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • C语言 数据结构中栈的实现代码

    C语言 数据结构中栈的实现代码

    这篇文章主要介绍了C语言 数据结构中栈的实现代码的相关资料,需要的朋友可以参考下
    2016-10-10
  • C++实现稀疏矩阵的压缩存储实例

    C++实现稀疏矩阵的压缩存储实例

    本篇文章主要介绍了C++实现稀疏矩阵的压缩存储实例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06

最新评论