模拟斗地主的洗牌和发牌的小程序

xiaoxiao2021-02-28  4

模拟斗地主的洗牌和发牌 思路: 1)创建一个牌盒(容器:集合) ArrayList<String> 2)装牌 红桃A,黑桃A,方片A,梅花A... 3)洗牌 Collections中的随机置换功能:shuffle() 4)发牌 遍历集合,获取集合中具体的牌 通过选择语句进行判断: 1--->A, 2--->B, 2--->C 4--->A,... 发给3个人,3个人分别用ArrayList<String>接收 如果当前牌  %3 == 0,1,2 5)看牌

将看牌封装成一个独立的功能

代码如下:

import java.util.ArrayList; import java.util.Collections; public class Poker { public static void main(String[] args) { //1.创建牌盒 ArrayList<String> array = new ArrayList<String>() ; //2.装牌 //2.1创建花色数组 String[] colors = {"♥","♠","♦","♣"} ; //2.2 创建点数数组 String[] numbers = {"A","2","3","4","5","6","7","8","9", "10","J","Q","K"} ; for(String color :colors) { for(String number:numbers) { String poker = color.concat(number) ; array.add(poker) ; } } //添加大王和小王 array.add("大王") ; array.add("小王") ; //3.洗牌 Collections.shuffle(array); //System.out.println(array); //4.发牌 //现在3个人玩,把每个人都看做一个ArrayList ArrayList<String> player1 = new ArrayList<String>() ; ArrayList<String> player2 = new ArrayList<String>() ; ArrayList<String> player3 = new ArrayList<String>() ; ArrayList<String> diPai = new ArrayList<String>() ; //遍历ArrayList集合,使用普通for循环,获取到集合的元素 //通过元素 % 玩家人数 = 0 /1/2 /.. for(int x = 0 ; x < array.size() ; x ++) { //获取到每一个元素 if(x >= array.size() -3) { //底牌 diPai.add(array.get(x)) ; }else if(x % 3 == 0) { //玩家1 player1.add(array.get(x)) ; }else if(x % 3 == 1) { //玩家2 player2.add(array.get(x)) ; }else if(x % 3 == 2) { //玩家3 player3.add(array.get(x)) ; } } //5.看牌 //3个人看牌,将看牌封装成一个功能 lookPoker("玩家1", player1); lookPoker("玩家2", player2); lookPoker("玩家3", player3); lookPoker("底牌", diPai); } public static void lookPoker(String name,ArrayList<String> array) { System.out.print(name+"的牌是:"); for(String s : array) { System.out.print(s+" "); } System.out.println(); } }

运行后发现,虽然牌发到每一个人手中的基本功能完成了,但怎样才能保证牌发到每个人的手中都是有序的呢?我们可以通过Collections的sort()功能进行排序,但这种方法是以花色来排序的,也就是说每个花色都是有序的,但花色之间不是有序的(这种方法大家可以下去自己试一下),那怎么才能以点数来排序呢?我们联想到之前学习过的TreeMap集合:

import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.TreeSet; public class Poker2 { public static void main(String[] args) { //1. 创建两个集合:HashMap<Integer,String>,ArrayList<Integer> HashMap<Integer, String> hm = new HashMap<Integer, String>(); ArrayList<Integer> array = new ArrayList<Integer>(); //2.装牌 //2.1 定义花色数组和点数数组 String[] colors = { "♥", "♠", "♦", "♣" }; String[] numbers = { "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2" }; //从0开始编号,将编号与编号对应的牌存储到HahMap集合中,同时往ArrayList集合中单独存储编号 int index = 0; //拼接 for (String number : numbers) { for (String color : colors) { String poker = color.concat(number); hm.put(index, poker); array.add(index); index++; } } //装大王和小王 hm.put(index, "大王"); array.add(index); index++; hm.put(index, "小王"); array.add(index); //不能再++了,否则会出现角标越界 //洗牌 Collections.shuffle(array); //System.out.println(array); //4.发牌 //发的也是编号,为了保证牌有序,用TreeSet集合接收 TreeSet<Integer> player1 = new TreeSet<Integer>(); TreeSet<Integer> player2 = new TreeSet<Integer>(); TreeSet<Integer> player3 = new TreeSet<Integer>(); TreeSet<Integer> diPai = new TreeSet<Integer>(); //遍历ArrayList集合,使用普通for循环,获取到集合的元素 //通过元素 % 玩家人数 = 0 /1/2 /.. for (int x = 0; x < array.size(); x++) { //获取到每一个元素 if (x >= array.size() - 3) { //底牌 diPai.add(array.get(x)); } else if (x % 3 == 0) { //玩家1 player1.add(array.get(x)); } else if (x % 3 == 1) { //玩家2 player2.add(array.get(x)); } else if (x % 3 == 2) { //玩家3 player3.add(array.get(x)); } } //5.看牌,封装功能 lookPoker("玩家1", player1, hm); lookPoker("玩家2", player2, hm); lookPoker("玩家3", player3, hm); lookPoker("底牌", diPai, hm); } public static void lookPoker(String name,TreeSet<Integer> ts, HashMap<Integer, String> hm) { System.out.print(name+"的牌是:"); //遍历TreeSet集合获取到每一个编号 for(Integer key :ts) { //获取编号,通过编号找牌(在HashMap中找) String value = hm.get(key) ; System.out.print(value+" "); } System.out.println(); } } 至此,斗地主的小游戏就完成了~
转载请注明原文地址: https://www.6miu.com/read-2349958.html

最新回复(0)