洗扑克牌(乱数排列)

import java.util.Random;

/**
 * 洗扑克牌(乱数排列)
 *   说明:
 *      洗扑克牌的原理其实与乱数排列是相同的,都是将一组数字(例如1~N)打乱重新排列,
 *      只不过洗扑克牌多了一个花色判断的动作而已。
 *   解法:
 *          初学者通常会直接想到,随机产生1~N的乱数并将之存入阵列中,后来产生的乱数存
 *      入阵列前必须先检查阵列中是否已有重复的数字,如果有这个数就不存入,再重新产生下
 *      一个数,运气不好的话,重复的次数就会很多,程式的执行速度就很慢了,这不是一个好
 *      方法。
 *          以1~52的乱数排列为例好了,可以将阵列先依序由1到52填入,然后使用一个回圈走
 *      访阵列,并随机产生1~52的乱数,将产生的乱数当作索引取出阵列值,并与目前阵列走
 *      访到的值相交换,如此就不用担心乱数重复的问题了,阵列走访完毕后,所有的数字也就
 *      重新排列了。
 *      
 *         至于如何判断花色?这只是除法的问题而已,取商数判断花色,取余数判断数字,您可
 *      以直接看程式比较清楚。
 * */
public class Poker {
	private int[] cards;
	//初始化扑克牌
	public Poker(){
		cards = new int[52];
		for(int i =1;i<=52;i++){
			cards[i-1]=i;
		}
	}
	//洗牌
	public void switchCards(){
		int temp=0;
		for(int i=0;i<52;i++){
			int num = (int)(Math.random() * 100)%52;
			temp=cards[i];
			cards[i] = cards[num];
			cards[num] = temp;
		}
	}
	// 发牌 
	public void sendCard() {
		
		for(int i =0;i<52;i++){
			int value = cards[i]%13+1;
			String valueString;
			switch(value){
				case 11:
					valueString="J"; break;
				case 12:
					valueString="Q"; break;
				case 13:
					valueString="K"; break;
				case 1:
					valueString="A"; break;
				default:
					valueString=value+""; break;
			}
			switch (cards[i]/13) {
			case 0:
				System.out.println("黑桃 "+valueString);
				break;
			case 1:
				System.out.println("红桃 "+valueString);
				break;
			case 2:
				System.out.println("方块 "+valueString);
				break;
			case 3:
				System.out.println("梅花 "+valueString);
				break;
			default:
				break;
			}
		}

	}
	//测试
	public static void main(String[] args) {
		
		Poker poker = new Poker();
		poker.switchCards();
		poker.sendCard();

	}
}
posted @ 2013-04-02 22:04  竹青+  阅读(477)  评论(0编辑  收藏  举报