首頁 > 軟體

Java模擬實現撲克牌洗牌和發牌的範例程式碼

2022-09-26 14:05:58

一. 需求

設計一副新的的撲克牌, 4個花色(♥, ♠, ♦, ♣)對應 1 到 13 , 不算大小王一共52張牌 ; 然後將撲克牌隨機打亂順序 , 最後實現三個人進行摸牌 , 三個人輪流進行摸牌(每次摸一張牌) , 最終每個人手裡有五張牌

二. 全域性程式碼

poker.java

public class poker {
    private String suit;//花色
    private int num;//數位

    public poker(String suit, int num) {
        this.suit = suit;
        this.num = num;
    }

    public String getSuit() {
        return suit;
    }

    public void setSuit(String suit) {
        this.suit = suit;
    }

    public int getNum() {
        return num;
    }

    public void setNum(int num) {
        this.num = num;
    }

    @Override
    public String toString() {
        return suit+" "+num;
    }
}

pokers.java

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class pokers {
    public static final String[] SUITS = {"♠","♥","♣","♦"};
    //買一副撲克牌
    public static List<poker> buypokers() {
        List<poker> pokerList = new ArrayList<>();
        for (int i = 0; i < 4; i++) {
            for (int j = 1; j <= 13; j++) {
                pokerList.add(new poker(SUITS[i],j));
            }
        }
        return pokerList;
    }

    //洗牌
    public static void shuffle(List<poker> pokerList) {
        Random random = new Random();
        for (int i = pokerList.size()-1; i > 0; i--) {
            int index = random.nextInt(i);
            swap(pokerList, i, index);
        }
    }
    //交換
    public static void swap (List<poker> pokerList, int i, int index) {
        poker tmp = pokerList.get(i);
        pokerList.set(i, pokerList.get(index));
        pokerList.set(index, tmp);
    }

    public static void main(String[] args) {
        List<poker> pokerList = buypokers();
        System.out.println("新牌:" + pokerList);
        shuffle(pokerList);
        System.out.println("洗牌:" + pokerList);

        //揭牌 3個人 每個人輪流揭5張牌

        //用來存放三個人揭起來的牌
        List<poker> hand1 = new ArrayList<>();
        List<poker> hand2 = new ArrayList<>();
        List<poker> hand3 = new ArrayList<>();

        List<List<poker>> hand = new ArrayList<>();
        hand.add(hand1);
        hand.add(hand2);
        hand.add(hand3);

        for (int i = 0; i < 5; i++) {
            for (int j = 0; j < 3; j++) {
                //確定是誰在摸牌
                List<poker> tmpHand = hand.get(j);
                tmpHand.add(pokerList.remove(0));
            }
        }

        //輸出每個人的牌
        for (int i = 0; i < hand.size(); i++) {
            System.out.println("第"+(i+1)+"個人的牌是"+hand.get(i));
        }

        System.out.println("剩餘的牌有"+pokerList);
    }
}

執行結果 :

三. 設計分析

1. 設計一張撲克牌

定義一個類 , 類中欄位包含一張撲克牌的 花色 和 數位 ,並給出構造方法和其他相關存取欄位的方法

public class poker {
    private String suit;//花色
    private int num;//數位

    public poker(String suit, int num) {
        this.suit = suit;
        this.num = num;
    }

    public String getSuit() {
        return suit;
    }

    public void setSuit(String suit) {
        this.suit = suit;
    }

    public int getNum() {
        return num;
    }

    public void setNum(int num) {
        this.num = num;
    }

    @Override
    public String toString() {
        return suit+" "+num;
    }
}

2. 得到一副新牌

定義一個存放4種花色的陣列 , 建立一個順序表來存放獲取到的撲克牌 , 通過兩層迴圈得到52張撲克牌 , 外層迴圈4次每次得到一種花色 , 內層迴圈13次得到每種花色的13個值

public static final String[] SUITS = {"♠","♥","♣","♦"};
    //買一副撲克牌
public static List<poker> buypokers() {
    List<poker> pokerList = new ArrayList<>();
    for (int i = 0; i < 4; i++) {
        for (int j = 1; j <= 13; j++) {
            pokerList.add(new poker(SUITS[i],j));
        }
    }
    return pokerList;
}

3. 洗牌

順序表中有52張牌 , 也就是52個元素 , 從最後一個元素開始迴圈 , 利用 Random 這個類中的方法生成1到元素下標之間的亂數 , 將生成亂數位置的元素和迴圈中的那個元素進行交換 .

    //洗牌
    public static void shuffle(List<poker> pokerList) {
        Random random = new Random();
        for (int i = pokerList.size()-1; i > 0; i--) {
            int index = random.nextInt(i);
            swap(pokerList, i, index);
        }
    }
    //交換
    public static void swap (List<poker> pokerList, int i, int index) {
        poker tmp = pokerList.get(i);
        pokerList.set(i, pokerList.get(index));
        pokerList.set(index, tmp);
    }

4. 發牌

定義三個順序表分存放三個人摸起來的牌 , 將這三個順表再作為元素放入另一個新的順序表中 , 好方便執行迴圈摸牌的操作 , 然後還是通過兩層迴圈去摸牌 , 三個人每人摸一張 , 摸5輪 , 所以外層迴圈執行5次 ; 內層迴圈3三次 , 每次表示一個人摸去一張牌 ;

其實每次摸牌就就是從撲克牌所在順序表中刪除第一個元素 , 所以每次摸牌存取的都是順序表中的第一個元素 , remove方法返回的是刪除的元素

//用來存放三個人揭起來的牌
List<poker> hand1 = new ArrayList<>();
List<poker> hand2 = new ArrayList<>();
List<poker> hand3 = new ArrayList<>();

List<List<poker>> hand = new ArrayList<>();
hand.add(hand1);
hand.add(hand2);
hand.add(hand3);

for (int i = 0; i < 5; i++) {
    for (int j = 0; j < 3; j++) {
        //確定是誰在摸牌
        List<poker> tmpHand = hand.get(j);
        tmpHand.add(pokerList.remove(0));
    }
}

以上就是Java模擬實現撲克牌洗牌和發牌的範例程式碼的詳細內容,更多關於Java撲克牌洗牌發牌的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com