集合实现斗地主发牌操作

it2022-05-09  25

博客作为日常教学记录补充,将自己和学生的小思路和灵感进行简要记录,今天讲解完集合,布置了一个集合实现斗地主发牌的小练习,并进行结合面向对象思想的讲解,学生在课程完毕后,提出了更简便的思路,特此记录:

1.面向过程思路+集合

// 扑克牌 Map<Integer,String> pokerMap = new HashMap<>(); // 牌的顺序 List<Integer> sort = new ArrayList<>(); // 1.买扑克 // 1.1 花色 String[] flower = {"♠","♦","♣","♥"}; // 1.2 数字 String[] nums = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"}; int a = 1; // 组合 for(int i = 0 ; i < nums.length ; i ++){ for(int j = 0; j < flower.length ; j++){ String str = nums[i] + flower[j]; sort.add(a); pokerMap.put(a,str); a++; } } sort.add(a); pokerMap.put(a,"小王"); a++; sort.add(a); pokerMap.put(a,"大王"); System.out.println(pokerMap); System.out.println(sort); // 2.洗牌 Collections.shuffle(sort); System.out.println(sort); // 3.发牌(三人+底牌) List<Integer> player1 = new ArrayList<>(); List<Integer> player2 = new ArrayList<>(); List<Integer> player3 = new ArrayList<>(); List<Integer> floor = new ArrayList<>(); for(int i = 0; i < sort.size(); i++){ // 前三张作为底牌抽出 if(i < 3){ floor.add(sort.get(i)); }else if(i % 3 == 0){// player1 player1.add(sort.get(i)); }else if(i % 3 == 1){// player2 player2.add(sort.get(i)); }else if(i % 3 == 2){// player3 player3.add(sort.get(i)); } } // 整牌 Collections.sort(player1); Collections.sort(player2); Collections.sort(player3); // 4.看牌 System.out.println("玩家1:"); for(int i = 0 ; i < player1.size();i++){ String str = pokerMap.get(player1.get(i)); System.out.print(str + "\t"); } System.out.println(); System.out.println("玩家2:"); for(int i = 0 ; i < player2.size();i++){ String str = pokerMap.get(player2.get(i)); System.out.print(str + "\t"); } System.out.println(); System.out.println("玩家3:"); for(int i = 0 ; i < player3.size();i++){ String str = pokerMap.get(player3.get(i)); System.out.print(str + "\t"); } System.out.println(); System.out.println("底牌:"); for(int i = 0 ; i < floor.size();i++){ String str = pokerMap.get(floor.get(i)); System.out.print(str + "\t"); }

2.面向对象思路+集合

/** * @Auther: Xulu * @ProjectName: JavaDay12 * @Date: 2019/7/24 15:03 * @Description:面向对象思想实现斗地主发牌 */ public class Porker { // 扑克牌 private static Map<Integer,String> pokerMap = new HashMap<>(); // 牌的顺序 private static List<Integer> sort = new ArrayList<>(); /** * 买牌 */ public static void getPoker(){ // 1.1 花色 String[] flower = {"♠","♦","♣","♥"}; // 1.2 数字 String[] nums = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"}; int a = 1; // 组合 for(int i = 0 ; i < nums.length ; i ++){ for(int j = 0; j < flower.length ; j++){ String str = nums[i] + flower[j]; sort.add(a); pokerMap.put(a++,str); } } sort.add(a); pokerMap.put(a++,"小王"); sort.add(a); pokerMap.put(a,"大王"); System.out.println(pokerMap); System.out.println(sort); } /** * 洗牌 */ public static void shufflePoker(){ Collections.shuffle(sort); System.out.println(sort); } /** * 发牌 */ public static void deal(List<Integer> player1,List<Integer> player2, List<Integer> player3,List<Integer> floor){ for(int i = 0; i < sort.size(); i++){ // 前三张作为底牌抽出 if(i < 3){ floor.add(sort.get(i)); }else if(i % 3 == 0){// player1 player1.add(sort.get(i)); }else if(i % 3 == 1){// player2 player2.add(sort.get(i)); }else if(i % 3 == 2){// player3 player3.add(sort.get(i)); } } // 排序+看牌 System.out.println("玩家1:"); showPoker(player1); System.out.println("玩家2:"); showPoker(player2); System.out.println("玩家3:"); showPoker(player3); System.out.println("底牌:"); showPoker(floor); } /** * 排序+看牌 * @param player */ private static void showPoker(List<Integer> player) { Collections.sort(player); for(int i = 0 ; i < player.size();i++){ String str = pokerMap.get(player.get(i)); System.out.print(str + "\t"); } System.out.println(); } } public static void main(String[] args) { List<Integer> player1 = new ArrayList<>(); List<Integer> player2 = new ArrayList<>(); List<Integer> player3 = new ArrayList<>(); List<Integer> floor = new ArrayList<>(); // 买 Porker.getPoker(); // 洗牌 Porker.shufflePoker(); // 发牌 Porker.deal(player1,player2,player3,floor); }

以上为集合实现斗地主的常规做法,利用map存放牌的排序位置以及花色,利用list集合sort进行记录当前牌的排序情况。学生在课后提出可以直接使用List集合完成顺序记录以及牌面数字花色记录,但这种方案在前面操作是没有问题的,当进行到需要对发好的牌进行排序时会有问题。


最新回复(0)