我的作業(yè)如下,有點疑惑,路過求指點
個人小結,寫的過程中主要卡在三個地方,:
1.洗牌打亂順序??不知道用Collections的shuffle()方法 ?自己用ArrayList遍歷放到HashSet里再放回去試了一通,完全不能用(順序確實亂了,但每次都亂的一毛一樣)
2.輸入ID不正時,如何重復輸入。?琢磨出while死循環(huán)+try-catch方式???? ??一直有個疑問:編譯器總提示Scanner對象從未close,加了close又會出現(xiàn)死循環(huán),沒等用戶輸入就向下繼續(xù)執(zhí)行了
3.比較牌面時,Comparable和Comparator重寫的方法的實現(xiàn)方式 ??打撲克2最大,A其次,然后K?Q?J? ??只知道課程里講到的compareTo和compare方法,于是投機取巧利用HashMap硬將無規(guī)律字符串與整數(shù)值映射,再compare. ??疑問:參考了其它同學的內(nèi)容,一種做法是把代表牌面大小(點數(shù)和花色)變一個屬性會更簡便些,或者其它做法...?
代碼如下:
GameTest.java
package?test_pukepa_game; import?java.util.ArrayList; import?java.util.Collections; import?java.util.InputMismatchException; import?java.util.List; import?java.util.Scanner; public?class?GameTest?{ ????private?List<PlayingCard>?cardsList; ????private?List<Player>?playerList; ????public?GameTest()?{ ????????this.cardsList??=?new?ArrayList<>(); ????????this.playerList?=?new?ArrayList<Player>(); ????????} ????//?創(chuàng)建撲克牌 ????public?void?makeCards()?{ ????????String[]?types?=?{"黑桃","紅桃","梅花","方片"}; ????????String[]?points?=?{"2","3","4","5","6","7","8","9","10","J","Q","K","A"}; ????????List<String>?cards?=?new?ArrayList<String>(); ? ????????for?(int?i?=?0;?i?<?types.length;?i++)?{ ????????????for?(int?j?=?0;?j?<?points.length;?j++)?{ ????????????????cardsList.add(new?PlayingCard(points[j],?types[i])); ????????????????cards.add(types[i]?+?points[j])??; ????????????} ????????} ????????System.out.println("----------撲克牌創(chuàng)建成功!------------"); ????????System.out.println("為:"?+?cards.toString()); ????} ????//?洗牌 ????public?void?resetCards()?{ ????????//?重復玩時,?清空玩家的手牌 ????????if(playerList.size()?>?0)?{ ????????????for?(Player?player?:?playerList)?{ ????????????????????player.getCards().clear(); ????????????} ????????} ????????System.out.println("----------洗牌前:"+cardsList.toString()); ????????//*******Collections類的shuffle()方法的作用是將List中的內(nèi)容隨機打亂順序*****// ????????Collections.shuffle(cardsList); ????????//**********************************// ????????System.out.println("----------洗牌后:"+cardsList.toString()); ????????System.out.println("----------洗牌結束!------------------"); ????} ????//?創(chuàng)建玩家 ????public?void?makePlayer()?{ ????????for?(int?i?=?1;?i?<?3;?i++)?{ ????????????System.out.println("請輸入第"?+?i?+?"位玩家的ID和姓名:"); ????????????while?(true)?{ ????????????????try?{ ????????????????????Scanner?console?=?new?Scanner(System.in); ????????????????????System.out.println("輸入ID:"); ????????????????????Integer?id?=?console.nextInt(); ????????????????????System.out.println("輸入姓名:"); ????????????????????String?name?=?console.next(); ????????????????????playerList.add(new?Player(id,?name)); ????????????????????break; ????????????????}?catch?(InputMismatchException?e)?{ ????????????????????//?TODO?Auto-generated?catch?block ????????????????????System.out.println("請輸入整數(shù)類型的ID!"); ????????????????????continue; ????????????????} ???????????} ????????} ????????for?(Player?player?:?playerList)?{ ????????????System.out.println("---歡迎玩家:"?+?player.getName()); ????????} ????} ????//?發(fā)牌?一人發(fā)兩張牌 ????public?void?takeCards()?{ ????????for?(int?i?=?0;?i?<?2;?i++)?{ ????????????for?(int?j?=?0;?j?<?playerList.size();?j++)?{ ????????????????Player?player?=?playerList.get(j); ????????????????player.getCards().add(new?PlayingCard(cardsList.get(i*2?+j).getNumber(),?cardsList.get(i*2+j).getType())); ????????????????System.out.println("---玩家:"+?player.getName()?+?"-拿牌"); ????????????} ????????} ????????System.out.println("----------發(fā)牌結束!------------------"); ????} ???? ????//?游戲開始比較 ????public?void?startGame()?{ ????????ArrayList<PlayingCard>?cards?=?new?ArrayList<PlayingCard>(); ????????//取出手中點數(shù)最大的牌 ????????for?(Player?player?:?playerList)?{ ????????????Collections.sort(player.getCards()); ????????????PlayingCard?pc?=?player.getCards().get(1); ????????????cards.add(pc); ????????????System.out.println("玩家:"+player.getName()?+?"最大的手牌為:"+pc.getType()+pc.getNumber()); ????????} ????????//?最大的牌進行比較 ????????if(cards.get(0).getNumber().equals(cards.get(1).getNumber()))?{ ????????????Collections.sort(cards,?new?PlayingCardComparator()); ????????}?else?{ ????????????Collections.sort(cards); ????????} ???????? ????????//?遍歷找出最大牌的擁有者為勝者???hashCode?和?equals方法重寫 ????????for?(Player?player?:?playerList)?{ ????????????if(player.getCards().contains(cards.get(1))){ ????????????????System.out.println("---------玩家:"+player.getName()+"獲勝!--------------------"); ????????????????break; ????????????} ????????} ???????? ????????System.out.println("玩家各自的手牌為:"); ????????for?(Player?player?:?playerList)?{ ????????????System.out.println(player.getName()+":"+player.getCards().toString()); ????????} ????} ???? ????public?static?void?main(String[]?args)?{ ????????GameTest?gt?=?new?GameTest(); ????????System.out.println("----------創(chuàng)建撲克牌------------------"); ????????gt.makeCards(); ????????gt.makePlayer(); ????????while(true)?{ ????????????System.out.println("----------開始洗牌...--------------------"); ????????????gt.resetCards(); ????????????System.out.println("----------開始發(fā)牌...--------------------"); ????????????gt.takeCards(); ????????????System.out.println("----------開始游戲...--------------------"); ????????????gt.startGame(); ????????????System.out.println("----------還要繼續(xù)嗎?1--是?0--否------"); ????????????Scanner?console?=?new?Scanner(System.in); ????????????try?{ ????????????????if(0?==?console.nextInt())?{ ????????????????????System.out.println("----------游戲結束------"); ????????????????????break; ????????????????} ????????????????}?catch(InputMismatchException?e)?{ ????????????????System.out.println("----------游戲結束------"); ????????????????break; ????????????????} ????????} ????} }
PlayingCard.java???//撲克牌
package?test_pukepa_game; import?java.util.HashMap; public?class?PlayingCard?implements?Comparable<PlayingCard>{ private?String?number; private?String?type; public?PlayingCard(String?number,?String?type)?{ this.number?=?number; this.type?=?type; } public?String?getNumber()?{ return?number; } public?void?setNumber(String?number)?{ this.number?=?number; } public?String?getType()?{ return?type; } public?void?setType(String?type)?{ this.type?=?type; } @Override public?int?hashCode()?{ final?int?prime?=?31; int?result?=?1; result?=?prime?*?result?+?((number?==?null)???0?:?number.hashCode()); result?=?prime?*?result?+?((type?==?null)???0?:?type.hashCode()); return?result; } @Override public?boolean?equals(Object?obj)?{ if?(this?==?obj) return?true; if?(obj?==?null) return?false; if?(!(obj?instanceof?PlayingCard)) return?false; PlayingCard?other?=?(PlayingCard)?obj; if?(number?==?null)?{ if?(other.number?!=?null) return?false; }?else?if?(!number.equals(other.number)) return?false; if?(type?==?null)?{ if?(other.type?!=?null) return?false; }?else?if?(!type.equals(other.type)) return?false; return?true; } @Override public?int?compareTo(PlayingCard?o)?{ //?TODO?Auto-generated?method?stub HashMap<String,?Integer>?hashmap?=?new?HashMap<String,?Integer>(); for(int?i?=?3;?i?<=10;?i++)?{ hashmap.put(String.valueOf(i),?i); } hashmap.put("J",?11); hashmap.put("Q",?12); hashmap.put("K",?13); hashmap.put("A",?14); hashmap.put("2",?15); //?按照點數(shù)比較大小 return?hashmap.get(this.number).compareTo(hashmap.get(o.number)); } @Override public?String?toString()?{ return?type+?number?; } }
PlayingCardComparator.java??//按花色比較的Comparator接口實現(xiàn)類
package?test_pukepa_game; import?java.util.Comparator; import?java.util.HashMap; public?class?PlayingCardComparator?implements?Comparator<PlayingCard>?{ @Override public?int?compare(PlayingCard?o1,?PlayingCard?o2)?{ //?TODO?Auto-generated?method?stub HashMap<String,?Integer>?hashmap?=?new?HashMap<String,?Integer>(); hashmap.put("黑桃",?4); hashmap.put("紅桃",?3); hashmap.put("梅花",?2); hashmap.put("方片",?1); return?hashmap.get(o1.getType()).compareTo(hashmap.get(o2.getType())); } }
Player.java?//?玩家類
package?test_pukepa_game; import?java.util.ArrayList; import?java.util.List; //?玩家類 public?class?Player?{ private?Integer??id; private?String?name; private?List<PlayingCard>?cards; public?Player(Integer?id,?String?name)?{ this.id?=?id; this.name?=?name; this.cards?=?new?ArrayList<PlayingCard>(); } public?Integer?getId()?{ return?id; } public?String?getName()?{ return?name; } public?List<PlayingCard>?getCards()?{ return?cards; } }
2018-10-30
shuffle()方法 有這么一個功能:
就可以實現(xiàn)隨機打亂? ?
網(wǎng)址:https://blog.csdn.net/u011514810/article/details/51218784
2018-09-10
樓主我也卡在try語句塊這里了,我查了一些資料,也找到了你這種方法,但是據(jù)說在while語句塊中使用try效率很低,不知道樓主找到替代方法了沒?