我们都知道一副扑克牌有54张,3,4,5,6,7,8,9,10,J,Q,K分别有”♥”,”♠”,”♣”,”♦”四种花色,还有大王、小王。这就构成了一副完整的扑克牌,现在我们要模拟斗地主的洗牌,发牌,看牌,那么我们该怎么做呢?
首先一看到洗牌,就会想到Collections.shuffle(),所以我们应该先用集合创建一副牌,然后进行洗牌,再进行看牌,代码如下:
package com.edu01;
import java.util.ArrayList;
import java.util.Collections;
public abstract class PokerTest {
public static void main(String[] args) {
/**
* 斗地主:
* 1.创建一副牌
* 2.洗牌
* 3.发牌
* 4.看牌
*/
//创建一副牌
ArrayList pokers =new ArrayList();
//给牌盒中添加元素
String[] colors = {"♥","♠","♣","♦"};
//创建点数
String[] numbers = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"};
//将点数和花色进行拼接形成一副牌
for(String color:colors){
for(String number:numbers){
pokers.add(color+number);
}
}
pokers.add("大王");
pokers.add("小王");
//洗牌打印一下这副牌
Collections.shuffle(pokers);
//发牌,发给三个集合
ArrayList zhangsan = new ArrayList();
ArrayList lisi= new ArrayList();
ArrayList wangwu= new ArrayList();
ArrayList dipai= new ArrayList();
//发牌
for (int i = 0; i < pokers.size(); i++) {
if (i>=pokers.size()-3) {
dipai.add(pokers.get(i));
}else if (i%3==0) {
zhangsan .add(pokers.get(i));
}else if (i%3==1) {
lisi.add(pokers.get(i));
}else if (i%3==2) {
wangwu.add(pokers.get(i));
}
}
//看牌
lookPoker("张三",zhangsan);
lookPoker("李四",lisi);
lookPoker("王五",wangwu);
lookPoker("底牌",dipai);
}
private static void lookPoker(String name, ArrayList arr) {
System.out.print(name+"的牌是 :");
for (int i = 0; i < arr.size(); i++) {
System.out.print(arr.get(i)+" ");
}
System.out.println();
}
}
/** 张三的牌是 :♣A ♥J ♦9 ♠3 ♦5 ♠10 ♥9 ♦J ♦K ♥3 ♦A ♦Q ♦4 ♥Q ♥2 ♣4 ♥7
李四的牌是 :♦2 ♣9 ♥4 ♦10 ♣3 大王 ♣7 ♠2 ♣J ♦7 ♣Q ♠A ♣10 ♥8 ♠Q ♣8 ♠5
王五的牌是 :♠7 ♠6 ♥5 ♥10 小王 ♣5 ♠J ♣6 ♦8 ♦6 ♥A ♠8 ♦3 ♠4 ♥6 ♠K ♥K
底牌的牌是 :♣2 ♠9 ♣K
*/
但是这样看到的牌都是乱序的,不符合我们打牌的习惯,那么如何改进呢?联想一下,如果牌都存在String数组中,那么每张牌都有一个索引,如果可以对索引进行排序,同时与之对应的牌也就进行了排序,于是想到了:
创建牌时,用HashMap存储键值对,键是索引,值是扑克点数+花色
同时用ArrayList存储索引,用于洗牌;
然后发牌,发完牌,要保证牌有序,所以每个玩家拿到的牌(索引)分别存储到TreeSet集合;
看牌时,利用map,通过TreeSet排序存储的索引找到排好序的牌
package com.edu01;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.TreeSet;
public class PokerTest2 {
public static void main(String[] args) {
/**
* 发牌并排序: 1.创建Map集合,键存索引,值存点数(3-2从小到大) 2.洗牌,创建ArrayList集合,存储map集合的索引
* 3.发牌,发索引 4.看牌,根据每一个获取的索引取出对应的牌
*/
// 创建双列集合存储键值对元素
HashMap hs = new HashMap();
// 创建List集合存储索引,用于洗牌
ArrayList indexs = new ArrayList();
// 存储元素
// 给牌盒中添加元素
String[] colors = { "♥", "♠", "♣", "♦" };
// 创建点数
String[] numbers = { "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q",
"K", "A", "2" };
//定义索引
int index = 0;
for (String number : numbers) {
for (String color : colors) {
hs.put(index, (color+number));
indexs.add(index);
index++;
}
}
indexs.add(index);
hs.put(index, "小王");
index++;
indexs.add(index);
hs.put(index, "大王");
//洗牌(洗索引)
Collections.shuffle(indexs);
//发牌发索引,但是发完索引之后必须让索引有序
TreeSet zhangsan = new TreeSet();
TreeSet lisi = new TreeSet();
TreeSet wangwu = new TreeSet();
TreeSet dipai = new TreeSet();
for (int i = 0; i < indexs.size(); i++) {
if (i>=indexs.size()-3) {
dipai.add(indexs.get(i));
}else if (i%3==0) {
zhangsan.add(indexs.get(i));
}else if (i%3==1) {
lisi.add(indexs.get(i));
}else if (i%3==2) {
wangwu.add(indexs.get(i));
}
}
//看牌
lookPoker("张三",zhangsan,hs);
lookPoker("李四",lisi,hs);
lookPoker("王五",wangwu,hs);
lookPoker("底牌",dipai,hs);
}
private static void lookPoker(String name, TreeSet set,
HashMap map) {
//根据获取到的索引,取出牌
System.out.print(name+"的牌: ");
for (Integer index : set) {
System.out.print(map.get(index)+" ");
}
System.out.println();
}
}
/** 张三的牌: ♣4 ♠5 ♣6 ♠7 ♣8 ♦8 ♣9 ♦9 ♠J ♦J ♥Q ♠Q ♦Q ♥K ♦K ♥2 小王
李四的牌: ♦3 ♥4 ♠4 ♦4 ♥5 ♦5 ♠6 ♣7 ♠8 ♥10 ♠10 ♦10 ♣J ♠K ♣A ♠2 ♣2
王五的牌: ♥3 ♠3 ♣3 ♣5 ♥6 ♦6 ♥7 ♥8 ♥9 ♠9 ♣10 ♥J ♣Q ♣K ♥A ♦A ♦2
底牌的牌: ♦7 ♠A 大王
*/