24点游戏

内容:
24点游戏是经典的纸牌益智游戏。
常见游戏规则:
从扑克中每次取出4张牌。使用加减乘除,第一个能得出24者为赢。(其中,J代表11,Q代表12,K代表13,A代表1),按照要求编程解决24点游戏。
基本要求: 随机生成4个代表扑克牌牌面的数字字母,程序自动列出所有可能算出24的表达式,用擅长的语言(C/C++/Java或其他均可)实现程序解决问题。
1.程序风格良好(使用自定义注释模板)
2.列出表达式无重复。

步骤:
1.算法分析
(1)产生随机数并显示的方法
static int sum=0;
static int[] sum()
{
Random rand=new Random();
int r1=(1+rand.nextInt(13));
int r2=(1+rand.nextInt(13));
int r3=(1+rand.nextInt(13));
int r4=(1+rand.nextInt(13));
System.out.print(“发出的牌为:”);
利用四个switch循环输出A/J/Q/K
{
case 1 :System.out.print(“A”);break;
case 11:System.out.print(“J”);break;
case 12:System.out.print(“Q”);break;
case 13:System.out.print(“K”);break;
default:System.out.print(r1);break;

(2)打印解的表达式
static String prin(int s1,int s2,int s3,int s4,int x1,int x2,int x3)//打印解的表达式
{
String ch="";
S2/s3/s4同下:
switch(s1)
{
case 1 :System.out.print(“A”);ch=“A”;break;
case 11:System.out.print(“J”);ch=“J”;break;
case 12:System.out.print(“Q”);ch=“Q”;break;
case 13:System.out.print(“K”);ch=“K”;break;
default:System.out.print(s1);ch=(String)(s1+“0”);break;
}
X2/x3/x4同下循环:
switch(x1)
{
case 0:System.out.print("+");ch+="+";break;
case 1:System.out.print("-");ch+="-";break;
case 2:System.out.print("");ch+="";break;
case 3:System.out.print("/");ch+="/";break;
}
// System.out.println(" "+ch);

return ch;
}
(3)枚举是否存在解
static String[] con(int s[])//枚举计算是否存在解
{
boolean flag=false;
String[] ch=new String [100];
int js1,js2,js3=0;
for(int i = 0;i<4;i++)
{
for(int j=0;j<4;j++)
{
if(i!=j)
{
for(int k=0;k<4;k++)
{
if(i!=j&&j!=k&&i!=k)
{
for(int l=0;l<4;l++)
{
if(i!=j&&j!=k&&k!=l&&i!=k&&i!=l&&j!=l)
{
for(int x1=0;x1<3;x1++)
{
for(int x2=0;x2<3;x2++)
{
for(int x3=0;x3<3;x3++)
{
js1=js(s[i],s[j],x1);
if(js1==-1) continue;
js2=js(js1,s[k],x2);
if(js2==-1) continue;
js3=js(js2,s[l],x3);
if(js3==-1) continue;
if(js3!=-1)
{
if(js3==24)
{ ch[sum]=prin(s[i],s[j],s[k],s[l],x1,x2,x3);
flag=true;
sum++;
}
2.概要设计
(1)随机生成四张牌的点数
(2)通过三则运算计算能得出的结果
(3)判断结果是否为24点
流程图如下:
在这里插入图片描述

3.调试及测试
测试结果如下:
在这里插入图片描述
在这里插入图片描述

4.心得体会
在本次程序设计中用到了java编写,利用的switch循环语句较多,都是直接利用相同内容进行循环,代码量较大,有过多冗余代码,在以后的设计中会改正方法,尽量简化代码。
5.代码如下:

import java.util.*;
public class Point24 {
 static int sum=0;
 static int[] sum()//产生随机数并显示的方法
 {
 Random rand=new Random();
 int r1=(1+rand.nextInt(13));
 int r2=(1+rand.nextInt(13));
 int r3=(1+rand.nextInt(13));
 int r4=(1+rand.nextInt(13));
 System.out.print("发出的牌为:");
 switch(r1)
 {
 case 1 :System.out.print("A");break;
 case 11:System.out.print("J");break;
 case 12:System.out.print("Q");break;
 case 13:System.out.print("K");break;
 default:System.out.print(r1);break;
 }
 switch(r2)
 {
 case 1 :System.out.print(" A");break;
 case 11:System.out.print(" J");break;
 case 12:System.out.print(" Q");break;
 case 13:System.out.print(" K");break;
 default:System.out.print(" "+r2);break;
 }
 switch(r3)
 {
 case 1 :System.out.print(" A");break;
 case 11:System.out.print(" J");break;
 case 12:System.out.print(" Q");break;
 case 13:System.out.print(" K");break;
 default:System.out.print(" "+r3);break;
 }
 switch(r4)
 {
 case 1 :System.out.println(" A");break;
 case 11:System.out.println(" J");break;
 case 12:System.out.println(" Q");break;
 case 13:System.out.println(" K");break;
 default:System.out.println(" "+r4);break;
 }
 
 int [] s=new int[] {r1,r2,r3,r4};
 return s;
 
 }
 
 static int js(int i,int j,int x)//两个数之间计算符号确认
 {
 int m=0;
 switch(x)
 {
 case 0:m=i+j;break;
 case 1:m=i-j;break;
 case 2:m=i*j;break;
 case 3:
 m=i/j;if(i%j!=0) m=-1;//如果除不尽直接让m=-1,以便直接结束此次循环
 break;
 }
 return m;
 }
 
 static String prin(int s1,int s2,int s3,int s4,int x1,int x2,int x3)//打印解的表达式
 {
 String ch="";
 switch(s1)
 {
 case 1 :System.out.print("A");ch="A";break;
 case 11:System.out.print("J");ch="J";break;
 case 12:System.out.print("Q");ch="Q";break;
 case 13:System.out.print("K");ch="K";break;
 default:System.out.print(s1);ch=(String)(s1+"0");break;
 }
 switch(x1)
 {
 case 0:System.out.print("+");ch+="+";break;
 case 1:System.out.print("-");ch+="-";break;
 case 2:System.out.print("*");ch+="*";break;
 case 3:System.out.print("/");ch+="/";break;
 }
 switch(s2)
 {
 case 1 :System.out.print("A");ch+="A";break;
 case 11:System.out.print("J");ch+="J";break;
 case 12:System.out.print("Q");ch+="Q";break;
 case 13:System.out.print("K");ch+="K";break;
 default:System.out.print(s2);ch+=(String)(s2+"");break;
 }
 switch(x2)
 {
 case 0:System.out.print("+");ch+="+";break;
 case 1:System.out.print("-");ch+="-";break;
 case 2:System.out.print("*");ch+="*";break;
 case 3:System.out.print("/");ch+="/";break;
 }
 switch(s3)
 {
 case 1 :System.out.print("A");ch+="A";break;
 case 11:System.out.print("J");ch+="J";break;
 case 12:System.out.print("Q");ch+="Q";break;
 case 13:System.out.print("K");ch+="K";break;
 default:System.out.print(s3);ch+=(String)(s3+"");break;
 }
 switch(x3)
 {
 case 0:System.out.print("+");ch+="+";break;
 case 1:System.out.print("-");ch+="-";break;
 case 2:System.out.print("*");ch+="*";break;
 case 3:System.out.print("/");ch+="/";break;
 }
 switch(s4)
 {
 case 1 :System.out.println("A");ch+="A";break;
 case 11:System.out.println("J");ch+="J";break;
 case 12:System.out.println("Q");ch+="Q";break;
 case 13:System.out.println("K");ch+="K";break;
 default:System.out.println(s4);ch+=(String)(s4+"");break;
 }
 
 // System.out.println(" "+ch);
 
 return ch;
 
 }
 
 static String[] con(int s[])//枚举计算是否存在解
 {
 boolean flag=false;
 String[] ch=new String [100];
 int js1,js2,js3=0;
 for(int i = 0;i<4;i++)
 {
 for(int j=0;j<4;j++)
 {
 if(i!=j)
 {
  for(int k=0;k<4;k++)
  {
  if(i!=j&&j!=k&&i!=k)
  {
  for(int l=0;l<4;l++)
  {
  if(i!=j&&j!=k&&k!=l&&i!=k&&i!=l&&j!=l)
  {
   for(int x1=0;x1<3;x1++)
   {
   for(int x2=0;x2<3;x2++)
   {
   for(int x3=0;x3<3;x3++)
   {
   js1=js(s[i],s[j],x1);
   if(js1==-1) continue;
   js2=js(js1,s[k],x2);
   if(js2==-1) continue;
   js3=js(js2,s[l],x3);
   if(js3==-1) continue;
   if(js3!=-1)
   {
    if(js3==24)
    {   ch[sum]=prin(s[i],s[j],s[k],s[l],x1,x2,x3);
   flag=true;
   sum++;
    }
   }
   }}}}}}}}}}
 if(flag==false)
 {
 System.out.println("不存在一组解使其成为\"24点\"");
 }
 return ch;
 }
 public static void main(String[] args)
 {
 
 boolean f=false;
 Scanner in=new Scanner(System.in);
 while(!f)
 {
 int [] s=sum();//产生4个随机纸牌
 con(s);//求解并打印
 System.out.println();
 System.out.println("继续 (按1)      或者     结束(按0)");
 if(in.nextInt()==1)
 {f=false;}
 else
 {f=true;}
 } 
 
 }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值