24点纸牌游戏

*程序设计方法学
*作业三 *2018.10.5
*24点纸牌游戏

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

import java.util.Arrays;

/**
 * 24点纸牌游戏(作业三)
 * 生成四个随机数
 * @author Ran
 *
 */

public class Homework3_1 {
	static int [] result = new int [96];  //4个数字  24种运算方法 
	static int index = 0;
	
	public static int[] getResult() {
		return result;
	}
	//array[start]后的数据将进行全排列
	public static void permute(int[] array,int start){  	
		if(start==array.length){  
			//输出			
			for (int i : array) {
				result[index++] = i;
			}
		}	else	
			for(int i=start;i<array.length;++i){
			//交换元素进行全排列之后还原
				swap(array,start,i);      //交换元素		
				permute(array,start+1);   //交换后,再进行全排列		
				swap(array,start,i);      //还原数组,以便于下一次的全排列	
			}
		} 
	//交换元素
	private static void swap(int[] array,int s,int i){	
				int t=array[s];	
				array[s]=array[i];	
				array[i]=t;
	}
	
	public static void main(String[] args){		
		int[] array=new int[]{3,4,5,6};		
		permute(array, 0);
		int[] re = Homework3_1.getResult();
		int [] num = new int [4];
		int idx = 0;
		for (int i = 0; i < re.length; i++) {
			num[idx++] = re[i];
			System.out.print(re[i]+" ");
			
			if((i+1)%4==0){
	        	idx = 0;
				//依次将数按照顺序以及给定的格式输出
				System.out.println(Arrays.toString(num));
			}
		}
	}
}

import java.util.Random;

/**
 * 24点纸牌游戏(作业三)
 * 生成表达式
 * @author Ran
 *
 */

public class Homework3_2 {
	static int num=0;
	public static void main(String[] args){
		Random r = new Random();
		int [] c = new int[4];  //定义一个数组
		for (int i = 0; i < c.length; i++) {
			c[i] = 1 + r.nextInt(13);  //随机抽取四张牌的牌号(1~13)
			System.out.println("四张牌牌号为:"+c[i]);
		}
		Homework3_1.permute(c, 0);
		
		int[] re = Homework3_1.getResult();
		
		int [] num = new int [4];
		int idx = 0;
		for (int i = 0; i < re.length; i++) {
			num[idx++] = re[i];
			
			if((i+1)%4==0){
				idx = 0;
				opertor(num);
			}
		}
	}

	//排列符号生成表达式
	public static void opertor(int[]cards){
		double sum=0;
		for(int i=0;i<4;i++){			
			double sum1=code(cards[0],cards[1],i);			
			for(int j=0;j<4;j++){				
				double sum2=code(sum1,cards[2],j);				
				for(int k=0;k<4;k++){					
					sum=code(sum2,cards[3],k);					
					int[] symbolNum={i,j,k};					
					String[] symbol=new String[4];					
					symbol=symbol(symbolNum);					
					if(sum==24){	//24种方法					
						num++;	
						//输出表达式
						System.out.println("["+"("+cards[0]+" "+symbol[0]+" "+cards[1]+")"
						     +" "+symbol[1]+" "+cards[2]+"]"+" "+symbol[2]+" "+cards[3]);				
	
						}
				}
			}
		}
	}
	
	public static double code(double num1,double num2,int num){	
		double sum=0.0;		
		if(num==0){			
			sum=num1+num2;	//加法	
			}
		else if(num==1){			
			sum=num1-num2;	//减法	
			}
		else if(num==2){			
			sum=num1*num2;	//乘法	
			}
		else{			
			sum=num1/num2;	//除法	
			}		
		return sum;	
		}
	//将代表计算符号的数字转换成字符存入String数组并返回
	public static String[] symbol(int[] symbolNum){		
		String[] symbol=new String[4];		
		for(int i=0;i<3;i++){			
			int sym=symbolNum[i];			
			switch (sym) {			
			case 0:				symbol[i]="+";				break;		
			case 1:				symbol[i]="-";				break;		
			case 2:				symbol[i]="*";				break;		
			case 3:				symbol[i]="/";				break;		
			default:				break;			
			}		
			}		
		return symbol;	
		}
	}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值