Java實現鬥地主之洗牌發牌

本文通過實例為大傢分享瞭Java實現鬥地主之洗牌發牌的具體代碼,供大傢參考,具體內容如下

案例分析

需求:

實現鬥地主過程中的洗牌,發牌和看牌。

並且確保每一位玩傢手上拿到的牌是隨機並且按照大小排序好的

思路

1.創建一個牌盒,也就是定義一個集合對象,用ArrayList集合實現
2.往牌盒裡面裝牌
3.洗牌,也就是把牌打散,用Collections的shuffle()方法實現
4.發牌,也就是遍歷結合,給三個玩傢發牌
5.看牌,也就是三個玩傢分別遍歷自己的牌

代碼實現

1.創建牌盒,存放所有牌

 //創建一個牌盒,也就是定義一個集合對象,用ArrayList集合實現
        ArrayList<String> poker=new ArrayList<String>();

2.往牌盒裡面放入所有牌組

//往牌盒裡面裝牌
        /*
            ◆2,◆3,◆4.....◆k,◆A
            ♣2,...
            ♥2,...
            ♠2,...
            小王  , 大王
        */
        //定義花色數組
        String[] colors={"◆","♣","♥","♠"};
        //定義點數數組
        String[] numbers={"2","3","4","5","6","7","8","9","10","J","Q","K","A"};
        //將所有牌組合放入牌盒
        for(String col:colors)
        {
            for(String num:numbers)
            {
                poker.add(col+num);
            }
        }
        //將最後兩張大小王放入牌盒
        poker.add("小王");
        poker.add("大王");

3. 洗牌,也就是把牌打散,用Collections的shuffle()方法實現

//洗牌---把牌打亂
        Collections.shuffle(poker);

4. 發牌,也就是遍歷結合,給三個玩傢發牌

//發牌--》遍歷牌盒,給三個玩傢發牌
        ArrayList<String> p1=new ArrayList<>();
        ArrayList<String> p2=new ArrayList<>();
        ArrayList<String> p3=new ArrayList<>();
        //留下三張底牌
        ArrayList<String> dp=new ArrayList<>();
        //將牌分發
        for(int i=0;i<poker.size();i++)
        {
            if(i>=poker.size()-3)
            {
                dp.add(poker.get(i));
            }
            else if(i%3==0)
            {
                p1.add(poker.get(i));
            }
            else if(i%3==1)
            {
                p2.add(poker.get(i));
            }
            else if(i%3==2)
            {
                p3.add(poker.get(i));
            }
        }

5. 看牌,也就是三個玩傢分別遍歷自己的牌

//看牌---分別展示三位玩傢自己的牌
          show("大忽悠",p1);
         show("小忽悠",p2);
         show("超級無敵大忽悠",p3);
         //展示底牌
        System.out.print("底牌如下: ");
        for(var Dp:dp)
            System.out.print(Dp+" ");

看牌的方法定義:

 public static  void show(String  name,ArrayList<String> arr)
    {
        System.out.print(name+"的牌: ");
        for(int i=0;i<arr.size();i++)
        {
            System.out.print(arr.get(i)+" ");
        }
        System.out.println();
    }

完整代碼和演示結果

完整代碼:

import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;

