24点游戏实现代码(C语言)

/** 
 *@ 随机生成4个代表扑克牌牌面的数字或字母,程序自动列出所有可能算出24的表达式
 *@ 西安科技大学 软工1702班 
 *@ author:侯明会
 *@ C语言
 *@ Dev-C++ 
 *@ 2019/4/2
 */ 
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int temp=0;//判断是否有解决方案 
double get(double a,char c,double b)//两个数之间的运算 
{
	switch(c)
	{
		case '+':return a+b;break;
		case '-':return a-b;break;
		case '*':return a*b;break;
		case '/':return a/b;break;
	}
}
void display(double a,double b,double c,double d)//按随机生成的四个数中的一个顺序进行运算
{
    //共有三个运算符,通过循环将每一种运算符排列情况列出来
	char c1,c2,c3;
	for(int i=0;i<4;i++)//第一个运算符的排列情况 
	{
		if(i==0) c1='+';
		if(i==1) c1='-';
		if(i==2) c1='*';
		if(i==3) c1='/';
		for(int j=0;j<4;j++)//第二个运算符的排列情况
		{
			if(j==0) c2='+';
			if(j==1) c2='-';
			if(j==2) c2='*';
			if(j==3) c2='/';
			for(int k=0;k<4;k++)//第三个运算符的排列情况
			{
				if(k==0) c3='+';
			    if(k==1) c3='-';
			    if(k==2) c3='*';
			    if(k==3) c3='/';
			    if(get(get(get(a,c1,b),c2,c),c3,d)==24.0)//1.通过两两运算 :(((a先与b)再与c)最后与d)
				{
					temp=1;
					printf("(((%.1lf%c%.1lf)%c%.1lf)%c%.1lf)\n",a,c1,b,c2,c,c3,d); 
				}
				if(get(get(a,c1,b),c2,get(c,c3,d))==24.0)//2.通过两两运算 :((a先与b)再与(c先与d))
				{
					temp=1;
					printf("((%.1lf%c%.1lf)%c(%.1lf%c%.1lf))\n",a,c1,b,c2,c,c3,d);
				}
				if(get(get(a,c1,get(b,c2,c)),c3,d)==24.0)//3.通过两两运算 :((a再与(b先与c))最后于d)
				{
					temp=1;
					printf("((%.1lf%c(%.1lf%c%.1lf))%c%.1lf)\n",a,c1,b,c2,c,c3,d);
				}
				if(get(a,c1,get(get(b,c2,c),c3,d))==24.0)//4.通过两两运算 :(a最后与((b先与c)再与d))
				{
					temp=1;
					printf("(%.1lf%c((%.1lf%c%.1lf)%c%.1lf))\n",a,c1,b,c2,c,c3,d);
				}
				if(get(a,c1,get(b,c2,get(c,c3,d)))==24.0)//5.通过两两运算 :(a最后与(b再与(c先与d)))
				{
					temp=1;
					printf("(%.1lf%c(%.1lf%c(%.1lf%c%.1lf)))\n",a,c1,b,c2,c,c3,d);
				}
			}
		}
	}
}
void solve(double p[4])//按随机生成的四个数可能的顺序一一调用运算函数
{
    display(p[0], p[1], p[2], p[3]);
    display(p[0], p[1], p[3], p[2]);
    display(p[0], p[2], p[1], p[3]);
    display(p[0], p[2], p[3], p[1]);
    display(p[0], p[3], p[1], p[2]);
    display(p[0], p[3], p[2], p[1]);
    display(p[1], p[0], p[2], p[3]);
    display(p[1], p[0], p[3], p[2]);
    display(p[1], p[2], p[0], p[3]);
    display(p[1], p[3], p[0], p[2]);
    display(p[1], p[2], p[3], p[0]);
    display(p[1], p[3], p[2], p[0]);
    display(p[2], p[0], p[1], p[3]);
    display(p[2], p[0], p[3], p[1]);
    display(p[2], p[1], p[0], p[3]);
    display(p[2], p[3], p[0], p[1]);
    display(p[2], p[1], p[3], p[0]);
    display(p[2], p[3], p[1], p[0]);
    display(p[3], p[0], p[1], p[2]);
    display(p[3], p[0], p[2], p[1]);
    display(p[3], p[1], p[0], p[2]);
    display(p[3], p[2], p[0], p[1]);
    display(p[3], p[1], p[2], p[0]);
    display(p[3], p[2], p[1], p[0]);
}
int main()
{
	double a[4];
	int k=1,x;//判断是否继续循环生成随机数并运算 
	while(k)//通过循环多次进行24点运算
	{
	    srand((unsigned)time(NULL));
	    for(int i=0;i<4;i++)//随机生成四个数
		{	
			a[i]=rand()%13+1.0;
		}
	    printf("随机生成的四个数为:\n");
	    printf("%.1lf,%.1lf,%.1lf,%.1lf\n",a[0],a[1],a[2],a[3]);
	    printf("解决方案(可能包含重复表达式)如下:\n");
	    solve(a);
	    if(temp==0) printf("所生成的四个随机数无法计算成24\n");
	    temp=0;//使得继续循环时,可以显示无解决方案时的结果  
	    printf("退出请按0 or 继续请按1:\n");
		scanf("%d",&x);
	    if(x==0) k=0; 
	}
}

运行结果(可能有重复的表达式)如下图所示:
在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值