*程序设计方法学
*作业三 *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;
}
}