我們都知道一副撲克牌有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<String> pokers =new ArrayList<String>();
//給牌盒中添加元素
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<String> zhangsan = new ArrayList<String>();
ArrayList<String> lisi= new ArrayList<String>();
ArrayList<String> wangwu= new ArrayList<String>();
ArrayList<String> dipai= new ArrayList<String>();
//發牌
for (int i = ; i < pokers.size(); i++) {
if (i>=pokers.size()-) {
dipai.add(pokers.get(i));
}else if (i%==) {
zhangsan .add(pokers.get(i));
}else if (i%==) {
lisi.add(pokers.get(i));
}else if (i%==) {
wangwu.add(pokers.get(i));
}
}
//看牌
lookPoker("張三",zhangsan);
lookPoker("李四",lisi);
lookPoker("王五",wangwu);
lookPoker("底牌",dipai);
}
private static void lookPoker(String name, ArrayList<String> arr) {
System.out.print(name+"的牌是 :");
for (int i = ; 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<Integer, String> hs = new HashMap<Integer, String>();
// 建立List集合存儲索引,用于洗牌
ArrayList<Integer> indexs = new ArrayList<Integer>();
// 存儲元素
// 給牌盒中添加元素
String[] colors = { "♥", "♠", "♣", "♦" };
// 建立點數
String[] numbers = { "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q",
"K", "A", "2" };
//定義索引
int index = ;
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<Integer> zhangsan = new TreeSet<Integer>();
TreeSet<Integer> lisi = new TreeSet<Integer>();
TreeSet<Integer> wangwu = new TreeSet<Integer>();
TreeSet<Integer> dipai = new TreeSet<Integer>();
for (int i = ; i < indexs.size(); i++) {
if (i>=indexs.size()-) {
dipai.add(indexs.get(i));
}else if (i%==) {
zhangsan.add(indexs.get(i));
}else if (i%==) {
lisi.add(indexs.get(i));
}else if (i%==) {
wangwu.add(indexs.get(i));
}
}
//看牌
lookPoker("張三",zhangsan,hs);
lookPoker("李四",lisi,hs);
lookPoker("王五",wangwu,hs);
lookPoker("底牌",dipai,hs);
}
private static void lookPoker(String name, TreeSet<Integer> set,
HashMap<Integer, String> 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 大王
*/