有想做企業(yè)網(wǎng)站建設(shè)微商怎么引流被別人加
【案例6-4】 斗地主洗牌發(fā)牌
【案例介紹】
1.任務(wù)描述
撲克牌游戲“斗地主”,相信許多人都會(huì)玩,本案例要求編寫一個(gè)斗地主的洗牌發(fā)牌程序,要求按照斗地主的規(guī)則完成洗牌發(fā)牌的過程。一副撲克總共有54張牌,牌面由花色和數(shù)字組成(包括J、Q、K、A字母)組成,花色有?、?、?、? 四種,分別表示黑桃、紅桃、方塊、梅花,小?、大?分別表示小王和大王。斗地主游戲共有3位玩家參與,首先將這54張牌的順序打亂每人輪流摸一次牌,剩余3張留作底牌,然后在控制臺(tái)打印3位玩家的牌和3張底牌。
2.運(yùn)行結(jié)果
?任務(wù)運(yùn)行結(jié)果如圖6-1所示:
圖6-1? 運(yùn)行結(jié)果圖
?
【實(shí)現(xiàn)思路】
(1)要實(shí)現(xiàn)紙牌程序,首先需要完成紙牌的組裝。牌面是由花色(包括?、?、?、?花色)和數(shù)字(包括J、Q、K、A字母)兩部分組成,可以創(chuàng)建兩個(gè)ArrayList集合作為花色集合與數(shù)字集合,存儲(chǔ)時(shí)需要注意。比10大的牌的數(shù)字用J、Q、K表示,1用A表示。
(2)將花色集合與數(shù)字集合這兩個(gè)循環(huán)進(jìn)行嵌套循環(huán),將花色與數(shù)字組合,形成52章牌,并賦予其編號(hào)。將組合后的牌存放到一個(gè)HashMap集合中,集合的Key值是編號(hào),value值是組裝完成的紙牌。還有兩張牌是大小王(小?表示小王、大?表示大王)。由于組裝規(guī)則不一致,需單獨(dú)使用add()方法將這兩張牌加入到HashMap集合中。
(3)創(chuàng)建一個(gè)數(shù)字集合,用這個(gè)數(shù)字集合代替紙牌完成洗牌和發(fā)牌操作。由于紙牌的數(shù)量是54張,所以創(chuàng)建集合范圍是0~53。?
(4)可以使用Collection類的shuffle()方法完成打亂數(shù)字集合的操作,實(shí)現(xiàn)洗牌效果。由于只有3個(gè)人,所以可以使用for循環(huán),通過將數(shù)字與3取余的方法,將代表不同紙牌的數(shù)字分配給不同人與底牌,實(shí)現(xiàn)發(fā)牌效果。
(5) 洗牌和發(fā)牌結(jié)束后,可以通過Collection類的sort()方法完成排序,之后通過foreach()循環(huán)HashMap集合,根據(jù)數(shù)字查找對(duì)應(yīng)的紙牌字符串,并存入創(chuàng)建的字符串集合中,最后展示字符串集合。
【實(shí)現(xiàn)代碼】
程序?qū)崿F(xiàn)代碼如文件6-1所示。?
??????????????? ?????????文件6-1 ?example5.java
- package com.itheima;
- import java.util.ArrayList;
- import java.util.Collections;
- import java.util.HashMap;
- public class example {
- ??? public static void main(String[] args) {
- ??????? // 準(zhǔn)備花色
- ??????? ArrayList<String> color = new ArrayList<String>();
- ??????? color.add("?");
- ??????? color.add("?");
- ??????? color.add("?");
- ??????? color.add("?");
- ??????? // 準(zhǔn)備數(shù)字 ,用ArrayList將紙牌由小到大排序
- ??????? ArrayList<String> number = new ArrayList<String>();
- ??????? for (int i = 3; i <= 10; i++) {
- ?????????? number.add(i + "");
- ??????? }
- ??????? number.add("J");
- ??????? number.add("Q");
- ??????? number.add("K");
- ??????? number.add("A");
- ??????? number.add("2");
- ??????? // 定義一個(gè)map集合:用來將數(shù)字與每一張牌進(jìn)行對(duì)應(yīng)
- ??? ???HashMap<Integer, String> map = new HashMap<Integer, String>();
- ?????????int index = 0;// 紙牌編號(hào)
- ??????? for (String thisNumber : number) {// 循環(huán)紙牌數(shù)字
- ?????????? for (String thisColor : color) {// 循環(huán)紙牌花色
- ?????????????? // 將花色與數(shù)字組合,形成52張牌,并賦予其編號(hào)
- ?????????????? map.put(index++, thisColor + thisNumber);
- ?????????? }
- ??????? }
- ??????? // 加入大小王
- ??????? map.put(index++, "小?");
- ??????? map.put(index++, "大?");
- ??????? // 一副54張的牌 ArrayList里邊為0-53的數(shù)的新牌
- ??????? ArrayList<Integer> cards = new ArrayList<Integer>();
- ??????? for (int i = 0; i <= 53; i++) {
- ?????????? cards.add(i);// 此時(shí)的cards順序?yàn)?/span>0-53
- ??????? }
- ??????? // 洗牌,使用Collections工具類中的shuffle()方法
- ??????? Collections.shuffle(cards);// 此時(shí)的cards順序已被打亂
- ??????? // 創(chuàng)建三個(gè)玩家和底牌
- ??????? ArrayList<Integer> iPlayer = new ArrayList<Integer>();
- ??????? ArrayList<Integer> iPlayer2 = new ArrayList<Integer>();
- ??????? ArrayList<Integer> iPlayer3 = new ArrayList<Integer>();
- ??????? ArrayList<Integer> iSecretCards = new ArrayList<Integer>();
- ??????? // 遍歷這副洗好的牌,遍歷過程中,將牌發(fā)到三個(gè)玩家和底牌中
- ??????? for (int i = 0; i < cards.size(); i++) {
- ?????????? if (i >= 51) {
- ?????????????? iSecretCards.add(cards.get(i));// 留取3張底牌
- ?????????? } else {
- ?????????????? if (i % 3 == 0) {
- ?????????????? ??iPlayer.add(cards.get(i));//與3取余為0的牌發(fā)給玩家1
- ?????????????? } else if (i % 3 == 1) {
- ?????????????? ??iPlayer2.add(cards.get(i));//與3取余為1的牌發(fā)給玩家2
- ?????????????? } else {
- ?????????????????? iPlayer3.add(cards.get(i));// 其余的牌發(fā)給玩家3
- ?????????????? }
- ?????????? }
- ??????? }
- ??????? // 對(duì)每個(gè)人手中的牌排序,使用Collections工具類中的sort()方法
- ??????? Collections.sort(iPlayer);
- ??????? Collections.sort(iPlayer2);
- ??????? Collections.sort(iPlayer3);
- ??????? // 對(duì)應(yīng)數(shù)字形式的每個(gè)人手中的牌,定義字符串形式的牌
- ??????? ArrayList<String> sPlayer = new ArrayList<String>();
- ??????? ArrayList<String> sPlayer2 = new ArrayList<String>();
- ??????? ArrayList<String> sPlayer3 = new ArrayList<String>();
- ??????? ArrayList<String> sSecretCards = new ArrayList<String>();
- ??????? // 循環(huán)主鍵,從map中獲取紙牌
- ??????? for (Integer key : iPlayer) {
- ?????????? sPlayer.add(map.get(key));
- ??????? }
- ??????? for (Integer key : iPlayer2) {
- ?????????? sPlayer2.add(map.get(key));
- ??????? }
- ??????? for (Integer key : iPlayer3) {
- ?????????? sPlayer3.add(map.get(key));
- ??????? }
- ??????? for (Integer key : iSecretCards) {
- ?????????? sSecretCards.add(map.get(key));
- ??????? }
- ?????????? // 看牌
- ?????????? System.out.println("玩家1:" + sPlayer);
- ?????????? System.out.println("玩家2:" + sPlayer2);
- ?????????? System.out.println("玩家3:" + sPlayer3);
- ?????????? System.out.println("底牌:" + sSecretCards);
- ??????? }
- }
在文件6-1中,第8~22行代碼將4種花色和13個(gè)紙牌編號(hào)分別放到兩個(gè)ArrayList集合中。第24~34當(dāng)代碼foreach循環(huán)拼出52張紙牌,并將其依照從小到大的順序放入Map集合中,并將大小王添加到其中。第36~41行代碼創(chuàng)建了代替紙牌的數(shù)字集合,將其與紙牌中的序號(hào)對(duì)應(yīng),并將數(shù)字集合中的順序打亂,此時(shí)集合相當(dāng)于紙牌編號(hào)集合。第43~60行代碼完成了將紙牌編號(hào)發(fā)給3位玩家并留3張紙牌編號(hào)做為底牌的操作。第62~64行代碼將3位玩家手中紙牌編號(hào)進(jìn)行排序。第66~88行代碼通過循環(huán)3位玩家手中的紙牌編號(hào),將紙牌字符串從Map中取出放入字符串集合。最后打印字符串集合,分別得到3個(gè)玩家的紙牌和底牌。
?