诈金花从发牌到比大小

诈金花从发牌到比大小

大神请绕路!
用java写的一段诈金花,从发牌到比大小选出最大的一副牌的程序,并不涉及网络或者多会话的,纯属个人娱乐之作:
直接上代码:
1.这是主程序入口,逻辑都在这里了

public class JinHua {

	private List<Pai> totals;
	private boolean isdebug = false;
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int person = 6; //人数
		int mode = 3;	//固定三个牌
		JinHua jinhua = new JinHua();
		jinhua.init();
		jinhua.fapai(person,mode);
	}

	//初始化牌的数据
	private void init() {
		totals = new ArrayList<Pai>();
		for(int i=0;i<4;i++) {
			for(int j=0;j<13;j++) {
				Pai pai = new Pai();
				pai.setIndex(j+(i*13));
				pai.setTag(i+1); 
				pai.setTitle(j+1);
				totals.add(pai);
			}
		}
		if(isdebug) {
			for(Pai p : totals) {
				System.out.println(p.getIndex()+" "+p.getTitle());
			}
		}
	}
	
	//发牌并比较出最大的那一副
	private void fapai(int person,int mode) {
		RandomSort sort = new RandomSort(52);
		int[] t = sort.changePosition(); 	//将顺序随机打乱
		if(isdebug) {
			for(int i=0;i<t.length;i++) {
				System.out.print(gethua(totals.get(t[i]).getTag())+totals.get(t[i]).getTitle()+" ");
			}
		}
		
		//发牌每人三张
		int[][] nums = new int[person][mode];
		int count = 0;
		int index = 0;
		for(int i=0;i<t.length;i++) {
			if(i < person*mode) {
				nums[count][index] = t[i];
				count++;
				if(count == person) {
					count = 0;
					index++;
				}
			}else {
				break;
			}
		}
		
		//测试三条
//		nums[0] = new int[]{7,20,33};
//		nums[1] = new int[]{1,14,27};
//		nums[2] = new int[]{2,15,28};
//		nums[3] = new int[]{3,16,29};
//		nums[4] = new int[]{10,23,36};
//		nums[5] = new int[]{5,18,31};
		
		//测试同花顺
//		nums[0] = new int[]{26,29,28};
//		nums[1] = new int[]{2,3,4};
//		nums[2] = new int[]{5,6,7};
//		nums[3] = new int[]{13,14,15};
//		nums[4] = new int[]{9,10,11};
//		nums[5] = new int[]{31,32,33};
		
		//测试对子
//		nums[0] = new int[]{39,0,2};
//		nums[1] = new int[]{13,26,15};
		
		//按三条=60,同花顺=50,同花=40,顺子=30,对子=20,单张=10;为每一副牌的值
		List<Person> vs = new ArrayList<Person>();
		int vi = 0;
		for(int[] ns : nums) {
			int value = getCardValue(ns); //获取每个人的初步牌值
			
			if(isdebug) System.out.println("数值为:"+value);
			
			Person ps = new Person();
			ps.setIndex(vi);
			ps.setNum(ns);
			ps.setValues(value);
			vs.add(ps);
			
			vi++;
			printlnResult(ns);
		}
		
		//再比较出最大的那一副
		compare(nums, vs); //排序比较牌,找出最大的一个
	}
	
	//人按单张排序
	private List<Person> persorSort(List<Person> vs){
		for(int i=0;i<vs.size()-1;i++){
			for(int j=0;j<vs.size()-1-i;j++){
				Person a = vs.get(j);
				Person b = vs.get(j+1);
				int[] as = a.getNum();
				int[] bs = b.getNum();
				List<Pai> ass = new ArrayList<Pai>();
				ass.add(totals.get(as[0]));
				ass.add(totals.get(as[1]));
				ass.add(totals.get(as[2]));
				List<Pai> bss = new ArrayList<Pai>();
				bss.add(totals.get(bs[0]));
				bss.add(totals.get(bs[1]));
				bss.add(totals.get(bs[2]));
				ass = paiSort(ass);
				bss = paiSort(bss);
				if(ass.get(0).getTitle() < bss.get(0).getTitle() && ass.get(0).getTitle() != 1) {
					vs.remove(a);
					vs.remove(b);
					vs.add(j, b);
					vs.add(j+1,a);
				} else if(ass.get(0).getTitle() != 1 && bss.get(0).getTitle() == 1) {
					vs.remove(a);
					vs.remove(b);
					vs.add(j, b);
					vs.add(j+1,a);
				} else if(ass.get(0).getTitle() == bss.get(0).getTitle()) {
					if(ass.get(1).getTitle() < bss.get(1).getTitle()) {
						vs.remove(a);
						vs.remove(b);
						vs.add(j, b);
						vs.add(j+1,a);
					}
				} else if((ass.get(0).getTitle() == bss.get(0).getTitle()) 
						&& (ass.get(1).getTitle() == bss.get(1).getTitle())) {
					if(ass.get(2).getTitle() < bss.get(2).getTitle()) {
						vs.remove(a);
						vs.remove(b);
						vs.add(j, b);
						vs.add(j+1,a);
					}
				} else if((ass.get(0).getTitle() == bss.get(0).getTitle()) 
						&& (ass.get(1).getTitle() == bss.get(1).getTitle()) 
						&& (ass.get(2).getTitle() == bss.get(2).getTitle())) {
					if(ass.get(0).getTag() > bss.get(0).getTag()) {
						vs.remove(a);
						vs.remove(b);
						vs.add(j, b);
						vs.add(j+1,a);
					}
				}
				
			}
		}
		if(isdebug) {
			for(Person p : vs) {
				int[] ns = p.getNum();
				System.out.println("第"+p.getIndex()+"个人:"+totals.get(ns[0]).getTitle()+" "+totals.get(ns[1]).getTitle()+" "+totals.get(ns[2]).getTitle()+" ");
			}
		}
		return vs;
	}
	
	//人按对子排序
	private List<Person> duiziPersonSort(List<Person> vs){
		for(int i=0;i<vs.size()-1;i++){
			for(int j=0;j<vs.size()-1-i;j++){
				Person a = vs.get(j);
				Person b = vs.get(j+1);
				int[] as = a.getNum();
				int[] bs = b.getNum();
				List<Pai> ass = new ArrayList<Pai>();
				ass.add(totals.get(as[0]));
				ass.add(totals.get(as[1]));
				ass.add(totals.get(as[2]));
				List<Pai> bss = new ArrayList<Pai>();
				bss.add(totals.get(bs[0]));
				bss.add(totals.get(bs[1]));
				bss.add(totals.get(bs[2]));
				ass = duiziPaiSort(ass);
				bss = duiziPaiSort(bss);
				if(ass.get(0).getTitle() != 1 && bss.get(0).getTitle() == 1) {
					vs.remove(a);
					vs.remove(b);
					vs.add(j, b);
					vs.add(j+1,a);
				}else if(ass.get(0).getTitle() != 1 && (ass.get(0).getTitle() < bss.get(0).getTitle())) {					
					vs.remove(a);
					vs.remove(b);
					vs.add(j, b);
					vs.add(j+1,a);
				}else if(ass.get(0).getTitle() == bss.get(0).getTitle() && ass.get(2).getTitle() < bss.get(2).getTitle()) {
					vs.remove(a);
					vs.remove(b);
					vs.add(j, b);
					vs.add(j+1,a);
				}else if(ass.get(0).getTitle() == bss.get(0).getTitle() && ass.get(2).getTitle() == bss.get(2).getTitle()) {
					
					if(isdebug) System.out.println("两个一样的对子:"+ass.get(0).getTag()+"  "+ass.get(1).getTag());
					
					if(ass.get(0).getTag() < ass.get(1).getTag()) {
						if(ass.get(0).getTag() > bss.get(0).getTag() || ass.get(0).getTag() > bss.get(1).getTag()) {
							vs.remove(a);
							vs.remove(b);
							vs.add(j, b);
							vs.add(j+1,a);
						}
					}else if(ass.get(0).getTag() > ass.get(1).getTag()) {
						if(ass.get(1).getTag() > bss.get(0).getTag() || ass.get(1).getTag() > bss.get(1).getTag() ) {
							vs.remove(a);
							vs.remove(b);
							vs.add(j, b);
							vs.add(j+1,a);
						}
					}
				}
				
			}
		}
		if(isdebug) {
			for(Person p : vs) {
				int[] ns = p.getNum();
				System.out.println("第"+p.getIndex()+"个人:"+totals.get(ns[0]).getTitle()+" "+totals.get(ns[1]).getTitle()+" "+totals.get(ns[2]).getTitle()+" ");
			}
		}
		return vs;
	}
	
	
	//每个人对子的大小排序
	private List<Pai> duiziPaiSort(List<Pai> ss) {
		
		Pai a = ss.get(0);
		Pai b = ss.get(1);
		Pai c = ss.get(2);
		if(a.getTitle() != b.getTitle() && a.getTitle() == c.getTitle()) {
			ss.remove(b);
			ss.remove(c);
			ss.add(1, c);
			ss.add(2,b);
		}else if(a.getTitle() != b.getTitle() && a.getTitle() != c.getTitle()) {
			ss.remove(a);
			ss.add(a);
		}
		if(isdebug) {
			System.out.println();
			for(Pai p : ss) {
				System.out.print(p.getTitle()+" ");
			}
		}
		return ss;
	}
	//每个人的大小排序
	private List<Pai> paiSort(List<Pai> ss) {
		
		for(int i=0;i<ss.size()-1;i++){
			for(int j=0;j<ss.size()-1-i;j++){
				Pai a = ss.get(j);
				Pai b = ss.get(j+1);
				if(a.getTitle() < b.getTitle()){
					
					ss.remove(a);
					ss.remove(b);
					ss.add(j, b);
					ss.add(j+1,a);
				}
			}
		}
		if(ss.get(ss.size()-1).getTitle() == 1) {
			Pai max = ss.get(ss.size()-1);
			ss.remove(max);
			ss.add(0, max);
		}
		if(isdebug) {
			System.out.println();
			for(Pai p : ss) {
				System.out.print(p.getTitle()+" ");
			}
		}
		return ss;
	}
	
	//比较大小
	private void compare(int[][] nums,List<Person> vs) {

		List<Person>[] pss = new List[6];
		for(int i=0;i<6;i++) {
			pss[i] = new ArrayList<Person>();
		}
		for(int i=0;i<vs.size();i++) {
			if(isdebug) System.out.println("index:"+vs.get(i).getIndex()+"  values:"+vs.get(i).getValues());
			int values = vs.get(i).getValues();
			
			switch(values) {
				case 60:
					pss[0].add(vs.get(i));
					break;
				case 50:
					pss[1].add(vs.get(i));
					break;
				case 40:
					pss[2].add(vs.get(i));
					break;
				case 30:
					pss[3].add(vs.get(i));
					break;
				case 20:
					pss[4].add(vs.get(i));
					break;
				case 10:
					pss[5].add(vs.get(i));
					break;
			}
		}
		if(isdebug) {
			for(int i=0;i<6;i++) {
				System.out.println("级别:"+i+" 数量:"+pss[i].size());
			}
		}
		if(pss[0].size() >= 1) {
			if(pss[0].size() == 1) {
				int[] ns = pss[0].get(0).getNum();
				System.out.print("最大牌为三条,为第"+(pss[0].get(0).getIndex()+1)+"个人:");
				printlnResult(ns);				
			}else {
				//有好几个三条的
				System.out.println("我去,有好几个三条的");
				List<Person> psss = persorSort(pss[0]);
				Person p = psss.get(0);
				System.out.print("最大牌为第"+(p.getIndex()+1)+"个人:");
				printlnResult(p.getNum());	
			}
		} else {
			if(pss[1].size() >= 1) {
				if(pss[1].size() == 1) {
					int[] ns = pss[1].get(0).getNum();
					System.out.print("最大牌为同花顺,为第"+(pss[1].get(0).getIndex()+1)+"个人:");
					printlnResult(ns);				
				}else {
					//有好几个同花顺
					System.out.println("我去,有好几个同花顺");
					List<Person> psss = persorSort(pss[1]);
					Person p = psss.get(0);
					System.out.print("最大牌为第"+(p.getIndex()+1)+"个人:");
					printlnResult(p.getNum());	
				}
			}else {
				if(pss[2].size() >= 1) {
					if(pss[2].size() == 1) {
						int[] ns = pss[2].get(0).getNum();
						System.out.print("最大牌为同花,为第"+(pss[2].get(0).getIndex()+1)+"个人:");
						printlnResult(ns);				
					}else {
						//有好几个同花
						System.out.println("我去,有好几个同花");
						List<Person> psss = persorSort(pss[2]);
						Person p = psss.get(0);
						System.out.print("最大牌为第"+(p.getIndex()+1)+"个人:");
						printlnResult(p.getNum());	
					}
				}else {
					if(pss[3].size() >= 1) {
						if(pss[3].size() == 1) {
							int[] ns = pss[3].get(0).getNum();
							System.out.print("最大牌为顺子,为第"+(pss[3].get(0).getIndex()+1)+"个人:");
							printlnResult(ns);				
						}else {
							//有好几个顺子
							System.out.println("我去,有好几个顺子");
							List<Person> psss = persorSort(pss[3]);
							Person p = psss.get(0);
							System.out.print("最大牌为第"+(p.getIndex()+1)+"个人:");
							printlnResult(p.getNum());	
						}
					}else {
						if(pss[4].size() >= 1) {
							if(pss[4].size() == 1) {
								int[] ns = pss[4].get(0).getNum();
								System.out.print("最大牌为对子,为第"+(pss[4].get(0).getIndex()+1)+"个人:");
								printlnResult(ns);				
							}else {
								//有好几个对子
								System.out.println("我去,有好几个对子");
								List<Person> psss = duiziPersonSort(pss[4]);
								Person p = psss.get(0);
								System.out.print("最大牌为第"+(p.getIndex()+1)+"个人:");
								printlnResult(p.getNum());	
							}
						}else {
							System.out.println("我去,全是单张");
							List<Person> psss = persorSort(pss[5]);
							Person p = psss.get(0);
							System.out.print("最大牌为第"+(p.getIndex()+1)+"个人:");
							printlnResult(p.getNum());	
						}
					}
				}
			}
		}
	}
	
	private void printlnResult(int[] ns) {
		for(int n :ns) {
			System.out.print(gethua(totals.get(n).getTag())+getShow(totals.get(n).getTitle())+" ");
		}
		System.out.println();
	}
	
	//获取牌值
	private int getCardValue(int[] ns) {
		int value = 0;
		int vs[] = new int[]{totals.get(ns[0]).getTitle(),totals.get(ns[1]).getTitle(),totals.get(ns[2]).getTitle()};
		vs = getSort(vs);
		if(totals.get(ns[0]).getTitle() == totals.get(ns[1]).getTitle() && totals.get(ns[0]).getTitle() == totals.get(ns[2]).getTitle()) {
			return 60; 	//三条
		}else if((totals.get(ns[0]).getTitle() == totals.get(ns[1]).getTitle() && totals.get(ns[0]).getTitle() != totals.get(ns[2]).getTitle()) 
				|| (totals.get(ns[0]).getTitle() != totals.get(ns[1]).getTitle() && totals.get(ns[0]).getTitle() == totals.get(ns[2]).getTitle())
				|| (totals.get(ns[0]).getTitle() != totals.get(ns[1]).getTitle() && totals.get(ns[1]).getTitle() == totals.get(ns[2]).getTitle())) {
			return 20;	//对子
		}else if((totals.get(ns[0]).getTag() == totals.get(ns[1]).getTag() && totals.get(ns[2]).getTag() == totals.get(ns[1]).getTag())
				&& ((vs[0] == 1 && vs[1] == 12 && vs[2] == 13) 
						|| (vs[2]-vs[1] == 1 && vs[1]-vs[0] == 1) )){
			return 50;	//同花顺
		}else if(totals.get(ns[0]).getTag() == totals.get(ns[1]).getTag() && totals.get(ns[2]).getTag() == totals.get(ns[1]).getTag()){
			return 40;	//同花
		}else if((vs[0] == 1 && vs[1] == 12 && vs[2] == 13) 
				|| (vs[2]-vs[1] == 1 && vs[1]-vs[0] == 1) ){
			return 30;	//顺子
		}else if((totals.get(ns[0]).getTitle() != totals.get(ns[1]).getTitle() 
				&& totals.get(ns[0]).getTitle() != totals.get(ns[2]).getTitle()
				&& totals.get(ns[1]).getTitle() != totals.get(ns[2]).getTitle())) {
			return 10;	//单张
		}
		return value;
	}
	
	//对数组进行排序
	private int[] getSort(int[] a) {
		int temp=0;
		for(int i=0;i<a.length-1;i++){
			for(int j=0;j<a.length-1-i;j++){
				if(a[j]>a[j+1]){
					temp=a[j];
					a[j]=a[j+1];
					a[j+1]=temp;
				}
			}
		}
		if(a[a.length-1] == 1) {
			int t0 = a[0];
			int t1 = a[1];
			a[0] = 1;
			a[1] = t0;
			a[2] = t1;
			
		}
		if(isdebug) {
			for(int i=0;i<a.length;i++)
				System.out.print(a[i]+" ");	
			System.out.println();
		}
		return a;
	}
	
	
	private String gethua(int tag) {
		if(tag == 1) {
			return "♠";
		}else if(tag == 2) {
			return "♥";
		}else if(tag == 3) {
			return "♣";
		}else {
			return "♦";
		}
	}
	
	private String getShow(int title) {
		if(title == 1) {
			return "A";
		} else if(title == 11) {
			return "J";
		} else if(title == 12) {
			return "Q";
		} else if(title == 13) {
			return "K";
		} else {
			return title+"";
		}
	}
	
}