public class Main
{
    public static void main(String[] args)
    {
        //創建一個牌盒,也就是定義一個集合對象,用ArrayList集合實現
        ArrayList<String> poker=new ArrayList<String>();
       //往牌盒裡面裝牌
        /*
            ◆2,◆3,◆4.....◆k,◆A
            ♣2,...
            ♥2,...
            ♠2,...
            小王  , 大王
        */
        //定義花色數組
        String[] colors={"◆","♣","♥","♠"};
        //定義點數數組
        String[] numbers={"2","3","4","5","6","7","8","9","10","J","Q","K","A"};
        //將所有牌組合放入牌盒
        for(String col:colors)
        {
            for(String num:numbers)
            {
                poker.add(col+num);
            }
        }
        //將最後兩張大小王放入牌盒
        poker.add("小王");
        poker.add("大王");
        //洗牌---把牌打亂
        Collections.shuffle(poker);
       //發牌--》遍歷牌盒,給三個玩傢發牌
        ArrayList<String> p1=new ArrayList<>();
        ArrayList<String> p2=new ArrayList<>();
        ArrayList<String> p3=new ArrayList<>();
        //留下三張底牌
        ArrayList<String> dp=new ArrayList<>();
        //將牌分發
        for(int i=0;i<poker.size();i++)
        {
            if(i>=poker.size()-3)
            {
                dp.add(poker.get(i));
            }
            else if(i%3==0)
            {
                p1.add(poker.get(i));
            }
            else if(i%3==1)
            {
                p2.add(poker.get(i));
            }
            else if(i%3==2)
            {
                p3.add(poker.get(i));
            }
        }
         //看牌---分別展示三位玩傢自己的牌
          show("大忽悠",p1);
         show("小忽悠",p2);
         show("超級無敵大忽悠",p3);
         //展示底牌
        System.out.print("底牌如下: ");
        for(var Dp:dp)
            System.out.print(Dp+" ");
    }
    public static  void show(String  name,ArrayList<String> arr)
    {
        System.out.print(name+"的牌: ");
        for(int i=0;i<arr.size();i++)
        {
            System.out.print(arr.get(i)+" ");
        }
        System.out.println();
    }
}

哈希表優化

區別: 上面是用一個字符串數組來存儲所有牌的組合,並且也是對字符串數組進行洗牌操作,較為麻煩,而用哈希表之後,我們可以對每一張牌對應的索引進行洗牌操作。

並且上面也要求瞭,對每一位玩傢的牌進行排序,而上面我們並沒有實現,因此下面我們使用Treeset來保存每一位玩傢所拿到的牌,確保完成瞭排序功能

思路:

代碼實現:

import java.util.*;

public class Main
{
    public static void main(String[] args)
    {
        //HashMap存放索引和對應的牌
        HashMap<Integer,String> map=new HashMap<>();
        //存放索引的數組
        ArrayList<Integer> index=new ArrayList<>();
        //花色和點數數組
        String[] colors={"◆","♣","♥","♠"};
        String[] numbers={"2","3","4","5","6","7","8","9","10","J","Q","K","A"};
        //發牌
        int pos=0;//索引
        for(var col:colors)
        {
            for(var num:numbers)
            {
                map.put(pos,col+num);
                index.add(pos);
                pos++;
            }
        }
        //對索引執行洗牌操作
        Collections.shuffle(index);
        //發牌
        TreeSet<Integer> p1=new TreeSet<>();
        TreeSet<Integer> p2=new TreeSet<>();
        TreeSet<Integer> p3=new TreeSet<>();
        TreeSet<Integer> dp=new TreeSet<>();
            for(int i=0;i<index.size();i++)
            {
                if(i>=index.size()-3)
                {
                    dp.add(index.get(i));
                }
                else if(i%3==0)
                {
                    p1.add(index.get(i));
                }
                else if(i%3==1)
                {
                    p2.add(index.get(i));
                }
                else if(i%3==2)
                {
                    p3.add(index.get(i));
                }
            }
            //看牌
        //看牌---分別展示三位玩傢自己的牌
        show("大忽悠",p1,map);
        show("小忽悠",p2,map);
        show("超級無敵大忽悠",p3,map);
        //展示底牌
        System.out.print("底牌如下: ");
       for(var Dp:dp)
       {
           System.out.print(map.get(Dp)+" ");
       }
    }
    public static  void show(String  name,TreeSet<Integer> arr,HashMap<Integer,String> map)
    {
        System.out.print(name+"牌如下: ");
       for(var ele:arr)
       {
           System.out.print(map.get(ele)+" ");
       }
        System.out.println();
    }
}

以上就是本文的全部內容,希望對大傢的學習有所幫助,也希望大傢多多支持WalkonNet。

推薦閱讀: