Java集合的综合案例之——斗地主的“洗牌”与“发牌”
Java集合的综合案例之——斗地主的“洗牌”与“发牌”按照斗地主的规则,完成洗牌发牌的动作。
具体规则:
使用54张牌打乱顺序,摞整齐放在桌子上,三个玩家参与游戏,三人交替从最上面开始摸牌,当只剩三张牌时停止摸牌,并把最后的三张牌留作底牌。
1.需求分析
准备牌——54张牌存到一个集合中
大王和小王特殊牌:2张
四种花色普通牌:52张
先定义一个数组/集合,存储4中花色的扑克牌:♥ ♠ ♦ ♣
再定义一个数组/集合,用来存储13个序号:3,4,5 ... K,A,2
然后循环嵌套两个数组/集合,组装这52张扑克牌:
♥3,♥4,♥5,...,♥K,♥A,♥2
♠3,♠4,♠5,...,♠K,♠A,♠2,
♦3,♦3,♦3,...,♦K,♦A,♦2,
♣3,♣4,♣5,...,♣K,♣A,♣2,
洗牌
使用集合工具类Collections:
static void shuffle(List//使用默认随机源对指定列表进行置换
该方法会随机打乱集合中元素的顺序
发牌
要求:1人17张牌,剩余三张当底牌,没人每次一张牌,轮流发:使用集合的索引去除以三,取余
定义四个集合,存储三个玩家的牌和三张底牌
索引%2,有两个值(0和1)
索引%3,有三个值(0和1和2)
索引>=51,变成给底牌发牌
看牌
直接打印集合,遍历存储玩家和底牌的集合。
2.代码实现
import java.util.ArrayList; import java.util.Collections; /*斗地主综合案例: * 1.准备54张牌 * 2.洗牌 * 3.发牌 * 4.看牌*/ public class PlayPoker { public static void main(String[] args) { //1.准备54张牌 //新建一个集合存储54张牌并打乱顺序 ArrayListpokers = new ArrayList<>(); //直接定义两个数组并赋值,一个存四种花色,一个存13张牌的值(3,4,5,6,7,8,9,10,J,Q,K,A,2) String[] kind = {"♥","♠","♦","♣"}; String[] number = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"}; //先存大王小王到pokers集合中 pokers.add("大王"); pokers.add("小王"); //组装两个集合的数据,生成带花色的52张牌(可以用普通for循环,也可以用增强for循环foreach) for (int i = 0; i < kind.length; i++) { for (int j = 0; j < 13; j++) { pokers.add(kind[i]+number[j]); } } System.out.println("54张牌:"+pokers);//顺序打印 //洗牌--打乱pokers集合里的元素顺序 Collections.shuffle(pokers); System.out.println("洗过的54张牌:"+pokers);//乱序打印 //发牌-- //定义4个集合,分别存储3个玩家的牌和3张底牌 ArrayListplayer1 = new ArrayList<>(); ArrayListplayer2 = new ArrayList<>(); ArrayListplayer3 = new ArrayList<>(); ArrayListbottoms = new ArrayList<>(); /*遍历pokers集合,获取每一张牌(由于增强for循环里没有索引,就无法对每一张牌进行操作,所以下面要用普通for循环) * 轮流发牌:使用集合的索引去除以三,取余 * 索引%2,有两个值(0和1) 索引%3,有三个值(0和1和2) 索引>=51,变成给底牌发牌 注意事项:必须先判断索是否大于51,因为要提前判断是不是发到了第51张,之后的三张要留着 */ for (int i = 0; i < pokers.size(); i++) { if (i<51){ if (i%3==0){ player1.add(pokers.get(i)); }else if (i%3==1){ player2.add(pokers.get(i)); }else if (i%3==2){ player3.add(pokers.get(i)); } }else { bottoms.add(pokers.get(i)); } } System.out.println("========================================="); System.out.println("玩家1:"+player1); System.out.println("玩家2:"+player2); System.out.println("玩家3:"+player3); System.out.println("底 牌:"+bottoms); } }
运行结果:
思考
如果想要给发好的牌排序怎么操作?
未完待续...