##24点游戏程序实现算法(文末源代码)

##24点游戏程序实现算法(文末源代码)
题目要求:
24点游戏是经典的纸牌益智游戏。
常见游戏规则:
从扑克中每次取出4张牌。使用加减乘除,第一个能得出24者为赢。(其中,J代表11,Q代表12,K代表13,A代表1),按照要求编程解决24点游戏。
基本要求: 随机生成4个代表扑克牌牌面的数字字母,程序自动列出所有可能算出24的表达式,用擅长的语言(C/C++/Java或其他均可)实现程序解决问题。
1.程序风格良好(使用自定义注释模板)
2.列出表达式无重复。
提高要求:用户初始生命值为一给定值(比如3),初始分数为0。随机生成4个代表扑克牌牌面的数字或字母,由用户输入包含这4个数字或字母的运算表达式(可包含括号),如果表达式计算结果为24则代表用户赢了此局。
1. 程序风格良好(使用自定义注释模板)
2.使用计时器要求用户在规定时间内输入表达式,如果规定时间内运算正确则加分,超时或运算错误则进入下一题并减少生命值(不扣分)。
3.所有成绩均可记录在TopList.txt文件中。
2.算法分析
算法设计思路
算法描述:
1.通过rand()函数生成4个随机数
2.通过F()函数来进行递归调用
3.首先将数组A中的两个数进行运算,得到结果,然后通过递归调用将结果与下一个数字运算,得到结果再通过递归调用,与最后一个数进行运算
4.递归过程中,判断是否(n==1&&A[0]==24),满足条件则输出结果。最后通过count最终知道有多少种解法
3.概要设计(包括数据结构及算法绘制流程图或伪代码表示)
通过递归调用实现结果与下一个进行运算
从数组中任意取出两个数的组合
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]=ab;
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);
}

流程图如下:
在这里插入图片描述

4.测试(设计测试用例或测试代码的设计与实现,测试结果截屏)
测试实现结果如下,随机生成四个数12,3,13,11计算之后不可以得出24点
在这里插入图片描述

随机生成的四个数6,3,9,12竟然有86种解法
在这里插入图片描述

5.调试(对测试出的问题进行调试,界面截屏,调试修正编码)
在这里插入图片描述

6.心得体会(关键问题的解决思路及步骤总结)
不足:此次实验只完成了基本要求,没有实现提高要求,后面我会努力解决这个问题。
心得:通过此次作业,再次复习了随机数的生成,srand()和rand()的搭配使用。刚开始想要生成随机数只写了rand()函数,没有写srand()函数,结果每次运行生成的随机数都是固定的,加上srand()函数后,每次生成的随机数才是随机的,同时也练习了switch语句和case语句的搭配使用,for循环,函数的调用等等知识点。

#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
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值