博学谷:【案例】模拟斗地主发牌游戏
2022/1/2 23:12:10
本文主要是介绍博学谷:【案例】模拟斗地主发牌游戏,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
1.需求
使用一个集合对象存储一副扑克牌,将所有扑克牌的顺序打乱,然后分发给用集合表示的三个玩家和底牌,并打印玩家和底牌的集合内容。
2.步骤
- 买一副扑克牌,将花色和数字分别进行组合,生成所有的普通牌。手动添加大小王
- 洗牌 :使用Collections 工具类的shuffle()方法打乱牌的顺序
- 发牌 : 遍历牌堆,将每一张牌分发到三个玩家集合中,留三张作底牌
- 看牌 : 分别打印每个玩家集合的内容
2.1.买牌
分析1
- 创建数字数组 :nums
- 创建花色数组 : colors
- 循环嵌套拼接两数组
- String类的concat方法:colors[i].concat(nums[j])(X.concat(Y)输出结果为XY ; Y.concat(X)数出结果为YX)
package cn.itcast.demo2; public class SendPokerTest { public static void main(String[] args) { //创建数字数组和花色数组 String[] nums = {"3","4","5","6","7","8","9","K","Q","J","A","2"}; String[] colors = {"♣","♦","♥","♠"}; //拼接两数组 for (int i = 0; i < nums.length; i++) { for (int j = 0; j < colors.length; j++) { colors[j].concat(nums[i]); System.out.print(colors[j].concat(nums[i])+" "); } } } }
分析2
- 定义一个双列集合,键设置编号,值表示具体的牌 规则:编号越小牌越小(花色不同大小相同的牌怎么设置编号,为什么要设置编号)
- 定义一个单列集合,存储编号
- 循环嵌套两个数组,将牌添加进双列集合,将编号添加进单列集合
- 手动添加大小王
- 打印
package cn.itcast.demo2; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class SendPokerTest { public static void main(String[] args) { //创建数字数组和花色数组 String[] numbers = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"}; String[] colors = {"♣","♦","♥","♠"}; //定义一个num用于表示编号 int num = 0; //定义一个双列集合,存储牌和牌的编号 Map<Integer,String> pokers = new HashMap<>(); //定义一个单列集合,存储牌的编号 List<Integer> list = new ArrayList<>(); //循环嵌套拼接两数组 for (String number : numbers) {//外循环遍历牌面 for (String color : colors) {//内循环遍历花色 //拼接两数组,作为双列集合的值 String poker = color + number ; //将其添加入双列集合 pokers.put(num,poker); //将编号添加进单列集合 list.add(num); //每添加一次,编号就要自增1 num++; } } //打印目前生成的52张牌 System.out.println("双列集合中的52张牌是:" + pokers); //打印单列集合中的编号 System.out.println("目前的52个编号为:" + list); } }
2.2.洗牌
- 利用Collections工具类中的shuffle()方法进行洗牌
2.3.发牌
-
创建4个集合对象,三个表示玩家集合对象,一个表示底牌集合对象
-
发牌动作:
-
将索引与3取余,若余数为0将牌发给第1个玩家,若余数为1发给第2个玩家,余数为2发给第3个玩家
-
若只剩最后三张则将其存入底牌集合对象
if(i >= list.size()-3) { dipai.add(list[i]); }
-
-
展示牌面
package cn.itcast.demo2; import java.util.*; public class SendPokerTest { public static void main(String[] args) { //创建数字数组和花色数组 String[] numbers = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"}; String[] colors = {"♣","♦","♥","♠"}; //定义一个num用于表示编号 int num = 0; //定义一个双列集合,存储牌和牌的编号 Map<Integer,String> pokers = new HashMap<>(); //定义一个单列集合,存储牌的编号 List<Integer> list = new ArrayList<>(); //循环嵌套拼接两数组 for (String number : numbers) {//外循环遍历牌面 for (String color : colors) {//内循环遍历花色 //拼接两数组,作为双列集合的值 String poker = color + number ; //将其添加入双列集合 pokers.put(num,poker); //将编号添加进单列集合 list.add(num); //每添加一次,编号就要自增1 num++; } } //添加大小王 pokers.put(num,"小王"); list.add(num++); pokers.put(num,"大王"); list.add(num); //打印所有牌 System.out.println("双列集合中的54张牌是:" + pokers); //打印单列集合中的编号 System.out.println("54个编号为:" + list); //洗牌 Collections.shuffle(list); System.out.println("洗牌后的编号:" + list); //发牌 //1.创建4个集合对象 List<Integer> player1 = new ArrayList<>(); List<Integer> player2 = new ArrayList<>(); List<Integer> player3 = new ArrayList<>(); List<Integer> restPoker = new ArrayList<>(); //2.遍历打乱顺序后的list,并进行发牌 for (int i = 0; i < list.size(); i++) { //获取list中的索引序号 Integer pokerNum = list.get(i); //按照索引发牌 if (i >= list.size() - 3) { restPoker.add(list.get(i)); } else if (i % 3 == 0) { player1.add(list.get(i)); } else if (i % 3 == 1) { player2.add(list.get(i)); } else if (i % 3 == 2) { player3.add(list.get(i)); } } System.out.println("player1 :" + player1); System.out.println("player2 :" + player2); System.out.println("player3 :" + player3); System.out.println("restPoker :" + restPoker); } }
2.4.看牌
定义一个看牌的方法
- 将玩家的牌和底牌按照从小到大的顺序排列
- 遍历单列集合,利用单列集合中的元素获取双列集合中的值
- 定义可变长的StringBuilder对象,用于拼接字符串
- 返回去除首尾空格的字符串
- 主方法中调用该方法
package cn.itcast.demo2; import java.util.*; public class SendPokerTest { public static void main(String[] args) { //创建数字数组和花色数组 String[] numbers = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"}; String[] colors = {"♣","♦","♥","♠"}; //定义一个num用于表示编号 int num = 0; //定义一个双列集合,存储牌和牌的编号 Map<Integer,String> pokers = new HashMap<>(); //定义一个单列集合,存储牌的编号 List<Integer> list = new ArrayList<>(); //循环嵌套拼接两数组 for (String number : numbers) {//外循环遍历牌面 for (String color : colors) {//内循环遍历花色 //拼接两数组,作为双列集合的值 String poker = color + number ; //将其添加入双列集合 pokers.put(num,poker); //将编号添加进单列集合 list.add(num); //每添加一次,编号就要自增1 num++; } } //添加大小王 pokers.put(num,"小王"); list.add(num++); pokers.put(num,"大王"); list.add(num); //打印所有牌 System.out.println("双列集合中的54张牌是:" + pokers); //打印单列集合中的编号 System.out.println("54个编号为:" + list); //洗牌 Collections.shuffle(list); System.out.println("洗牌后的编号:" + list); //发牌 //1.创建4个集合对象 List<Integer> player1 = new ArrayList<>(); List<Integer> player2 = new ArrayList<>(); List<Integer> player3 = new ArrayList<>(); List<Integer> restPoker = new ArrayList<>(); //2.遍历打乱顺序后的list,并进行发牌 for (int i = 0; i < list.size(); i++) { //获取list中的索引序号 Integer pokerNum = list.get(i); //按照索引发牌 if (i >= list.size() - 3) { restPoker.add(list.get(i)); } else if (i % 3 == 0) { player1.add(list.get(i)); } else if (i % 3 == 1) { player2.add(list.get(i)); } else if (i % 3 == 2) { player3.add(list.get(i)); } } //输出玩家牌和底牌 System.out.println("player1 :" + printPoker(player1,pokers)); System.out.println("player2 :" + printPoker(player2,pokers)); System.out.println("player3 :" + printPoker(player3,pokers)); System.out.println("restPoker :" + printPoker(restPoker,pokers)); } /*定义一个方法用于看牌 * 方法名:printPoker() * 参数列表:根据编号输出具体的牌 * List<Integer> nums, Map<Integer,String> poker*/ public static String printPoker(List<Integer> nums,Map<Integer,String> pokers) { //将牌按照从小到大的顺序进行排列 Collections.sort(nums); //遍历单列集合,根据集合元素编号获取双列集合中的具体的牌 StringBuilder sb = new StringBuilder(); for (Integer num : nums) { //根据list集合中获取的元素(即双列集合中的键)获取到双列集合中具体的牌 String eachPoke = pokers.get(num); //拼接三个玩家及底牌集合中的牌的值 sb.append(eachPoke + " "); } String str = sb.toString(); return str.trim(); } }
这篇关于博学谷:【案例】模拟斗地主发牌游戏的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南