模擬紙牌,Java簡單實現鬥地主發牌機制!

新手上路,跌跌碰碰,看完一些視頻,最終實現了鬥地主模擬發牌!
記錄一下 Java 的學習日程

在這裏插入圖片描述


寫完這些,發現Java 真的沒python簡潔, 甚至一些簡單的功能在java中實現變得還有一點困難, 比如隨機數組 和翻轉數組, 在python中就是一句話做到的事情,。

遊戲流程圖:

初始化
洗牌
發牌
發牌
發牌
鬥地主
紙牌
待發牌
地主
農民甲
農民乙

在java中, 我們肯定不可能直接把每一張牌的大小和花色放入數組中吧,這樣複雜了, 54張牌, 去掉大小王中的52張牌, 剛好可以整除13 求餘13
那麼我們就利用這個方式,建立一下數組, 來判斷這張牌的花色和數值;

如下代碼

 String[] suits = {"Spades", "Hearts", "Diamonds", "Clubs"};
 String[] ranks = {"Ace", "2", "3", "4", "5", "6", "7", "8"
                , "9","10", "Jack", "Queen", "King"};

// Cradindex 是 這張牌的位置
suit = suits[CardIndex / 13];
rank = ranks[CardIndex % 13];

如果不小心選到了大小王, 這樣的話,用上面的代碼就會出現數組越界的問題,這樣修改:

 // 優先判斷大小鬼
        if (CardIndex <= 51) {
            suit = suits[CardIndex / 13];
            rank = ranks[CardIndex % 13];
        }else if (CardIndex == 52)
        {
            suit = "Red";
            rank = "BigGhost";
        }else if (CardIndex == 53)
        {
            suit = "Black";
            rank = "SmallGhost";
        }

我們要先判斷大小王的存在, 如果存在那麼直接給值, 這樣就可以避免這樣的錯誤。


遊戲代碼:

整個遊戲 分爲 初始化, 洗牌, 發牌 三個階段, 至於出牌,以及遊戲如何勝利, 現在我還不會, 還在學習中。。

初始化:

定義了數組, 要給數組進行順序賦值, 不然默認爲 0 ,然後調用其他函數

	 public static void main(String[] args) {
        // 初始化紙牌
        int allcrad = 54;
        int[] card = new int[allcrad];
        for (int i = 0; i < card.length; i++) {
            card[i] = i;
        }
        // 初始化洗牌 2次
        ruffle(card, 2);
        System.out.println("正在模擬鬥地主發牌-----");
        // 發牌 包含地主和農民一起發牌
        deal(card);
    }

洗牌模塊:

洗牌 用了隨機調換 和 數組逆序 雙重洗牌 更健康。

	public static void ruffle(int[] card, int number){
        // 洗牌操作
        // number ; 洗牌次數
        int k = card.length;
        for (int n =0; n <number; n++)
        {
            for (int i =0,j = k - 1; i< j; i++, j--){
                int temp = card[i];
                card[i] = card[j];
                card[j] = temp;
            }
            // 打亂排序
            for (int i = 0; i < card.length; i++)
            {
                // 生成一個隨機數 然後取整
                int index = (int) (Math.random() * card.length);
                // 隨機數 22交換
                int temp;
                temp = card[i];
                card[i] = card[index];
                card[index] = temp;
            }
        }
    }

發牌模塊:

在這裏 用函數 把發牌 分離出來, 在deal函數就更容易識別

	public static void fun(int[] card, int number, int index){
        String[] mycard = new String[number];
        for (int i = 0; i < number; i++) {
            // 將牌的下標 傳給函數 判斷牌的花色和數值
            // 然後加入mycard中
            String[] k = judge(card[i + index], false);
            mycard[i] = k[0] + "-" + k[1];
        }
        Arrays.sort(mycard);
        System.out.println("紙牌如下:");
        int i = 0;
        for (String c : mycard) {
            System.out.print(c + "  ");
            i++;
            if (i % 6 == 0) {
                System.out.println();
            }
        }
    }
    public static void deal(int[] card) {
        // 模擬發牌
        System.out.println("---------------------------------");
        System.out.println("正在爲地主發牌------");
        fun(card, 20, 0);
        System.out.println();
        System.out.println("---------------------------------");
        System.out.println("正在爲農民甲發牌------");
        // 正在爲農民甲發牌
        fun(card, 17, 20);
        System.out.println();
        System.out.println("---------------------------------");
        System.out.println("正在爲農民乙發牌------");
        // 正在爲農民乙發牌
        fun(card, 17, 37);
        System.out.println();
        System.out.println("---------------------------------");

    }

判斷模塊:

