集合(模擬鬥地主發牌)

来源:https://www.cnblogs.com/ztg-java-xuexi/archive/2022/03/29/16074418.html
-Advertisement-
Play Games

思路: * A:創建一個HashMap集合 * B:創建一個ArrayList集合 * C:創建花色數組和點數數組 * D:從0開始往HashMap裡面存儲編號,並存儲對應的牌 * 同時往ArrayList裡面存儲編號即可。 * E:洗牌(洗的是編號) * F:發牌(發的也是編號,為了保證編號是排序 ...


思路:
* A:創建一個HashMap集合
* B:創建一個ArrayList集合
* C:創建花色數組和點數數組
* D:從0開始往HashMap裡面存儲編號,並存儲對應的牌
* 同時往ArrayList裡面存儲編號即可。
* E:洗牌(洗的是編號)
* F:發牌(發的也是編號,為了保證編號是排序的,就創建TreeSet集合接收)
* G:看牌(遍歷TreeSet集合,獲取編號,到HashMap集合找對應的牌)

輸出牌---無序版

package Day18;

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

public class PoKe {
    public static void main(String[] args) {
        //創建牌盒---集合
        ArrayList<String> array = new ArrayList<String>();

        //裝牌

        //定義一個花色數組
        String [] colors = {"♠","♣","♥","♦"};
        //定義一個點數的數組
        String [] number = {"A","2","3","4","5","6","7","8","9","J","Q","K"};
        //將牌裝入集合array中
        //增強for進行迴圈遍歷獲取花色字元數組中的每個花色
        for(String a : colors){
            //遍歷點數字元數組獲取每個點數
            for(String b:number){
                //對獲取的每個花色和點數進行字元的拼接---並將其添加到集合array中
                //字元拼接使用String類中的public String concat(String str)將指定字元串連接到此字元串的結尾。
                array.add(a.concat(b));
            }
        }
        array.add("小王");
        array.add("大王");
        //輸出查看字元中的集合---是否添加上元素
        //System.out.println(array);
//        for(String t: array){
//            System.out.println(t);
//        }

        //洗牌
        //使用Collections中任意置換的方法實現其集合元素的混亂
        //public static void shuffle(List<?> list)使用預設隨機源對指定列表進行置換。
        // 所有置換髮生的可能性都是大致相等的。
        Collections.shuffle(array);
        //輸出查看集合是否混亂
        //System.out.println(array);


        //看牌
        //鬥地主三人打牌
        //首先創建三個集合用來存儲每個人的牌---還有一個集合存儲最後三張底牌
        ArrayList<String> zhao = new ArrayList<String>();
        ArrayList<String> zhu = new ArrayList<String>();
        ArrayList<String> wang = new ArrayList<String>();
        ArrayList<String> dipai = new ArrayList<String>();

        //進行分發牌
        //首先遍歷array集合
        for(int x=0;x<array.size();x++){
            //進行底牌的判斷---只留最後三張---放在遍歷迴圈的開始,以防添加到別的集合
            if(x>= array.size()-3){
                //添加最後三張底牌
                dipai.add(array.get(x));
            }
            //進行順序發牌
            if(x%3==0){
                //三人發牌---這是第一個拿牌的
                //如果遍歷的array集合的索引的取餘是零--就將此處array的索引值添加到zhao集合中
                zhao.add(array.get(x));
            }else if(x%3==1){
                //三人發牌--這是第二個拿牌的
                zhu.add(array.get(x));
            }else if(x%3==2){
                //三人發牌--這是第三個拿牌的
                wang.add(array.get(x));
            }
        }

        //查看牌---此時的查看牌定義一個功能方法--查看任意一個調用功能方法即可
        kanpai("趙同剛",zhao);
        kanpai("朱慶娜",zhu);
        kanpai("王麗麗",wang);
        kanpai("底牌",dipai);
    }

    //兩個明確
    //返回值類型----void(任意型)  參數列表--A:給出拿牌人的姓名--B:給出拿牌的集合
    public static void kanpai(String name,ArrayList<String> m){
        //進行格式的調整
        System.out.print(name+":");
        //遍歷輸出集合中的每一個元素
        for (String e : m){
            System.out.print(e+",");
        }
        //每個人的牌在輸出時進行換行,以方便查看
        System.out.println();

    }




}

有序版

package Day18;



import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.TreeSet;

/*
* 思路:
 *         A:創建一個HashMap集合
 *         B:創建一個ArrayList集合
 *         C:創建花色數組和點數數組
 *         D:從0開始往HashMap裡面存儲編號,並存儲對應的牌
 *        同時往ArrayList裡面存儲編號即可。
 *      E:洗牌(洗的是編號)
 *      F:發牌(發的也是編號,為了保證編號是排序的,就創建TreeSet集合接收)
 *      G:看牌(遍歷TreeSet集合,獲取編號,到HashMap集合找對應的牌)
* */
public class PoKe1 {
    public static void main(String[] args) {
        //牌盒
        //創建一個HashMap集合---存儲編號和對應的牌
        HashMap<Integer,String> hm = new HashMap<Integer, String>();

        //創建一個ArrayList集合---存儲編號
        ArrayList<Integer> Al = new ArrayList<Integer>();

        //裝牌
        //創建花色字元數組和點數字元數組
        String [] color = {"♠","♣","♥","♦"};
        String [] number = {"A","2","3","4","5","6","7","8","9","J","Q","K"};

        //首先定義一個記錄編號的值
        int index = 0;

        //將花色字元和點數數組進行拼接
            //獲取遍歷點數字元數組中的每個字元
             for(String nb:number){
                 //遍歷獲花色數字元數組中的每個點數
                 for(String cr:color){
                     //將獲取的花色字元與點數字元進行拼接
                     //字元拼接使用String類中的public String concat(String str)將指定字元串連接到此字元串的結尾。
                     String PJ = cr.concat(nb);
                     //--並添加到HashMap集合中----值--牌
                     hm.put(index,PJ);
                     //同時向ArrayList添加編號
                     Al.add(index);
                     index++;
                 }

             }
         //上述方法做完仍還有大小王沒有添加---進行添加大小王
        hm.put(index,"小王");
        Al.add(index);
        index++;
        hm.put(index,"大王");
        Al.add(index);

        //洗牌--對編號進行洗牌
        Collections.shuffle(Al);


        //看牌
        //發牌
        //首先創建三個集合用來存儲每個人的牌---還有一個集合存儲最後三張底牌
        //創建TreeSet集合進行接受有序排序---發牌發的也是編號--鬥地主三人一個底牌
        TreeSet<Integer> FP1 = new TreeSet<Integer>();
        TreeSet<Integer> FP2 = new TreeSet<Integer>();
        TreeSet<Integer> FP3 = new TreeSet<Integer>();
        TreeSet<Integer> FP4 = new TreeSet<Integer>();
        //遍歷ArrayList置換後的集合---利用獲取的編號調用ArrayList中get()的方法來獲取集合元素
        // --並添加添加到TerrSet集合中
        for(int x=0;x<Al.size();x++){
            //底牌  //進行底牌的判斷---只留最後三張---放在遍歷迴圈的開始,以防添加到別的集合
            if(x>Al.size()-3){
                FP4.add(Al.get(x));
                //三人發牌---這是第一個拿牌的
            }else if(x%3==0){
                FP1.add(Al.get(x));
                //三人發牌--這是第二個拿牌的
            }else if(x%3==1){
                FP2.add(Al.get(x));
            }else if (x%3==2){
                //三人發牌--這是第三個拿牌的
                FP3.add(Al.get(x));
            }
        }

        //已經給玩家發牌完--現在進行看牌
        //定義功能方法---方便調用查看每個人的牌
        show("趙同剛",FP1,hm);
        show("朱慶娜",FP2,hm);
        show("王麗麗",FP3,hm);
        show("底牌",FP4,hm);


    }
    //兩個明確
    //參數類型  --void  參數列表  A:傳入玩家的姓名  B:傳入玩家的牌(編號集合)  C:對應的牌(牌值集合)
    public static void show(String name,TreeSet<Integer> FP,HashMap<Integer,String> hm ){
        System.out.print(name+":");
        //首先遍歷編號集合
        for(Integer e :FP){
            //利用遍歷的集合編號輸出---對應牌的(牌值集合)
            String tt = hm.get(e);
            System.out.print(tt+",");
        }
        System.out.println();
    }

}

標準有序版

public class PokerDemo {
    public static void main(String[] args) {
        // 創建一個HashMap集合
        HashMap<Integer, String> hm = new HashMap<Integer, String>();

        // 創建一個ArrayList集合
        ArrayList<Integer> array = new ArrayList<Integer>();

        // 創建花色數組和點數數組
        // 定義一個花色數組
        String[] colors = { "♠", "♥", "♣", "♦" };
        // 定義一個點數數組
        String[] numbers = { "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q",
                "K", "A", "2", };

        // 從0開始往HashMap裡面存儲編號,並存儲對應的牌,同時往ArrayList裡面存儲編號即可。
        int index = 0;

        for (String number : numbers) {
            for (String color : colors) {
                String poker = color.concat(number);
                hm.put(index, poker);
                array.add(index);
                index++;
            }
        }
        hm.put(index, "小王");
        array.add(index);
        index++;
        hm.put(index, "大王");
        array.add(index);

        // 洗牌(洗的是編號)
        Collections.shuffle(array);

        // 發牌(發的也是編號,為了保證編號是排序的,就創建TreeSet集合接收)
        TreeSet<Integer> fengQingYang = new TreeSet<Integer>();
        TreeSet<Integer> linQingXia = new TreeSet<Integer>();
        TreeSet<Integer> liuYi = new TreeSet<Integer>();
        TreeSet<Integer> diPai = new TreeSet<Integer>();

        for (int x = 0; x < array.size(); x++) {
            if (x >= array.size() - 3) {
                diPai.add(array.get(x));
            } else if (x % 3 == 0) {
                fengQingYang.add(array.get(x));
            } else if (x % 3 == 1) {
                linQingXia.add(array.get(x));
            } else if (x % 3 == 2) {
                liuYi.add(array.get(x));
            }
        }

        // 看牌(遍歷TreeSet集合,獲取編號,到HashMap集合找對應的牌)
        lookPoker("風清揚", fengQingYang, hm);
        lookPoker("林青霞", linQingXia, hm);
        lookPoker("劉意", liuYi, hm);
        lookPoker("底牌", diPai, hm);
    }

    // 寫看牌的功能
    public static void lookPoker(String name, TreeSet<Integer> ts,
            HashMap<Integer, String> hm) {
        System.out.print(name + "的牌是:");
        for (Integer key : ts) {
            String value = hm.get(key);
            System.out.print(value + " ");
        }
        System.out.println();
    }
}

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本人第一次發博客,用意在於記錄自己在開發過程中用到的實用工具並分享出來,寫的可能不好,請大家多多包涵!!! 工具官網:https://www.zwibbler.com 基於Canvas的一個前端繪畫工具。具體功能本人暫未深究。主要在項目中的應用場景如下: 1.將Canvas畫板植入前端 2.用戶可通 ...
  • 隨著ECMAScript 6.0(ES6)是JavaScript 語言的下一代標準的普及,各個大公司和大的廠商都推出了自己的前端開發框架,如Angular,React,Vue 等,微軟更是錦上添花,開發出Typescript 的JavaScript超集語言,更是讓各個前端框架所採用,這將是前端領域的 ...
  • 最近有個項目要在瀏覽器端裁剪並上傳圖片。由於缺乏人力,只能我上陣殺敵。通過參考各種文章,最後決定用croopperjs進行圖片裁剪,用webuploader上傳文件。本文涉及到的知識至少有Java基礎、SpringMVC、thymeleaf模版引擎、JS基礎、JQuery基礎、Bootstrap組件... ...
  • 第一步: npm install weixin-js-sdk -S // (或者直接index.html裡面引入js文件 http://res.wx.qq.com/open/js/jweixin-1.6.0.js 官方文檔:https://developers.weixin.qq.com/doc/o ...
  • 開發ASP.NET Core 程式,並Build成Docker鏡像發佈到Docker 註冊表中是十分輕鬆的事情,只需在VS 的發佈中選擇 其他Docker容器註冊表, 填寫必要信息,就可以把代碼發佈到企業自己的Docker 容器註冊表中了。請參考下圖所示。這個操作也可以發佈到 第三方的Docker ...
  • 訪問者模式屬於行為型模式;指將作用於某種數據結構中各元素的操作分離出來封裝成獨立的類,使其在不改變數據結構的前提下可以添加作用於這些元素的新的操作,為數據結構中的每個元素提供多種訪問方式。它將對數據的操作與數據結構進行分離,是行為類模式中最複雜的一種模式。 訪問者模式的目的是封裝一些施加於某種數據結 ...
  • Profile是個好東西。通過Profile,我們可以非常方便地條件化Bean的創建,動態調整應用程式的功能。可是,Profile只能做些簡單的條件化,對於複雜一點的條件化Profile是無法勝任的。比如現有這樣的數據源創建需求: 1.如果類路徑存在DBCP的JAR包,則創建DBCP提供的Basic ...
  • 實戰項目地址newbeemall,集成RediSearch,代碼開源已上傳,支持的話可以點個star😁 RediSearch 是基於 Redis 開發的支持二級索引、查詢引擎和全文搜索的應用程式。在2.0的版本中,簡單看下官網測試報告: 索引構建 在索引構建測試中,RediSearch 用221秒 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...