首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++ 斗地主發牌算法:保證炸彈的隨機分配

     編輯:關於C++

需求

54 張牌 (含大小王),3 位玩家各 17 張,底牌 3 張。要求:每局至少一名玩家擁有炸彈 (四張同點數),且發牌隨機。

算法設計

  1. 牌面編碼:用 0x01~0x0D 表示 A~K 四花色,0x0E/0x0F 表小/大王。同點數牌間隔 16 (0x10)。
  2. 預留炸彈基數:從 13 個點數 (A~K) 中隨機選 bomb_num (1~3) 個作為炸彈基數,其餘點數作為普通牌。
  3. 分配炸彈給玩家:隨機決定每位玩家獲得炸彈數 b1,b2,b3 (和為 bomb_num),從預留基數中取出對應炸彈 (4 張同點數) 發給玩家。
  4. 發放剩餘牌:將普通牌 (含王) 打亂,按順序填補玩家手牌至 17 張,最後 3 張為底牌。

代碼框架

// 牌陣列:0x01=A♦, 0x11=A♣, 0x21=A♥, 0x31=A♠, ... 0x0E=小王, 0x0F=大王
int deck[54] = {1,17,33,49, 2,18,34,50, ... , 14,15};

vector bomb_base; // 預留炸彈基數 (點數索引 0~12)
vector normal_cards; // 其餘牌

// 1. 洗牌點數索引
vector idx(13); iota(idx.begin(), idx.end(), 0);
random_shuffle(idx.begin(), idx.end());

// 2. 選炸彈基數
int bomb_num = rand()%3 + 1; // 1~3
for (int i=0; i player[3], bottom;
int bomb_ptr = 0, norm_ptr = 0;
for (int p=0; p<3; ++p) {
    for (int i=0; i

關鍵點

  • 點數基數分離:炸彈由 4 張同點數組成,預留基數確保炸彈完整性。
  • 隨機性:點數順序洗牌、炸彈數隨機分配、普通牌洗牌、發牌順序隨機。
  • 王牌不參與炸彈 (除非規則允許王炸),作為普通牌發放。

總結

發牌算法核心是「預留炸彈基數 + 隨機分配 + 填充普通牌」。通過分離點數與花色,確保炸彈完整且分布隨機,滿足遊戲平衡性需求。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved