目录
前言
实现功能的方法很重要,自己表达的逻辑不一定是最好的,这就需要去参考别人的方法,去理解运用。
重要的是洗牌的逻辑,它是标准的扑克牌洗牌规则。
提示:以下是本篇文章正文内容,下面案例可供参考
一、创建并初始化扑克牌
1、创建扑克牌
- 一共有54张扑克牌;
- 每张扑克牌属性都相同,所以选用数组
2、定义扑克牌
- 先用初始化定义(最好用枚举类型去定义)比较和枚举定义相同
- 用双层for循环定义赋值不严谨,不要用。(不能以结果为导向写代码,逻辑很重要)
代码如下(示例):
String[] playingCards = {"红桃A", "红桃2", "红桃3", "红桃4", "红桃5", "红桃6", "红桃7",
"红桃8", "红桃9", "红桃10", "红桃J", "红桃Q", "红桃K", "黑桃A", "黑桃2", "黑桃3", "黑桃4",
"黑桃5", "黑桃6", "黑桃7", "黑桃8", "黑桃9", "黑桃10", "黑桃J", "黑桃Q", "黑桃K", "方片A",
"方片2", "方片3", "方片4", "方片5", "方片6", "方片7", "方片8", "方片9", "方片10", "方片J",
"方片Q", "方片K", "梅花A", "梅花2", "梅花3","梅花4", "梅花5", "梅花6", "梅花7", "梅花8",
"梅花9", "梅花10", "梅花J", "梅花Q", "梅花K", "大王", "小王"};
二、洗牌规则
随机数,两个数据交换,for循环
1.从前往后洗牌
- 从前往后依次抽取前面 n 位置的牌 - 随机数抽取 n ~ 54范围的牌(用随机数抽取指定范围的数random.nextInt(max-min+1)-min) - 重复以上过程 53 次
代码如下(示例):
//从前往后依次洗牌,最小值会逐渐增加1
int max = 53;
int min = 1;
Random random = new Random();
int index = random.nextInt(max-min+1)-min);
2.从后往前洗牌
- 从后往前依次抽取后面 n 位置的牌 - 随机数抽取 0 ~ n 位置的整数用于扑克牌下标,相当于随机抽取前面扑克牌 - 两张牌交换一下(两个数据交换位置) - 重复以上过程 53 次
//数组有下标,创建随机数抽取下标,后两个数交换位置
Random random = new Random();
//从后往前洗牌,从后选中一张牌,在随机抽取一张牌,交换数据,完成洗牌,重复过程53次
for (int i=playingCards.length-1;i>0;i--) {//大于0是为了省略最后一次交换
//抽取最后一张牌,每次洗牌,位置向前移动一位
String card = playingCards[i];
//随机抽取没有交换位置的牌的下标
int index = random.nextInt(i);
//把随机抽取的牌 和 最后一张牌交换位置(将要洗的牌)
playingCards[i] = playingCards[index];
playingCards[index] = card;
//重复以上过程,
}
三、发牌流程
- 发牌的业务规则 - 共有3个人,每人17张牌,最后3张做底牌 - 发牌阶段有两种发牌思路
//初始化 3个人 17张牌
String[] p1 = new String[17];
String[] p2 = new String[17];
String[] p3 = new String[17];
1.每人发17张,共发3人
int index = 0;
for (int i=0;i<17;i++) {
p1[i] = playingCards[index];
p2[i] = playingCards[index+1];
p3[i] = playingCards[index+2];
index+=3;
}
2.发牌轮次17次,每轮3次
int index = 0;
for (int i=0;i<=48;i+=3) {
p1[index] = playingCards[i];
p2[index] = playingCards[i+1];
p3[index] = playingCards[i+2];
index++;
}
//存入底牌
String[] base = {playingCards[51],playingCards[52],playingCards[53]};
四、输出到控制台
增强for循环,foreach和for相比只是少写了循环次数,编译时会编译成正常for循环
System.out.print("p1: ");
for (String card : p1) {
System.out.print(card+ " ");
}
System.out.println();
System.out.print("p2: ");
for (String card : p2) {
System.out.print(card+ " ");
}
System.out.println();
System.out.print("p3: ");
for (String card : p3) {
System.out.print(card+ " ");
}
System.out.println();
System.out.print("底牌: ");
for (String card : base) {
System.out.print(card+ " ");
}
总结
- 用枚举类型去定义固定的内容,虽然for循环也可以但是不严谨,不推荐使用。
- 不能以结果为导向写代码,逻辑很重要。
- 傻瓜也能写出计算机能理解的代码,而好的程序员是写给人能看懂的代码。
- 计算机只认识 0 或 1,随机数借鉴了 ”高德纳“ 设计的算法,实现了随机数的API。