模拟纸牌,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);
    }
}

你可能感兴趣的:(java学习)