Java 簡單實現鬥地主創建牌組與隨機發牌、看牌

 今天閒着無聊,用基礎的隨機數,寫一個簡單的鬥地主發牌,給需要用到的同學做一個參考。

package com.linlx.Individual.service;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;

public class GameTest {

	public static void main(String[] args) {
		GameTest a = new GameTest();
		a.createCards();
	}
	
	/**
	 * createCards(創建牌池) 
	 * void
	 * @exception 
	 * @since  1.0.0
	*/
	public void createCards(){
		//創建牌池集合
		List<String> cardsList = new ArrayList<>();
		
		//生成各個花色牌組
		for (int i = 0; i <= 4; i++) {
			switch (i) {
				case 0:
					addCardsList("♠",13,cardsList);
					break;
				case 1:
					addCardsList("♣",13,cardsList);
					break;
				case 2:
					addCardsList("♥",13,cardsList);
					break;
				case 3:
					addCardsList("◇",13,cardsList);
					break;
				default:
					cardsList.add("大王");
					cardsList.add("小王");
					break;
			}
		}
		
		/**
		 * 以下部分爲顯示牌組,可要可不要
		 * */
		System.out.println("牌組長度:"+cardsList.size());
		Iterator<String> it = cardsList.iterator();
		System.out.print("牌池:");
		while (it.hasNext()) {
			System.out.print(it.next()+" ");
		}
		
		//調用發牌方法
		giveOutCards(cardsList);
	}
	
	/**
	 * addCardsList(生成各個花色牌組)
	 * @param key
	 * @param len
	 * @param cardsList 
	 * void
	 * @exception 
	 * @since  1.0.0
	*/
	public void addCardsList(String key,int len,List<String> cardsList){
		//開始生成花色牌組,並判斷生成A,J,Q,K等特殊牌組
		for (int j = 0; j < len; j++) {
			switch (j) {
			case 0:
				cardsList.add(key+"A");
				break;
			case 10:
				cardsList.add(key+"J");
				break;
			case 11:
				cardsList.add(key+"Q");
				break;
			case 12:
				cardsList.add(key+"K");
				break;
			default:
				cardsList.add(key+(j+1));
				break;
			}
		}
	}
	
	/**
	 * giveOutCards(發牌)
	 * @param cardsList 
	 * void
	 * @exception 
	 * @since  1.0.0
	*/
	public void giveOutCards(List<String> cardsList){
		//創建玩家牌池集合
		List<Set<String>> gamePlayerCards = new ArrayList<>();
		
		//循環出三個玩家牌組
		for (int i = 0; i < 3; i++) {
			//創建玩家牌組
			Set<String> setCar = new HashSet<>();
			//開始循環沒法發牌十七張
			for (int j = 0; j < 17; j++) {
				boolean flag = false;
				while (flag == false) {
					//生成一個從54-1的隨機數,並減1,稍後作爲獲取牌池集合的下標
					int index = (int)Math.round(Math.random()*cardsList.size()+1)-1;
					//判斷該次想要獲取的牌是否是是已被髮出
					if(index < cardsList.size()&&cardsList.get(index)!=null){
						//將拿到的牌加入至玩家牌組
						setCar.add(cardsList.get(index));
						//刪除牌池中的牌
						cardsList.remove(index);
						//賦值,跳出循環
						flag = true;
					}
				}
			}
			
			//添加至玩家牌池
			gamePlayerCards.add(setCar);
		}
		
		/**
		 * 以下部分爲顯示牌組,可要可不要
		 * */
		System.out.print("\n地主牌:");
		for (String card : cardsList) {
			System.out.print(card+" ");
		}
		System.out.println();
		for (Set<String> cards : gamePlayerCards) {
			Iterator<String> it = cards.iterator();
			while (it.hasNext()) {
				System.out.print(it.next()+" ");
			}
			System.out.println(" 牌組長度:"+cards.size());
		}
	}

}

輸出:

牌池:♠A ♠2 ♠3 ♠4 ♠5 ♠6 ♠7 ♠8 ♠9 ♠10 ♠J ♠Q ♠K ♣A ♣2 ♣3 ♣4 ♣5 ♣6 ♣7 ♣8 ♣9 ♣10 ♣J ♣Q ♣K ♥A ♥2 ♥3 ♥4 ♥5 ♥6 ♥7 ♥8 ♥9 ♥10 ♥J ♥Q ♥K ◇A ◇2 ◇3 ◇4 ◇5 ◇6 ◇7 ◇8 ◇9 ◇10 ◇J ◇Q ◇K 大王 小王 
地主牌:♠Q ♣5 ◇10 
♥J ◇4 ♣2 ♣K ◇Q ♠J ♠10 ◇2 ♥9 ♣8 ♠6 ◇7 ♥5 ♥7 ♠3 ♥A ♠8  牌組長度:17
♣J ♠A ◇J ♥Q ♥2 ♣Q ♥3 ◇6 ♠K ♠4 ♣7 ◇8 ♣4 ♠2 ♣6 ♣A ♠9  牌組長度:17
◇K ♥K ◇3 ◇5 ♥4 大王 ♠5 ♣9 ♣10 ♠7 ♥10 ♣3 ♥6 ◇9 ♥8 小王 ◇A  牌組長度:17

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章