游戏--------------------24

24点游戏

一, 题目分析及算法思路
从扑克中每次取出4张牌,使用加减乘除,第一个能得出24者为赢。(其中,J代表11,Q代表12,K代表13,A代表1)。牌的每张牌表示一个数(J、Q、K分别表示11、12、13,两个司令都表示6)。即得到4个1~13的数,请添加运算符(规定为加+ 减- 乘* 除/ 四种)使之成为一个运算式。每个数只能参与一次运算,4个数顺序可以任意组合,4个运算符任意取3个且可以重复取。运算遵从一定优先级别,可加括号控制,最终使运算结果为24。请输出一种解决方案的表达式,用括号表示运算优先。如果没有一种解决方案,则输出共有0种解法。
本程序使用暴力枚举每次所选的数字和运算符的五种不同运算方式。
五种不同的运算方式如下(括号的五种不同组合):
((a card1 b)card2 c)card3 d
(a card1(b card2 c))card3 d
(a card1 b)card2(c card3 d)
a card1(b card2(c card3 d))
a card1((b card2 c)card3 d)
二, 主要算法

//四则运算符
	public static double Card(double x,double y,char n)
	{
		switch(n)
		{
		case '+':
			return (x+y);
		case '-':
		{
			if(x>y)
				return x-y;
			else
				return y-x;
		}
		case '*':
			return x*y;
		case '/':
			return x/y;
		}
		return 0;
	}
	//计算结果是否等于24并输出
	public static int Result(int[] m,char[] n)
	{
		double y;
		int a=m[0];
		int b=m[1];
		int c=m[2];
		int d=m[3];
		
		//枚举法运算次序
		//1,((A*B)*C)*D
		y=0;
		y=Card(a,b,n[0]);
		y=Card(c,y,n[1]);
		y=Card(d,y,n[2]);
		if(y==24)//若计算结果等于24,输出结果
		{
			System.out.println("("+"("+"("+Number(m[0])+n[0]+Number(m[1])+")"+n[1]+Number(m[2])+")"+n[2]+Number(m[3])+")");
			return 1;
		}
		//2,(A*(B*C))*D
		y=0;
		y=Card(b,c,n[1]);
		y=Card(a,y,n[0]);
		y=Card(d,y,n[2]);
		if(y==24)
		{
			System.out.println("("+"("+Number(m[0])+n[0]+"("+Number(m[1])+n[1]+Number(m[2])+")"+")"+n[2]+Number(m[3])+")"); 
			return 1;
		}
		//3,(A*B)*(C*D)
		y=0;
		y=Card(Card(a,b,n[0]),Card(c,d,n[2]),n[1]);
		if(y==24)
		{
			System.out.println("("+"("+Number(m[0])+n[0]+Number(m[1])+")"+n[1]+"("+Number(m[2])+n[2]+Number(m[3])+")"+")");
			return 1;
		}
		//4,A*(B*(C*D))
		y=0;
		y=Card(c,d,n[2]);
		y=Card(b,y,n[1]);
		y=Card(a,y,n[0]);
		if(y==24)
		{
			System.out.println("("+Number(m[0])+n[0]+"("+Number(m[1])+n[1]+"("+Number(m[2])+n[2]+Number(m[3])+")"+")"+")");
			return 1;
		}
		//5,A*((B*C)*D)
		y=0;
		y=Card(b,c,n[1]);
		y=Card(d,y,n[2]);
		y=Card(a,y,n[0]);
		if(y==24)
		{
			System.out.println("("+Number(m[0])+n[0]+"("+"("+Number(m[1])+n[1]+Number(m[2])+")"+n[2]+Number(m[3])+")"+")1");
			return 1;
		}
		return 0;
	}
	//求出有多少种结果
	public static void Many(int[] m)
	{
		char[] card= {'+','-','*','/'};
		char[] n=new char[3];
		int i,j,k;
		int count=0;
		for(i=0;i<4;i++)
		{
			for(j=0;j<4;j++)
			{
				for(k=0;k<4;k++)//三重循环列出所有可能出现的情况
				{
					n[0]=card[i];
					n[1]=card[j];
					n[2]=card[k];
					if(Result(m,n)==1)
						count++;
				}
			}
		}
	         System.out.println("共有"+count+"种解法");
	}

三, 调试,测试及输出结果

  1. 调试
    在这里插入图片描述
    在这里插入图片描述

  2. 测试结果
    (1)随机输出四个数字
    在这里插入图片描述
    在这里插入图片描述
    (2)有解法时
    在这里插入图片描述
    (3)无解法时
    在这里插入图片描述
    五, 经验总结归纳

    本次题目我是用Java来进行程序实现的,通过本次代码的编写,使我可以更深入的了解java语言的编程方式,更熟练地去应用它。本次程序设计的比较简单,仅仅是实现了基本要求,可以随机生成四个数(使用了Java中的常用类Random类)使用四则运算来计算24点,但是在过程中也遇到了很多问题,在定义四则运算时,本来是定义了int n,使用switch语句,但是在运行时并不能出现最终结果,程序可以出现四个随机数,说明问题是出在后面的程序中,最后将int n更改为char n,程序才运行成功。在进行编程时,要注意变量类型的定义和使用,一个小错误也可能导致程序的运行失败。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值