该实现 主要是得到一幅乱序的牌,然后发牌就容易多了,对于花色,在eclipse中还可以将方块和红心用System.err.print将其变红色输出,效果会更好些。
有时候还是得到的结果还是乱的,但是大部分是正常的,这个很无奈,找不到bug
public class LandLord {
// 玩家集合
static List<String> player1 = new ArrayList<>();
static List<String> player2 = new ArrayList<>();
static List<String> player3 = new ArrayList<>();
// 底牌
static List<String> lowCard = new ArrayList<>();
static String[] num = { "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2" };
static String[] flower = { "♦", "♣", "♥", "♠" };
static String[] joker = { "大王", "小王" };
// 地主牌
static String c;
// 得到一幅无序的牌
public static List<String> getAllCard() {
List<String> list = new ArrayList<>();
for (int i = 0; i < num.length; i++) {
for (int j = 0; j < flower.length; j++) {
list.add(flower[j] + num[i]);
}
}
list.add(joker[0]);
list.add(joker[1]);
List<String> list2 = new ArrayList<>();
int[] a = getDisOrder();
for (int i = 0; i < a.length; i++) {
list2.add(list.get(a[i]));
}
return list2;
}
// 得到一份随机不重复的乱序数组,用以把牌打乱
public static int[] getDisOrder() {
int[] a = new int[54];
for (int i = 0; i < a.length; i++) {
a[i] = i;
}
int index;
for (int i = 54; i > 0; i--) {
index = (int) (Math.random() * i);
swap(a, index, i - 1);
}
return a;
}
// 交换数组中两张牌的位置
public static void swap(int[] a, int x, int y) {
int temp = a[x];
a[x] = a[y];
a[y] = temp;
}
// 洗牌
public static void shuffle() {
List<String> list = getAllCard();
c = list.get((int) (Math.random() * 51));
int size = list.size();
for (int i = 0; i < size - 3; i++) {
if (i % 3 == 0) {
player1.add(list.get(i));
} else if (i % 3 == 1) {
player2.add(list.get(i));
} else {
player3.add(list.get(i));
}
}
lowCard.add(list.get(size - 2));
lowCard.add(list.get(size - 3));
lowCard.add(list.get(size - 4));
}
// 看牌
public static void showCard(List<String> list) {
boolean flag = false;
for (String str : list) {
if (str.startsWith(flower[0]) || str.startsWith(flower[2]) || str.startsWith(joker[0])) {
System.err.print(str + " ");
} else {
System.out.print(str + " ");
}
if (str.equals(c)) {
flag = true;
}
}
if (flag) {
System.err.print("地主");
}
}
// 按顺序显示
public static List<String> inOrder(List<String> list) {
List<String> list1 = new ArrayList<String>();
String temp;
for (int i = 0; i < 13; i++) {
for (int j = 0; j < list.size(); j++) {
temp = list.get(j);
if (temp.endsWith(num[i])) {
list1.add(list.get(j));
}
}
}
for (int j = 0; j < list.size(); j++) {
temp = list.get(j);
if (temp.endsWith(joker[0]) || temp.endsWith(joker[1])) {
list1.add(list.get(j));
}
}
return list1;
}
public static void main(String[] args) {
Map<String, List<String>> map = new HashMap<String, List<String>>();
shuffle();
System.out.print("player1: ");
player1 = inOrder(player1);
showCard(player1);
System.out.println();
System.out.print("player2: ");
player2 = inOrder(player2);
showCard(player2);
System.out.println();
System.out.print("player3: ");
player3 = inOrder(player3);
showCard(player3);
System.out.println();
System.out.print("lowCard: ");
showCard(lowCard);
System.out.println();
System.out.println("地主牌: " + c);
}
}