解析扑克牌游戏发牌算法——java实现
2016-05-10 22:50
627 查看
我们都玩过扑克牌的小游戏,有没有想过扑克牌的发牌是怎样实现的呢?
首先,我们手里有一副牌,假设去掉大小鬼,我们手里的牌用数字1-52表示。我们每次只取出一个数字,那我们如何取出这些数字并且使每次取出的数字不重复?
其实很简单。我们用一个数组存这52个数。利用随机数取出一个数(随机数的范围为1-52),然后将该数与数组最后一个数交换位置,然后再次利用随机数取数,不过值得注意的是此时随机数的范围要减1(范围为1-51),然后将取出的数与位置倒数第二的数交换位置,依次类推......
发牌算法就可以如此实现,时间复杂度为O(n)。
代码实现:
package com.yc.card;
import java.util.Random;
public class Card {
public static void main(String[] args) {
int[] card = getCard(1);//获取一副牌
int len = card.length;
Random random = new Random();
for(int i=0; i<52; i++) {
int index = random.nextInt(len);
String str = showCard(card[index]);
System.out.println(card[index] + "\t" + str);
//进行交换
int temp = card[index];
card[index] = card[len-1];
card[len-1] = temp;
len--;
}
}
/**
* 根据需要获取牌的数量,num为牌的数量
* @param num
* @return
*/
private static int[] getCard(int num) {
int[] x = new int[52*num];
for(int i=0; i<x.length; i++) {
x[i] = i+1;
}
return x;
}
/**
* 根据牌的索引获知得到的什么花色的什么大小的牌
* @param cardIndex
* @return
*/
private static String showCard(int cardIndex) {
String[] hua = new String[]{"方块", "梅花", "红桃", "黑桃"};
String[] num = new String[]{"A", "2", "3","4","5","6","7","8","9","10","J","Q","K"};
//花色索引
int huaindex = (cardIndex-1)/13%4;
//数字索引
int numindex = (cardIndex-1)%13;
return hua[huaindex] + num[numindex];
}
}
首先,我们手里有一副牌,假设去掉大小鬼,我们手里的牌用数字1-52表示。我们每次只取出一个数字,那我们如何取出这些数字并且使每次取出的数字不重复?
其实很简单。我们用一个数组存这52个数。利用随机数取出一个数(随机数的范围为1-52),然后将该数与数组最后一个数交换位置,然后再次利用随机数取数,不过值得注意的是此时随机数的范围要减1(范围为1-51),然后将取出的数与位置倒数第二的数交换位置,依次类推......
发牌算法就可以如此实现,时间复杂度为O(n)。
代码实现:
package com.yc.card;
import java.util.Random;
public class Card {
public static void main(String[] args) {
int[] card = getCard(1);//获取一副牌
int len = card.length;
Random random = new Random();
for(int i=0; i<52; i++) {
int index = random.nextInt(len);
String str = showCard(card[index]);
System.out.println(card[index] + "\t" + str);
//进行交换
int temp = card[index];
card[index] = card[len-1];
card[len-1] = temp;
len--;
}
}
/**
* 根据需要获取牌的数量,num为牌的数量
* @param num
* @return
*/
private static int[] getCard(int num) {
int[] x = new int[52*num];
for(int i=0; i<x.length; i++) {
x[i] = i+1;
}
return x;
}
/**
* 根据牌的索引获知得到的什么花色的什么大小的牌
* @param cardIndex
* @return
*/
private static String showCard(int cardIndex) {
String[] hua = new String[]{"方块", "梅花", "红桃", "黑桃"};
String[] num = new String[]{"A", "2", "3","4","5","6","7","8","9","10","J","Q","K"};
//花色索引
int huaindex = (cardIndex-1)/13%4;
//数字索引
int numindex = (cardIndex-1)%13;
return hua[huaindex] + num[numindex];
}
}
相关文章推荐
- spring boot 学习笔记(1)
- 《java入门第一季》之Arrays类
- 《java入门第一季》之Arrays类
- Java中的Set集合接口实现插入对象不重复的原理
- JAVA学习笔记(一)-基本数据
- Struts2 NosuchMethod
- 开始学习Java!
- Spring实例化Bean的三种方式及Bean的类型(activiti实战)
- Java 进行 RSA 加解密时不得不考虑到的那些事儿
- java Thread和Runnable区别
- java中set接口的用法
- mvc版购物车--javamail技术给用户发邮件
- java 日志异常格式化字符串
- javax.crypto.BadPaddingException: Given final block not properly padded
- mvc购物车项目--提交订单并创建订单
- 学习记录 java随机数的产生机制
- 启动eclipse出现 Error when loading the SDK
- 第一章 JAVA入门(数据输入之EchoText类)
- 关于Java深度克隆和浅度克隆的简单说明
- java sleep() 、yield()