鬥地主系列之洗牌和發牌

2021-06-22 14:17:34 字數 2293 閱讀 4334

大家都知道,鬥地主的一副牌有54張,三位玩家,每位17張牌,3張底牌(17*3+3 = 54)。

所以,我們定義乙個list:

listcards= new arraylist();

cards.get(0)-----cards.get(12)        方塊3,方塊4---------方塊k,方塊a,方塊2

cards.get(13)-----cards.get(25)     梅花3,梅花4---------梅花k,梅花a,梅花2

cards.get(26)-----cards.get(38)      紅心3,紅心4---------紅心k,紅心a,紅心2

cards.get(39)-----cards.get(51)     黑桃3,黑桃4---------黑桃k,黑桃a,黑桃2

cards.get(52), cards.get(53)         小王,大王

我們要做的是:

(1)先給listcards 初始化54張牌,

(2)然後,洗牌,其核心思想,是把這54張牌隨機交換二張牌的位置,將牌完全洗亂.

(3)再按照一定的發牌策略,將這54張牌,分別給三位玩家發17張牌,再留3張底牌。

對54張牌初始化,比較簡單,在這就不介紹了,下面主要介紹洗牌和發牌。

洗牌的核心思想:就是把牌隨機的洗亂,以達到完全隨機的狀態。

(1)

(2)

大家應該心裡有數了,應該怎麼做了。

下面是我選擇的方法,這個方法主要是可以方便以後在服務端來配置交換次數。

private void xipai(list cards) {

// todo auto-generated method stub

//洗牌,交換swap_count次 ,swap_count,我們後面可以在服務端配置

for(int i = 0;i

我們看了上面的二篇博文,覺得依照一定的發牌策略和規則,分別給三個玩家發17張,最後3張為底牌就ok了。呵呵,其實一開始我也是這麼做的,後來,想一想,我們為什麼要按一定的發牌策略和規則發牌呢?是不是主要還是為了隨機呢?好,如果我們在洗牌時,做到了足夠隨機,那麼我們是不是就可以這樣發牌,我們把1到17張牌發給玩家1,18到34張牌發給玩家2,35到51張牌發給玩家3,最後三張做底牌。答案當然是可以的,那們發牌就簡單了。

但是,各位,我們是不是還會有這樣的要求:

(1)給玩家自己發一手好牌(如幾個炸彈,幾張大牌),(大牌為(4個2,2個王))

(2)設定幾個炸彈,隨機的發給三個玩家

(3)隨機的給三位玩家發牌

(4)在特定時候,減少炸彈的出現概率,大牌同時出現的概率。

並且要求這些引數,可以在伺服器配置。有沒有好的發牌方法呢:

解決方案:

(1)設定好牌炸彈list(goodbombslist),好牌大牌list(goodkeypaislist),根據要求分別給goodbombslist,和goodkeypaislist分配牌,並發給玩家自己。

(2)設定炸彈list(bombslist),根據要求給bombslist賦值(這個要注意設定炸彈的數目,不能太多,炸彈為1,2,3,4,5,6為佳),然後隨機的把這些炸彈發給三個玩家,發牌的時候要注意隨時判斷玩家手中的牌是否還能分配炸彈。

(3)隨機把總共54張牌洗亂得到allcardslist,再從allcardslist中將goodbombslist,goodkeypaislist,bombslist中的牌都刪除,再把剩下的牌發給三個玩家和底牌。

(4)如果在特定時條件下,調整減少炸彈和幾張大牌同時出現的概率。

並且這些概率值,我們都採用成員變數的方式,提供set和get方法,以方便後面的設定。

因為我的需求,我說一下我的解決方案吧:

(1)給玩家自己發好牌:

設定好牌炸彈list(goodbombslist),好牌大牌list(goodkeypaislist),根據要求分別給goodbombslist,和goodkeypaislist分配牌,並發給玩家自己。

隨機把總共54張牌洗亂得到allcardslist,再從allcardslist中將goodbombslist,goodkeypaislist中的牌都刪除,再把剩下的牌發給三個玩家和底牌。

(2)完全隨機發牌:

隨機把總共54張牌洗亂得到allcardslist,再把allcardslist的牌完全隨機的發給三個玩家和底牌。

如果在特定時條件下,調整減少炸彈和幾張大牌同時出現的概率。

1. 鬥地主演算法的設計與實現

2. 棋牌遊戲開發

模擬鬥地主洗牌和發牌

分析 a 建立乙個牌盒 b 裝牌 c 洗牌 d 發牌 e 看牌 public class test system.out.println public static void main string args 定義乙個點陣列 string numbers for string c colors ar...

集合訓練之鬥地主洗牌發牌實現

2.1 任務功能流程 2.2 造牌功能分析 容器準備 建立集合容器,用於存放撲克牌 hashmappokermap 撲克牌存放容器,key保證唯一性,hashmap便於索引 arraylistpokerlist 撲克牌索引標誌,用於實現隨機取牌 發牌 造牌元素準備 建立陣列,儲存撲克牌組合元素,用於...

鬥地主發牌

鬥地主的發牌 a 鬥地主的發牌 實現模擬鬥地主的功能 1.組合牌 2.洗牌 3.發牌 4.看牌 public class doudizhu 定義4個花色陣列 string colors 定義整數變數,作為鍵出現 int index 2 遍歷陣列,花色 點數的組合,儲存到map集合 for strin...