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

Java 實作撲克牌發牌演算法完整指南

     編輯:Java 相關知識

撲克牌發牌演算法是棋牌類遊戲開發中的核心基礎演算法,掌握這項技術對於遊戲開發者來說至關重要。本文將詳細介紹一種高效且實用的發牌演算法實作方式,包含完整的 Java 程式碼範例。

撲克牌編號規則設計

首先我們需要為每張撲克牌建立唯一的編號系統。這裡採用雙副牌(含大小王)共 108 張牌的編號規則:

  • 紅桃:1-13(從小到大)
  • 方塊:14-26
  • 黑桃:27-39
  • 梅花:40-52
  • 小王:53
  • 大王:54

因為使用雙副牌,所以每個編號會出現兩次,總共 108 張牌。

核心演算法邏輯

演算法採用「洗牌後依序發牌」的策略,具體步驟如下:

  1. 初始化一個包含 108 個數字的陣列,依照上述編號規則填充
  2. 使用隨機數生成器,每次從剩餘牌堆中隨機抽取一張牌
  3. 將抽取的牌分配給對應玩家
  4. 將已發出的牌從牌堆中移除(透過陣列元素交換實現 O(1) 移除)
  5. 重複上述過程直到完成發牌

Java 完整程式碼實作

import java.util.*;

public class PokerDealer {
    public static void main(String[] args) {
        // 儲存 108 張牌的陣列
        int[] deck = new int[108];
        // 四位玩家,每人 25 張牌
        int[][] players = new int[4][25];
        int remainingCards = 108;
        Random random = new Random();

        // 初始化牌堆(雙副牌)
        for (int i = 0; i < deck.length; i++) {
            deck[i] = (i + 1) % 54;
            if (deck[i] == 0) deck[i] = 54; // 處理大小王編號
        }

        // 發牌邏輯:每輪給 4 位玩家各發 1 張,共 25 輪
        for (int round = 0; round < 25; round++) {
            for (int player = 0; player < 4; player++) {
                int randomIndex = random.nextInt(remainingCards);
                players[player][round] = deck[randomIndex];
                // 將最後一張牌移到被抽取的位置,實現 O(1) 移除
                deck[randomIndex] = deck[remainingCards - 1];
                remainingCards--;
            }
        }

        // 輸出玩家手牌
        for (int i = 0; i < 4; i++) {
            System.out.print("玩家 " + (i+1) + ": ");
            for (int card : players[i]) {
                System.out.print(card + " ");
            }
            System.out.println();
        }

        // 輸出底牌(剩餘 8 張)
        System.out.print("底牌: ");
        for (int i = 0; i < 8; i++) {
            System.out.print(deck[i] + " ");
        }
        System.out.println();
    }
}

演算法優勢分析

此演算法採用 Fisher-Yates 洗牌變體,具有以下優點:

  • 時間複雜度 O(n):每張牌只需處理一次
  • 空間複雜度 O(1):原地交換,無需額外陣列
  • 真隨機分佈:每種排列組合出現機率均等
  • 記憶體效率高:適合嵌入式或行動裝置環境

擴展應用建議

實際專案中可考慮以下增強:

  • 加入牌型邏輯判斷(順子、炸彈等)
  • 實作多執行緒安全的發牌器
  • 支援自定義玩家數量與發牌張數
  • 整合持久化儲存對局記錄

這個演算法不僅適用於撲克遊戲,同樣可擴展至麻將、大老二等各類棋牌遊戲開發中,是遊戲開發者必備的基礎工具。

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