在這裏, 對於java的函數返回, 很衝突, return 也就只能返回一個值, 所以我這裏只能用數組 將二個值返回, print 是一個布爾類型, true則打印不返回值。

   public static String[] judge(int CardIndex, boolean print){
        // 判斷這張牌的花色和數值
        // 返回參數 還是直接打印
        String[] suits = {"Spades", "Hearts", "Diamonds", "Clubs"};
        String[] ranks = {"Ace", "2", "3", "4", "5", "6", "7", "8"
                , "9","10", "Jack", "Queen", "King"};
        String suit = "";
        String rank = "";
//        System.out.println(CardIndex);
        // 優先判斷大小鬼
        if (CardIndex <= 51) {
            suit = suits[CardIndex / 13];
            rank = ranks[CardIndex % 13];
        }else if (CardIndex == 52)
        {
            suit = "Red";
            rank = "BigGhost";
        }else if (CardIndex == 53)
        {
            suit = "Black";
            rank = "SmallGhost";
        }
        if (print){
            System.out.println("The card number " + CardIndex +
                    "suit is "+ suit + "rank is " + rank);
            // 定義了String[] 函數分支一定要有出口
            return null;
        }
        else {
//            System.out.println(suit + rank);
            // return 不能簡單返回多個值
            String[] values = {suit, rank};
            return values;
        }
    }

後記:

Java挺燒腦子的, 有一點難搞!

全部代碼:

import java.util.Arrays;
import java.util.Collections;
import java.util.Scanner;

public class 模擬鬥地主發牌 {

    public static void fun(int[] card, int number, int index){
        String[] mycard = new String[number];
        for (int i = 0; i < number; i++) {
            // 將牌的下標 傳給函數 判斷牌的花色和數值
            // 然後加入mycard中
            String[] k = judge(card[i + index], false);
            mycard[i] = k[0] + "-" + k[1];
        }
        Arrays.sort(mycard);
        System.out.println("紙牌如下:");
        int i = 0;
        for (String c : mycard) {
            System.out.print(c + "  ");
            i++;
            if (i % 6 == 0) {
                System.out.println();
            }
        }
    }
    public static void deal(int[] card) {
        // 模擬發牌
        System.out.println("---------------------------------");
        System.out.println("正在爲地主發牌------");
        fun(card, 20, 0);
        System.out.println();
        System.out.println("---------------------------------");
        System.out.println("正在爲農民甲發牌------");
        // 正在爲農民甲發牌
        fun(card, 17, 20);
        System.out.println();
        System.out.println("---------------------------------");
        System.out.println("正在爲農民乙發牌------");
        // 正在爲農民乙發牌
        fun(card, 17, 37);
        System.out.println();
        System.out.println("---------------------------------");

    }


    public static void ruffle(int[] card, int number){
        // 洗牌操作
        // number ; 洗牌次數
        int k = card.length;
        for (int n =0; n <number; n++)
        {
            for (int i =0,j = k - 1; i< j; i++, j--){
                int temp = card[i];
                card[i] = card[j];
                card[j] = temp;
            }
            // 打亂排序
            for (int i = 0; i < card.length; i++)
            {
                // 生成一個隨機數 然後取整
                int index = (int) (Math.random() * card.length);
                // 隨機數 22交換
                int temp;
                temp = card[i];
                card[i] = card[index];
                card[index] = temp;
            }
        }
    }
    public static String[] judge(int CardIndex, boolean print){
        // 判斷這張牌的花色和數值
        // 返回參數 還是直接打印
        String[] suits = {"Spades", "Hearts", "Diamonds", "Clubs"};
        String[] ranks = {"Ace", "2", "3", "4", "5", "6", "7", "8"
                , "9","10", "Jack", "Queen", "King"};
        String suit = "";
        String rank = "";
//        System.out.println(CardIndex);
        // 優先判斷大小鬼
        if (CardIndex <= 51) {
            suit = suits[CardIndex / 13];
            rank = ranks[CardIndex % 13];
        }else if (CardIndex == 52)
        {
            suit = "Red";
            rank = "BigGhost";
        }else if (CardIndex == 53)
        {
            suit = "Black";
            rank = "SmallGhost";
        }
        if (print){
            System.out.println("The card number " + CardIndex +
                    "suit is "+ suit + "rank is " + rank);
            // 定義了String[] 函數分支一定要有出口
            return null;
        }
        else {
//            System.out.println(suit + rank);
            // return 不能簡單返回多個值
            String[] values = {suit, rank};
            return values;
        }
    }
    public static void main(String[] args) {
        // 初始化紙牌
        int allcrad = 54;
        int[] card = new int[allcrad];
        for (int i = 0; i < card.length; i++) {
            card[i] = i;
        }
        // 初始化洗牌 2次
        ruffle(card, 2);
        System.out.println("正在模擬鬥地主發牌-----");
        // 發牌 包含地主和農民一起發牌
        deal(card);
    }
}

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