java實現(xiàn)斗地主游戲
感想:
第一次寫博客,感覺編輯器挺復(fù)雜厲害的,感覺自己的內(nèi)容挺簡單的。有什么問題請多多指教!
思路:
1、創(chuàng)建一個撲克牌的實體類Poker,設(shè)置了四個參數(shù):花色、數(shù)字、牌值(判斷大?。?、是否地主牌,實現(xiàn)getset方法和構(gòu)造方法;
2、創(chuàng)建一個玩家的實體類Player,設(shè)置了四個參數(shù): 初始牌集合,排序后牌集合,牌值集合,是否地主,實現(xiàn)getset方法和構(gòu)造方法;
3、洗牌:循環(huán)嵌套花色數(shù)組跟數(shù)字?jǐn)?shù)組生成52個Poker,手動加入大小王Poker,放進(jìn)map(int,Poker)里面,利用Collections.shuffle隨機(jī)排序map的key,再根據(jù)key生成排序后的Poker集合
4、發(fā)牌:生成3個玩家對象,拿到洗牌后的集合,前51張牌為玩家牌,后3張為地主牌,在51張牌中隨機(jī)一張為地主牌,遍歷玩家牌分配個每一個Player,同時根據(jù)玩家牌的牌值生成集合grades存進(jìn)Player對象中,將grades轉(zhuǎn)為int數(shù)組并進(jìn)行升序排序,根據(jù)grade取得新Poker集合分配給玩家。
Poker類:
package com.company; public class Poker { private String color; private String number; private int grade; boolean isLandowners; public boolean isLandowners() { return isLandowners; } public void setLandowners(boolean landowners) { isLandowners = landowners; } public int getGrade() { return grade; } public void setGrade(int grade) { this.grade = grade; } public String getColor() { return color; } public void setColor(String color) { this.color = color; } public String getNumber() { return number; } public void setNumber(String number) { this.number = number; } public Poker() { } public Poker(String color, String number ,int grade,boolean isLandowners) { this.color = color; this.number = number; this.grade=grade; this.isLandowners=isLandowners; } public String toString() { return this.getColor()+this.getNumber(); } }
Player類:
package com.company; import java.util.ArrayList; import java.util.LinkedList; public class Player { private ArrayList<Poker> pokers; private boolean isLandower; private ArrayList<Poker> newPokers; private LinkedList<Integer> grades; public LinkedList<Integer> getGrades() { return grades; } public void setGrades(LinkedList<Integer> grades) { this.grades = grades; } public ArrayList<Poker> getNewPokers() { return newPokers; } public void setNewPokers(ArrayList<Poker> newPokers) { this.newPokers = newPokers; } public boolean isLandower() { return isLandower; } public void setLandower(boolean landower) { isLandower = landower; } public Player() { } public ArrayList<Poker> getPokers() { return pokers; } public void setPokers(ArrayList<Poker> pokers) { this.pokers = pokers; } }
洗牌:
/*洗牌*/ public static LinkedList<Poker> getPokerList() { LinkedList<Poker> pokers = new LinkedList<Poker>(); LinkedList<Poker> newPokers = new LinkedList<Poker>(); ArrayList<Integer> arrayList = new ArrayList<>(); int[] arr; /*生成54張撲克牌(Poker對象)*/ /*用嵌套循環(huán)生成從方塊3到黑桃2的Poker對象,放進(jìn)Poker的LinkedList保證順序*/ String[] colors = {"♦", "♣", "♥", "♠"}; String[] numbers = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"}; for (int i = 0; i < numbers.length; i++) { for (int j = 0; j < colors.length; j++) { Poker p = new Poker(colors[j], numbers[i], (4 * i) + j + 1, false); pokers.add(p); } } /*添加大小王*/ pokers.add(new Poker("black", "☆", 53, false)); pokers.add(new Poker("red", "☆", 54, false)); /*將生成的54張撲克牌從1到54放進(jìn)map*/ for (int z = 1; z <= pokers.size(); z++) { map.put(z, pokers.get(z - 1)); } /*遍歷Map,將每個Poker對應(yīng)的key放進(jìn) ArrayList<Integer> arrayList */ Set<Map.Entry<Integer, Poker>> set = map.entrySet(); Iterator it = set.iterator(); while (it.hasNext()) { Map.Entry<Integer, Poker> e = (Map.Entry<Integer, Poker>) it.next(); arrayList.add(e.getKey()); } /*利用Collections.shuffle隨機(jī)排序key*/ Collections.shuffle(arrayList); /*將亂序后的key對于的Poker放進(jìn)newPokers里面 */ for (Integer i : arrayList) { newPokers.add(map.get(i)); } return newPokers; }
發(fā)牌:
/*發(fā)牌*/ /*根據(jù)玩家人數(shù)生成Player,默認(rèn)num=3*/ private static void sentPoker(int num) { /*獲取洗牌后的LinkedList,保證順序*/ LinkedList<Poker> Allpokers = getPokerList(); ArrayList<Poker> pokers = new ArrayList<>(); ArrayList<Poker> BottomPokers = new ArrayList<>(); /*生成玩家對象*/ for (int i = 0; i < num; i++) { Player p = new Player(); players.add(p); } /*前50張牌為玩家牌,后三張為底牌*/ for (int p = 0; p < Allpokers.size(); p++) { if (p <= 50) { pokers.add(Allpokers.get(p)); } else { BottomPokers.add(Allpokers.get(p)); } } /*玩家牌中隨機(jī)一張為地主牌*/ Random rand = new Random(); int s = rand.nextInt(51); pokers.get(s).setLandowners(true); System.out.println("地主牌: " + pokers.get(s)); /*根據(jù)num生成Player對象*/ for (int j = 0; j < num; j++) { /*玩家的牌值集合*/ LinkedList<Integer> grades = new LinkedList<>(); /*玩家的手牌集合*/ ArrayList<Poker> playerPokers = new ArrayList<Poker>(); /*根據(jù)玩家個數(shù)分配玩家牌*/ for (int z = j; z < pokers.size(); z = z + num) { playerPokers.add(pokers.get(z)); grades.add(pokers.get(z).getGrade()); players.get(j).setPokers(playerPokers); players.get(j).setGrades(grades); } /*根據(jù)玩家牌中的地主牌設(shè)置玩家是否地主*/ for (Poker p : players.get(j).getPokers()) { if (p.isLandowners() == true) { players.get(j).setLandower(true); } } /*根據(jù)玩家的牌值集合生成數(shù)組*/ Integer[] gs = new Integer[players.get(j).getGrades().size()]; grades.toArray(gs); /*排序數(shù)組,由低到高*/ Arrays.sort(gs); /*排序后的玩家牌*/ ArrayList<Poker> newPokers = new ArrayList<>(); for (int g = 0; g < gs.length; g++) { Poker p = map.get(gs[g]); newPokers.add(p); } players.get(j).setNewPokers(newPokers); System.out.println("玩家" + (j + 1) + ": " + players.get(j).getNewPokers() + " 是否地主:" + players.get(j).isLandower()); } System.out.print("底牌為: "); for (Poker p : BottomPokers) { System.out.print(p + " "); } }
效果如下:
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
springboot?@Async?注解如何實現(xiàn)方法異步
這篇文章主要介紹了springboot?@Async?注解如何實現(xiàn)方法異步,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11SpringBoot使用Redis緩存的實現(xiàn)方法
這篇文章主要介紹了SpringBoot使用Redis緩存的實現(xiàn)方法,需要的朋友可以參考下2018-02-02Maven根據(jù)不同環(huán)境打包不同配置文件的方法
這篇文章主要介紹了Maven根據(jù)不同環(huán)境打包不同配置文件的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-08-08Java實現(xiàn)數(shù)據(jù)庫連接池的方法
這篇文章主要介紹了Java實現(xiàn)數(shù)據(jù)庫連接池的方法,涉及java數(shù)據(jù)庫連接池的創(chuàng)建、連接、刷新、關(guān)閉及狀態(tài)獲取的常用技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-07-07