江苏城乡建设学院网站,seo教程技术,seo工作内容,动漫制作专业属于什么大类【案例6-4】 斗地主洗牌发牌
【案例介绍】
1.任务描述
扑克牌游戏“斗地主”#xff0c;相信许多人都会玩#xff0c;本案例要求编写一个斗地主的洗牌发牌程序#xff0c;要求按照斗地主的规则完成洗牌发牌的过程。一副扑克总共有54张牌#xff0c;牌面由花色和数字组成…【案例6-4】 斗地主洗牌发牌
【案例介绍】
1.任务描述
扑克牌游戏“斗地主”相信许多人都会玩本案例要求编写一个斗地主的洗牌发牌程序要求按照斗地主的规则完成洗牌发牌的过程。一副扑克总共有54张牌牌面由花色和数字组成包括J、Q、K、A字母组成花色有♠、♥、♦、♣ 四种分别表示黑桃、红桃、方块、梅花小☺、大☻分别表示小王和大王。斗地主游戏共有3位玩家参与首先将这54张牌的顺序打乱每人轮流摸一次牌剩余3张留作底牌然后在控制台打印3位玩家的牌和3张底牌。
2.运行结果 任务运行结果如图6-1所示 图6-1 运行结果图 【实现思路】
1要实现纸牌程序首先需要完成纸牌的组装。牌面是由花色包括♠、♥、♦、♣花色和数字包括J、Q、K、A字母两部分组成可以创建两个ArrayList集合作为花色集合与数字集合存储时需要注意。比10大的牌的数字用J、Q、K表示1用A表示。
2将花色集合与数字集合这两个循环进行嵌套循环将花色与数字组合形成52章牌并赋予其编号。将组合后的牌存放到一个HashMap集合中集合的Key值是编号value值是组装完成的纸牌。还有两张牌是大小王小☺表示小王、大☻表示大王。由于组装规则不一致需单独使用add()方法将这两张牌加入到HashMap集合中。
3创建一个数字集合用这个数字集合代替纸牌完成洗牌和发牌操作。由于纸牌的数量是54张所以创建集合范围是0~53。
4可以使用Collection类的shuffle()方法完成打乱数字集合的操作实现洗牌效果。由于只有3个人所以可以使用for循环通过将数字与3取余的方法将代表不同纸牌的数字分配给不同人与底牌实现发牌效果。
5 洗牌和发牌结束后可以通过Collection类的sort()方法完成排序之后通过foreach()循环HashMap集合根据数字查找对应的纸牌字符串并存入创建的字符串集合中最后展示字符串集合。
【实现代码】
程序实现代码如文件6-1所示。 文件6-1 example5.java
package com.itheima;import java.util.ArrayList;import java.util.Collections;import java.util.HashMap;public class example { public static void main(String[] args) { // 准备花色 ArrayListString color new ArrayListString(); color.add(♠); color.add(♥); color.add(♦); color.add(♣); // 准备数字 ,用ArrayList将纸牌由小到大排序 ArrayListString number new ArrayListString(); for (int i 3; i 10; i) { number.add(i ); } number.add(J); number.add(Q); number.add(K); number.add(A); number.add(2); // 定义一个map集合用来将数字与每一张牌进行对应 HashMapInteger, String map new HashMapInteger, String(); int index 0;// 纸牌编号 for (String thisNumber : number) {// 循环纸牌数字 for (String thisColor : color) {// 循环纸牌花色 // 将花色与数字组合形成52张牌并赋予其编号 map.put(index, thisColor thisNumber); } } // 加入大小王 map.put(index, 小☺); map.put(index, 大☻); // 一副54张的牌 ArrayList里边为0-53的数的新牌 ArrayListInteger cards new ArrayListInteger(); for (int i 0; i 53; i) { cards.add(i);// 此时的cards顺序为0-53 } // 洗牌使用Collections工具类中的shuffle()方法 Collections.shuffle(cards);// 此时的cards顺序已被打乱 // 创建三个玩家和底牌 ArrayListInteger iPlayer new ArrayListInteger(); ArrayListInteger iPlayer2 new ArrayListInteger(); ArrayListInteger iPlayer3 new ArrayListInteger(); ArrayListInteger iSecretCards new ArrayListInteger(); // 遍历这副洗好的牌遍历过程中将牌发到三个玩家和底牌中 for (int i 0; i cards.size(); i) { if (i 51) { iSecretCards.add(cards.get(i));// 留取3张底牌 } else { if (i % 3 0) { iPlayer.add(cards.get(i));//与3取余为0的牌发给玩家1 } else if (i % 3 1) { iPlayer2.add(cards.get(i));//与3取余为1的牌发给玩家2 } else { iPlayer3.add(cards.get(i));// 其余的牌发给玩家3 } } } // 对每个人手中的牌排序使用Collections工具类中的sort()方法 Collections.sort(iPlayer); Collections.sort(iPlayer2); Collections.sort(iPlayer3); // 对应数字形式的每个人手中的牌定义字符串形式的牌 ArrayListString sPlayer new ArrayListString(); ArrayListString sPlayer2 new ArrayListString(); ArrayListString sPlayer3 new ArrayListString(); ArrayListString sSecretCards new ArrayListString(); // 循环主键从map中获取纸牌 for (Integer key : iPlayer) { sPlayer.add(map.get(key)); } for (Integer key : iPlayer2) { sPlayer2.add(map.get(key)); } for (Integer key : iPlayer3) { sPlayer3.add(map.get(key)); } for (Integer key : iSecretCards) { sSecretCards.add(map.get(key)); } // 看牌 System.out.println(玩家1 sPlayer); System.out.println(玩家2 sPlayer2); System.out.println(玩家3 sPlayer3); System.out.println(底牌 sSecretCards); }}
在文件6-1中第8~22行代码将4种花色和13个纸牌编号分别放到两个ArrayList集合中。第24~34当代码foreach循环拼出52张纸牌并将其依照从小到大的顺序放入Map集合中并将大小王添加到其中。第36~41行代码创建了代替纸牌的数字集合将其与纸牌中的序号对应并将数字集合中的顺序打乱此时集合相当于纸牌编号集合。第43~60行代码完成了将纸牌编号发给3位玩家并留3张纸牌编号做为底牌的操作。第62~64行代码将3位玩家手中纸牌编号进行排序。第66~88行代码通过循环3位玩家手中的纸牌编号将纸牌字符串从Map中取出放入字符串集合。最后打印字符串集合分别得到3个玩家的纸牌和底牌。