模擬鬥地主真人線上發牌
阿新 • • 發佈:2018-11-03
模擬鬥地主真人線上發牌
前言
要鬥地主先得有牌吧,沒牌鬥個雞毛,所以先讓廠家生產一副撲克牌。然後呢,哥們三個今天想鬥地主了,你得去超市買一副 嶄新 的撲克牌吧。這樣就可以進入玩耍階段了,先得洗牌,後摸牌,在把最後三張牌壓箱底,好了這樣就開始展現技藝了.....
我們現在用java集合的知識模擬鬥地主的發牌,和上述流程是一模一樣的。
設計過程
造一副撲克
一副撲克有54張牌,有四種花色,從A到K,還有大小王。先定義一個nums集合來裝撲克牌的數字,然後定義一個color集合裝四種花色,保證它們的新增順序選擇ArrayList集合
//用num表示撲克牌中的數字 ArrayList<String> nums = new ArrayList<>(); Collections.addAll(nums,"A","2","3","4","5","6","7","8","9","10","J","Q","K"); //用color表示撲克牌中的花色 ArrayList<String> colors = new ArrayList<>(); Collections.addAll(colors, "紅桃","梅花","黑桃","方片");
把花色和數字拼裝在一起,需要一個Map來表示一個關係對,同時給每張牌定個序號,後面直接可以用序號操作牌
//製造一副撲克牌(將數字和花色組合起來) Map<Integer,String> cards = new HashMap<>(); int index = 0; ///給每個撲克牌定個序號index for(String number : nums){ for(String color : colors){ cards.put(index++, color + number); } }
買一副嶄新的撲克牌
新的撲克牌肯定是按照序號排好的,所以我們把序號裝在一個集合中
//買一副新的撲克牌來玩耍 ArrayList<Integer> card = new ArrayList<>(); for(int i = 0; i <= 53; i++){//初始化牌的序號 card.add(i); }
洗牌
洗牌也就是把card集合中的所儲存的序號打亂,集合的工具類Collections中有一個方法shuffle可以完成
Collections.shuffle(card);
發牌
這時候肯定得有三個玩家啊,我們建立是三個玩家,玩家其實也就是撲克牌序號的一個引用,為了簡單建立一個Integer型別的,另外,為了把牌到時候可以拍個序,這時候可以用到TreeSet集合儲存,它預設自然排序。底牌也可以這樣儲存。
TreeSet<Integer> player1 = new TreeSet<>(); TreeSet<Integer> player2 = new TreeSet<>(); TreeSet<Integer> player3 = new TreeSet<>(); //拿出三張牌當做底牌 TreeSet<Integer> itcards = new TreeSet<>();
發牌演算法就是用牌的序號模上3,等於0發給一個人,等於1發給另外一個人,把最後三張當做底牌
for(int i = 0; i < card.size(); i++){ if(i >= card.size() - 3){//把後三張牌當做底牌 itcards.add(card.get(i)); }else if(i % 3 == 0){ player1.add(i); }else if(i % 3 == 1){ player2.add(card.get(i)); }else{ player3.add(card.get(i)); } }
展示牌
我們可以看到,其實玩家和底牌也就是打亂的54個序號組成的,並且一個序號對應的是一張撲克牌,所以玩家其實就相當於是撲克牌Map中的key,而value就是撲克牌的名字了。所以遍歷玩家這個TreeSet集合,找到Map中的key,根據key很容易找到value。
原始碼
public class CardsGame {
public static void main(String[] args) {
//用num表示撲克牌中的數字
ArrayList<String> nums = new ArrayList<>();
Collections.addAll(nums,"A","2","3","4","5","6","7","8","9","10","J","Q","K");
//用color表示撲克牌中的花色
ArrayList<String> colors = new ArrayList<>();
Collections.addAll(colors, "紅桃","梅花","黑桃","方片");
//製造一副撲克牌(將數字和花色組合起來)
Map<Integer,String> cards = new HashMap<>();
int index = 0; ///給每個撲克牌定個序號index
for(String number : nums){
for(String color : colors){
cards.put(index++, color + number);
}
}
//再把大小王加上,一副完整的撲克就ok了
cards.put(index++, "大王");
cards.put(index++, "小王");
//買一副新的撲克牌來玩耍
ArrayList<Integer> card = new ArrayList<>();
for(int i = 0; i <= 53; i++){//初始化牌的序號
card.add(i);
}
//愉快的玩耍
//洗牌
Collections.shuffle(card);
TreeSet<Integer> player1 = new TreeSet<>();
TreeSet<Integer> player2 = new TreeSet<>();
TreeSet<Integer> player3 = new TreeSet<>();
//拿出三張牌當做底牌
TreeSet<Integer> itcards = new TreeSet<>();
//發牌
for(int i = 0; i < card.size(); i++){
if(i >= card.size() - 3){//把後三張牌當做底牌
itcards.add(card.get(i));
}else if(i % 3 == 0){
player1.add(i);
}else if(i % 3 == 1){
player2.add(card.get(i));
}else{
player3.add(card.get(i));
}
}
//排序並列印每個人得到的牌
print("張三",player1,cards);
print("李四",player2,cards);
print("王五",player3,cards);
print("底牌",itcards,cards);
}
private static void print(String name, TreeSet<Integer> player, Map<Integer, String> cards) {
System.out.print(name + ": ");
//得到三個玩家的牌和底牌
for(Integer index : player){
String result = cards.get(index);
System.out.print(result + " ");
}
System.out.println( );
}
}