前言
本文实现了斗地主的随机发牌机理,前驱知识需掌握JavaSE,Java集合的简单使用
分析
掌握了编程语言的使用,以及相应的随机数生成语法,来做这样一个发牌机制不是什么难事。在这个小项目中,我重点学习如何将一个项目具体化,分为哪些步骤。
- 买牌:需要分别花色以及牌号,进行嵌套循环,全排列,生成一副牌,并用键值对map储存
- 洗牌+发牌:洗牌用到的是Collections类中的shuffle方法。随后我们洗牌后的结果除以3取余,分发给3位玩家。这里在实现的时候,我思考了一个问题,为什么不将实际的牌号进行转换后直接存储呢,而是等到了下一步一次转换?
其实这本来是一个很容易想明白的问题,过程中转换53次还是最后一次性转换3次,在计算机的角度从时间效率上来讲其实没有差别。但是我们考虑到程序的分层实现,封装的思想,所以要将这分为两步考虑 - 看牌:将牌号转换为扑克,这里我们封装了一个printPokers方法,将牌号对应到了键值对的扑克
代码
package com.codeslogan.collection;
import java.util.*;
public class PokerTest {
public static void main(String[] args) {
String[] colors = {"♠", "♣", "♡", "♢"}; //花色
String[] nums = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"}; //牌号
Map<Integer, String> pokers = new HashMap<>(); //记录牌号+花色组合
List<Integer> list = new ArrayList<>(); //牌序,用于打乱发牌
List<Integer> player1 = new ArrayList<>(); //玩家
List<Integer> player2 = new ArrayList<>();
List<Integer> player3 = new ArrayList<>();
List<Integer> cards = new ArrayList<>(); //底牌
//1.买牌,生成54张不同花色的牌
buyPokers(colors, nums, pokers, list);
//2.发牌
Collections.shuffle(list);
for (int i = 0; i < list.size(); i++) {
Integer value = list.get(i);
if (i >= list.size()-3) {
cards.add(value);
} else if (i % 3 == 0) {
player1.add(value);
} else if (i % 3 == 1) {
player2.add(value);
} else if (i % 3 == 2) {
player3.add(value);
}
}
//3.看牌,将牌号转换为实际牌号+花色
System.out.println("player1:" + printPokers(player1, pokers));
System.out.println("player2:" + printPokers(player2, pokers));
System.out.println("player3:" + printPokers(player3, pokers));
System.out.println("cards:" + printPokers(cards, pokers));
}
public static void buyPokers(String[] colors, String[] nums, Map<Integer, String> pokers, List<Integer> list) {
int cnt = 0;
for (String num : nums) { //全排列
for (String color : colors) {
String poker = color + num;
pokers.put(cnt, poker);
list.add(cnt);
cnt++;
}
}
pokers.put(cnt, "小王");
list.add(cnt++);
pokers.put(cnt, "大王");
list.add(cnt);
}
public static String printPokers(List<Integer> player, Map<Integer, String> pokers) {
Collections.sort(player); //将牌从小到大排序
String myPokers = "";
for (Integer integer : player) {
String s = pokers.get(integer);
myPokers = myPokers + s + " ";
}
myPokers.trim();
return myPokers;
}
}