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);//每添加一次,编号就要自增1num++;}}//打印目前生成的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);//每添加一次,编号就要自增1num++;}}//添加大小王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);//每添加一次,编号就要自增1num++;}}//添加大小王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();}
}

博学谷:【案例】模拟斗地主发牌游戏相关推荐

  1. python斗地主出牌算法_python模拟斗地主发牌

    本文实例为大家分享了python模拟斗地主发牌的具体代码,供大家参考,具体内容如下 题目:趣味百题之斗地主 扑克牌是一种非常大众化的游戏,在计算机中有很多与扑克牌有关的游戏.例如,在Windows操作 ...

  2. 模拟斗地主发牌功能的设计与实现

    模拟斗地主发牌功能的设计与实现 参考斗地主的游戏规则,完成一个发牌的功能(54张牌,考虑点数,花色:三名玩家,其中地主比其他玩家多3张牌) 牌类 牌有牌面值.花色及实际大小三个属性 import ja ...

  3. 模拟斗地主发牌过程 C++

    遇到一个模拟斗地主发牌过程的编程题,在这里记录一下,供大家参考. 首先,斗地主有三个玩家,一共54张扑克牌,玩家抽完牌后剩余3张底牌.题目要求将54张牌发给三个玩家,并给每个玩家手中的扑克牌进行排序. ...

  4. python实现单机斗地主_python模拟斗地主发牌

    本文实例为大家分享了python模拟斗地主发牌的具体代码,供大家参考,具体内容如下 题目:趣味百题之斗地主 扑克牌是一种非常大众化的游戏,在计算机中有很多与扑克牌有关的游戏.例如,在Windows操作 ...

  5. java小程序扑克牌_用Java来写一个模拟斗地主发牌的小程序

    一副扑克有54张牌:大小王+4*13,接下来我们来模拟一下斗地主的发牌过程 首先,我们需要买牌,新买来的牌都是按顺序摆放的,因此下一步是洗牌,最后就是发牌了,不过发牌的时候要注意还要在最后留三张底牌. ...

  6. Python3模拟斗地主发牌

    模拟斗地主发牌,牌共54张, 花色:黑桃('\u2660'),梅花('\u2663'),方块('\u2665'),红桃('\u2666'),种类为:A2-10JQK,大小王(X, x) 三个人,每个人 ...

  7. python 斗地主发牌_tkinter模拟斗地主发牌

    在上一篇文章的最后,我们留了一个小作业:花果山美男子:tkinter模拟扑克牌和狼人杀发牌​zhuanlan.zhihu.com 小作业2:模拟斗地主发牌,上方是牌库,实现从牌库到三个方向的动态发牌, ...

  8. java基础语法day20(Map、模拟斗地主发牌)

    第1章 Map接口 1.1 Map接口概述 我们通过查看Map接口描述,发现Map接口下的集合与Collection接口下的集合,它们存储数据的形式不同,如下图. 1. Collection中的集合, ...

  9. java中使用集合模拟斗地主发牌的两种排序(根据大小或者花色)

    第一种排序 根据花色,把相同的花色排到一起,然后将其花色一样的再进行排序 第一种排序参照代码中all()方法 第二种排序 真实的模拟斗地主游戏的排序玩法,即按照大王(这里用的是JOKER)joker2 ...

最新文章

  1. 互联网流量太贵!新零售成创业新风口
  2. html5小游戏Untangle
  3. 网络方法的发展及最新iDIRECT方法介绍
  4. nginx http转https_Nginx处理访问www域名跳转到不带www域名的配置方法
  5. 【2022新书】机器学习基础
  6. Nginx错误日志说明
  7. eclipse新建一个java_Eclipse中新建一个java源文件的步骤
  8. c语言goto语句用法_硬件工程师必知的10个C语言技巧
  9. 近5年133个Java面试题 你会几个?
  10. Java JUC工具类--Semaphore
  11. 从零开始学Pytorch(七)之卷积神经网络
  12. android 无线接口 泛收,Android下的Java之interface接口泛型 动态获取泛型的类型
  13. 剑指offer面试题49. 丑数
  14. CUDNN学习笔记(2)
  15. [第五组] 典型用户 +用例+功能说明书+技术说明书 2017.07.25版
  16. beanshell断言_Jmeter之BeanShell断言使用(示例代码)
  17. 1507. 旅行计划
  18. 重装系统找不到固态_安装Win10系统没有固态硬盘(双硬盘找不到固态硬盘)怎么解决?...
  19. [状压dp][BZOJ3717][PA2014]Pakowanie
  20. 为远程群晖NAS的自定义域名配置SSL证书

热门文章

  1. ubuntu下git配置和基本使用
  2. 华创期货:止损还是抗单决定亏损还是盈利
  3. MNIST数据集提取图片和标注信息
  4. MonacoEditor编辑器自动格式代码
  5. 一键安装jumpserver
  6. 【转】2018最新csdn修改博客皮肤模板教程
  7. python实现图形界面设计+数据库(pyodbc)教材征订系统
  8. BP神经网络最大训练次数,bp神经网络训练时间
  9. 某房屋中介网站爬虫实例
  10. 吴裕雄--天生自然 Tensorflow卷积神经网络:花朵图片识别