2.其余还有三个类:

public class Pai {

	private int index = 0;
	private int title;
	private int tag = 1; //1=黑,2=红,3=梅,4=方
	
	public int getIndex() {
		return index;
	}
	public void setIndex(int index) {
		this.index = index;
	}
	public int getTitle() {
		return title;
	}
	public void setTitle(int title) {
		this.title = title;
	}
	public int getTag() {
		return tag;
	}
	public void setTag(int tag) {
		this.tag = tag;
	}
	
	
	
}
public class RandomSort {
	private Random random = new Random();

	//数组大小
	private int SIZE = 80;

	//要重排序的数组
	private int[] positions;

	public RandomSort(int size) {
		SIZE = size;
		positions = new int[SIZE];
		for(int index=0; index<positions.length;index++) {
			//初始化数组,以下标为元素值
			positions[index] = index;
		}
		//顺序打印出数组的值
		//dwn();
	}

	//重排序
	public int[] changePosition() {
		for (int index = SIZE - 1; index >= 0; index--) {
			//从0到index处之间随机取一个值,跟index处的元素交换
			exchange(random.nextInt(index + 1), index);
		}
		return positions;
	}
	
	//交换位置
	private void exchange(int p1, int p2) {
		int temp = positions[p1];
		positions[p1] = positions[p2];
		positions[p2] = temp;
	}

	//打印数组的值
	private void dwn() {
		for(int index=0; index<positions.length;index++) {
			System.out.print(positions[index]+" ");
		}
		System.out.println();
	}

}
public class Person {

	private int index;
	private int[] num;
	private int values;
	
	public int getIndex() {
		return index;
	}
	public void setIndex(int index) {
		this.index = index;
	}
	public int[] getNum() {
		return num;
	}
	public void setNum(int[] num) {
		this.num = num;
	}
	public int getValues() {
		return values;
	}
	public void setValues(int values) {
		this.values = values;
	}
	
	
	
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值