Java 扑克牌游戏-洗牌发牌
Java 扑克牌游戏-洗牌发牌
背景
在上一篇《Java 扑克牌》的基础上再加要求,利用已有的洗牌类,继续完成新的需求
简述
在上次扑克牌的基础上(即生成一副扑克牌,没有大小王,然后洗牌),有三个玩家,然后就洗好的牌依次发给各个玩家,输出三个玩家手上的牌
基本思路
1、将洗好的牌发给三个玩家(分别为player_A、player_B、player_C);
2、发牌的过程:将52张牌发给三个玩家,循环直至发完,并且要分别记录三个玩家的牌
3、输出三个玩家的牌
思路分析
发牌过程大家一想就懂,三个人,循环发就行了,说是这么说,但是代码实现呢?
关键点:几个循环?循环什么?怎么循环?
第一:有三个玩家(也可以n个玩家),那就得循环给三个玩家发牌,对人循环;
第二:既然是发牌,那么就有循环发牌;
所以循环两个,分别循环玩家和牌。
那么怎么循环?循环的条件是什么?
52张牌,3个玩家,3个为一轮发牌,那么52张牌就得发18 = [(52/3)+1]轮(为什么+1,因为52除以3有余数,此处为一坑点),如果玩家为n,就自行判断是否需要+1。
由此可知,先循环牌,再循环玩家,直至发完(这里需要注意:发完也就是52张牌全发出去,但是两重循环,18*3=54,是超出一副牌的数量的,所以在循环中记得加上牌数量的条件限制)
代码块
import java.util.*;
public class PukepaiGame {
public static void main(String args[]) {
/** 获取已洗好的牌**/
List<Card> initCards = shuffleList();
/** 声明玩家 **/
String players[] = {"player_A","player_B","player_C"};
/** 声明玩家的牌 **/
List<Card> playerA_List = new ArrayList();
List<Card> playerB_List = new ArrayList();
List<Card> playerC_List = new ArrayList();
int k = 0; /** 记录发牌的下标 **/
int num; /** 记录发牌循环次数 **/
if (initCards.size()%players.length == 0){
num = initCards.size()/players.length;
} else {
num = (initCards.size()/players.length)+1;
}
for(int i=0;i<num;i++){
for(int j=0;j<players.length && k<initCards.size();j++){
if (("player_A").equals(players[j])){
playerA_List.add(initCards.get(k));
} else if (("player_B").equals(players[j])){
playerB_List.add(initCards.get(k));
} else if (("player_C").equals(players[j])){
playerC_List.add(initCards.get(k));
}
k++;
}
}
System.out.println("洗牌后:" + initCards.size());
for (int j = 0; j < initCards.size(); j++) {
System.out.printf(initCards.get(j).toString() + " ");
}
System.out.println("\n玩家A的牌:" + playerA_List.size() );
for (int j = 0; j < playerA_List.size(); j++) {
System.out.printf(playerA_List.get(j).toString() + " ");
}
System.out.println("\n玩家B的牌:" + playerB_List.size());
for (int j = 0; j < playerB_List.size(); j++) {
System.out.printf(playerB_List.get(j).toString() + " ");
}
System.out.println("\n玩家C的牌:" + playerC_List.size());
for (int j = 0; j < playerC_List.size(); j++) {
System.out.printf(playerC_List.get(j).toString() + " ");
}
}
private static List<Card> shuffleList() {
/** 牌面类型 */
String type[] = {"红桃", "方块", "梅花", "黑桃"};
/** 牌面大小 */
String size[] = {"A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"};
/** 存放52张牌 */
List<Card> list = new ArrayList();
for (int i = 0; i < type.length; i++) {
for (int j = 0; j < size.length; j++) {
list.add(new Card(type[i],size[j]));
}
}
/** 洗牌 */
Collections.shuffle(list);
/** 返回洗牌结果 */
return list;
}
}
class Card {
/**
* 牌面类型
*/
private String type;
/**
* 牌面大小
*/
private String size;
Card(String type, String size){
this.type = type;
this.size = size;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append(type);
sb.append(size);
return sb.toString();
}
}