24点游戏
常见游戏规则:
从扑克中每次取出4张牌。使用加减乘除,第一个能得出24者为赢。(其中,J代表11,Q代表12,K代表13,A代表1),按照要求编程解决24点游戏。
基本要求: 随机生成4个代表扑克牌牌面的数字字母,程序自动列出所有可能算出24的表达式,用擅长的语言(C/C++/Java或其他均可)实现程序解决问题。
- 1.程序风格良好(使用自定义注释模板)
- 2.列出表达式无重复。
思路:
24点游戏的算法,其中最主要的思想就是穷举法。所谓穷举法就是列出4个数字加减乘除的各种可能性。我们可以将表达式分成以下几种:首先我们将4个数设为a,b,c,d,,将其排序列出四个数的所有排序序列组合(共有A44=24种组合)。再进行符号的排列表达式,其中算术符号有+,—,,/,(,)。其中有效的表达式有a(b-c/b),ab-cd,等等。列出所有有效的表达式。其中我们用枚举类型将符号定义成数字常量。我们用a,b,c,d代替4个数字。考虑每种可能,总的算法就有5种可能。分别是:
- 1.((A*B)*C)*D
- 2.(A*(B*C))*D
- 3.(AB)(C*D)
- 4.A*(B*(C*D))
- 5.A*((B*C)*D)
接下来就是对每一种进行分析判断。
流程图
源代码:
import java.util.Random;
import java.util.Scanner;
public class Game
{
public static void main(String[] args)
{
int[] p=new int[4];//声明数组
int c;
Scanner scn=new Scanner (System.in);
System.out.println("--------------------------------------------");
System.out.println("*******24点纸牌游戏******");
System.out.println("0代表扑克牌中的10");
System.out.println("--------------------------------------------");
do
{
System.out.println("随机生成的纸牌为:\n");
Random( p) ;//函数调用
printResult(p);//函数调用
System.out.println("1.继续游戏 2.结束\n");
c=scn.nextInt();
}while(c==1);
}
//如果x在2~10之间,返回10,同样,返回J,Q,K
public static char Card(int x)
{
if(1<x&&x<11)
return (char)(x+'0');
else if(x==1)
return 'A';
else if(x==11)
return 'J';
else if(x==12)
return 'Q';
else if(x==13)
return 'K';
return 0;
}
//随机生成四个数
public static void Random(int[] p)
{
int i;
Random random=new Random();
for(i=0;i<4;i++)
{
p[i]=(int)(Math.abs(random.nextInt())%13+1);
System.out.println(Card(p[i])+" ");
}
}
//四个运算符的运算
public static double ys(double num1,double num2,char o)
{
double result=0;
switch(o)
{
case '+':
result=num1+num2;
break;
case '-':
{
if(num1>=num2)
result=num1-num2;
else
result=num2-num1;
}
break;
case '*':
result=num1*num2;
break;
case '/':
result=num1/num2;
break;
default :
break;
}
return result;
}
//如果通过运算算得的结果为24,则输出结果
public static int Result(int[] p,char[] o)
{
double t;
int a=p[0];
int b=p[1];
int c=p[2];
int d=p[3];
//1.((A*B)*C)*D
t=0;
t=ys(ys(ys(a,b,o[0]),c,o[1]),d,o[2]);
if((t-24)==0) //如果计算结果的绝对值与24相等,输出结果
{
System.out.println("("+"("+"("+Card(p[0])+o[0]+Card(p[1])+")"+o[1]+Card(p[2])+")"+o[2]+Card(p[3])+")");
return 1;
}
//2.(A*(B*C))*D
t=0;
t=ys(ys(a,ys(b,c,o[1]),o[0]),d,o[2]);
if((t-24)==0) //如果计算结果的绝对值与24相等,输出结果
{
System.out.println("("+"("+Card(p[0])+o[0]+"("+Card(p[1])+o[1]+Card(p[2])+")"+")"+Card(p[2])+Card(p[3])+")");
return 1;
}
//3.(A*B)*(C*D)
t=0;
t=ys(ys(a,b,o[0]),ys(c,d,o[2]),o[1]);
if((t-24)==0) //如果计算结果的绝对值与24相等,输出结果
{
System.out.println("("+"("+Card(p[0])+o[0]+Card(p[1])+")"+o[1]+"("+Card(p[2])+o[2]+Card(p[3])+")"+")");
return 1;
}
//4.A*(B*(C*D))
t=0;
t=ys(a,ys(b,ys(c,d,o[2]),o[1]),o[0]);
if((t-24)==0) //如果计算结果的绝对值与24相等,输出结果
{
System.out.println("("+Card(p[0])+o[0]+"("+Card(p[1])+o[1]+"("+Card(p[2])+o[2]+Card(p[3])+")"+")"+")");
return 1;
}
//5.A*((B*C)*D)
t=0;
t=ys(a,ys(ys(b,c,o[1]),d,o[2]),o[0]);
if((t-24)==0) //如果计算结果的绝对值与24相等,输出结果
{
System.out.println("("+Card(p[0])+o[0]+"("+"("+Card(p[1])+o[1]+Card(p[2])+")"+o[2]+Card(p[3])+")"+")1");
return 1;
}
return 0;
}
//输出结果的数目
public static void printResult(int[] p)
{
char[] O={'+','-','*','/'};
char[] o =new char[3];
int i,j,k;
int count=0;
for(i=0;i<4;i++)//三层for循环列出了所有运算符可能出现的情况
{
for(j=0;j<4;j++)
{
for(k=0;k<4;k++)
{
o[0]=O[i];
o[1]=O[j];
o[2]=O[k];
if(Result(p,o)==1) //如果输出函数返回值为真,输出结果数目递加
count++;
}
}
}
System.out.println("共"+count+"种方法");
}
}
运行结果: