博学谷:【案例】模拟斗地主发牌游戏
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();}
}
博学谷:【案例】模拟斗地主发牌游戏相关推荐
- python斗地主出牌算法_python模拟斗地主发牌
本文实例为大家分享了python模拟斗地主发牌的具体代码,供大家参考,具体内容如下 题目:趣味百题之斗地主 扑克牌是一种非常大众化的游戏,在计算机中有很多与扑克牌有关的游戏.例如,在Windows操作 ...
- 模拟斗地主发牌功能的设计与实现
模拟斗地主发牌功能的设计与实现 参考斗地主的游戏规则,完成一个发牌的功能(54张牌,考虑点数,花色:三名玩家,其中地主比其他玩家多3张牌) 牌类 牌有牌面值.花色及实际大小三个属性 import ja ...
- 模拟斗地主发牌过程 C++
遇到一个模拟斗地主发牌过程的编程题,在这里记录一下,供大家参考. 首先,斗地主有三个玩家,一共54张扑克牌,玩家抽完牌后剩余3张底牌.题目要求将54张牌发给三个玩家,并给每个玩家手中的扑克牌进行排序. ...
- python实现单机斗地主_python模拟斗地主发牌
本文实例为大家分享了python模拟斗地主发牌的具体代码,供大家参考,具体内容如下 题目:趣味百题之斗地主 扑克牌是一种非常大众化的游戏,在计算机中有很多与扑克牌有关的游戏.例如,在Windows操作 ...
- java小程序扑克牌_用Java来写一个模拟斗地主发牌的小程序
一副扑克有54张牌:大小王+4*13,接下来我们来模拟一下斗地主的发牌过程 首先,我们需要买牌,新买来的牌都是按顺序摆放的,因此下一步是洗牌,最后就是发牌了,不过发牌的时候要注意还要在最后留三张底牌. ...
- Python3模拟斗地主发牌
模拟斗地主发牌,牌共54张, 花色:黑桃('\u2660'),梅花('\u2663'),方块('\u2665'),红桃('\u2666'),种类为:A2-10JQK,大小王(X, x) 三个人,每个人 ...
- python 斗地主发牌_tkinter模拟斗地主发牌
在上一篇文章的最后,我们留了一个小作业:花果山美男子:tkinter模拟扑克牌和狼人杀发牌zhuanlan.zhihu.com 小作业2:模拟斗地主发牌,上方是牌库,实现从牌库到三个方向的动态发牌, ...
- java基础语法day20(Map、模拟斗地主发牌)
第1章 Map接口 1.1 Map接口概述 我们通过查看Map接口描述,发现Map接口下的集合与Collection接口下的集合,它们存储数据的形式不同,如下图. 1. Collection中的集合, ...
- java中使用集合模拟斗地主发牌的两种排序(根据大小或者花色)
第一种排序 根据花色,把相同的花色排到一起,然后将其花色一样的再进行排序 第一种排序参照代码中all()方法 第二种排序 真实的模拟斗地主游戏的排序玩法,即按照大王(这里用的是JOKER)joker2 ...
最新文章
- 互联网流量太贵!新零售成创业新风口
- html5小游戏Untangle
- 网络方法的发展及最新iDIRECT方法介绍
- nginx http转https_Nginx处理访问www域名跳转到不带www域名的配置方法
- 【2022新书】机器学习基础
- Nginx错误日志说明
- eclipse新建一个java_Eclipse中新建一个java源文件的步骤
- c语言goto语句用法_硬件工程师必知的10个C语言技巧
- 近5年133个Java面试题 你会几个?
- Java JUC工具类--Semaphore
- 从零开始学Pytorch(七)之卷积神经网络
- android 无线接口 泛收,Android下的Java之interface接口泛型 动态获取泛型的类型
- 剑指offer面试题49. 丑数
- CUDNN学习笔记(2)
- [第五组] 典型用户 +用例+功能说明书+技术说明书 2017.07.25版
- beanshell断言_Jmeter之BeanShell断言使用(示例代码)
- 1507. 旅行计划
- 重装系统找不到固态_安装Win10系统没有固态硬盘(双硬盘找不到固态硬盘)怎么解决?...
- [状压dp][BZOJ3717][PA2014]Pakowanie
- 为远程群晖NAS的自定义域名配置SSL证书