再次實現一把,一年后再來,看看是否有所長進....
演示效果:
Card
/** ?*?撲克牌類 ?*/ public?class?Card?implements?Comparable<Card>?{ ????private?int?pointsScore;??//手牌的點數 ????private?int?colourScore;??//花色的點數 ????private?String?points;?//牌的名稱 ????private?String?color;?//牌的花色 ????public?Card(int?pointsScore,?int?colourScore,?String?points,?String?color)?{ ????????this.pointsScore?=?pointsScore; ????????this.colourScore?=?colourScore; ????????this.points?=?points; ????????this.color?=?color; ????} ????//重寫Comparable類中compareTo()方法 ????@Override ????public?int?compareTo(Card?c)?{ ????????//如果點數一樣,則比較花色 ????????if?(this.pointsScore?==?c.pointsScore)?{ ????????????//這樣定是降序排序,反著寫就是升序排序 ????????????return?c.colourScore?-?this.colourScore; ????????} ????????//比較花色,降序排序,也就是說容器中最大的下標為0 ????????return?c.pointsScore?-?this.pointsScore; ????} ????@Override ????public?String?toString()?{ ????????return?this.color?+?this.points; ????} ???? }
Poker
import?java.util.ArrayList; import?java.util.Collections; import?java.util.List; /** ?*?整副撲克牌 ?*/ public?class?Poker?{ ????private?List<Card>?cards?=?new?ArrayList<>(); ????public?Poker()?{ ????????createPoker(); ????????randomPoker(); ????} ????/** ?????*?創建撲克牌 ?????*/ ????private?void?createPoker()?{ ????????System.out.println("-------------創建撲克牌...--------------"); ????????String[]?names?=?{"2",?"3",?"4",?"5",?"6",?"7",?"8",?"9",?"10",?"J",?"Q",?"K",?"A"};?//定義一個字符串數組 ????????String[]?colors?=?{"方片",?"梅花",?"紅桃",?"黑桃"}; ????????for?(int?i?=?0;?i?<?names.length;?i++)?{ ????????????for?(int?j?=?0;?j?<?colors.length;?j++)?{ ????????????????cards.add(new?Card(i,?j,?names[i],?colors[j])); ????????????} ????????} ????????System.out.println("-------------撲克牌創建完畢!--------------"); ????????System.out.println(cards);?//輸出 ????} ????/** ?????*?洗牌 ?????*/ ????public?void?randomPoker()?{ ????????System.out.println("-------------開始洗牌--------------"); ????????Collections.shuffle(cards);??//調用Collections類中shuffle()方法就好了 ????????System.out.println("-------------洗牌結束!--------------"); ????} ????/** ?????*?根據索引獲取撲克牌 ?????*?@param?index ?????*?@return ?????*/ ????public?Card?get(int?index)?{ ????????return?this.cards.get(index); ????} ????/** ?????*?獲取撲克牌的數量 ?????*?@return ?????*/ ????public?int?size()?{ ????????return?this.cards.size(); ????} }
Player
import?java.util.ArrayList; import?java.util.Collections; import?java.util.List; /** ?*?玩家類 ?*/ public?class?Player?implements?Comparable<Player>?{ ????private?int?id;?//玩家ID ????private?String?name;?//玩家姓名 ????private?Card?maxCard;?//?玩家手中最大的牌 ????private?List<Card>?cards?=?new?ArrayList<>();?//存放玩家手中的牌的容器 ????public?Player(int?id,?String?name)?{ ????????this.id?=?id; ????????this.name?=?name; ????} ????public?int?getId()?{ ????????return?id; ????} ????public?String?getName()?{ ????????return?name; ????} ????public?List<Card>?getCards()?{ ????????return?cards; ????} ????//獲取玩家手中最大的牌的方法 ????public?Card?getMaxCard()?{ ????????if?(this.maxCard?==?null)?{ ????????????//先排序,由于重寫了Poker類中compareTo()方法,下標為0的為最大值 ????????????Collections.sort(cards); ????????????this.maxCard?=?cards.get(0); ????????} ????????return?this.maxCard; ????} ????@Override ????public?int?compareTo(Player?o)?{ ????????//?按照玩家最大的牌進行排序,獲取玩家排在最前面 ????????return?this.getMaxCard().compareTo(o.getMaxCard()); ????} ????public?void?add(Card?card)?{ ????????System.out.println("--玩家["?+?this.getName()?+?"]拿牌:"?+?card); ????????this.cards.add(card); ????} ????/** ?????*?輸出玩家最大的手牌 ?????*/ ????public?void?showMaxCard()?{ ????????System.out.println("玩家["?+?this.getName()?+?"]最大的手牌為:"?+?this.getMaxCard()); ????} ????/** ?????*?輸出玩家各自手牌 ?????*/ ????public?void?showCards()?{ ????????System.out.println(this.getName()?+?":"?+?this.getCards()); ????} }
PokerGame
import?java.util.ArrayList; import?java.util.Collections; import?java.util.List; import?java.util.Scanner; import?java.util.function.Function; /** ?*?撲克游戲 ?*/ public?class?PokerGame?{ ????private?List<Player>?players?=?new?ArrayList<>();?//用來存放玩家 ????private?Poker?poker?=?new?Poker();?//?整副撲克牌 ????private?Scanner?scanner?=?new?Scanner(System.in);?//?接收用戶在控制臺輸入的信息 ????/** ?????*?啟動方法 ?????*/ ????public?void?startGame()?{ ????????creatPlayer();?//創建玩家 ????????dealPoker();?//?發牌 ????????comparePoker();?//統計 ????} ????/** ?????*?創建玩家 ?????*/ ????public?void?creatPlayer()?{ ????????System.out.println("-------------創建玩家...--------------"); ????????int?playerNum?=?getInput("請輸入玩家數量:",?playerCount?->?{ ????????????if?(playerCount?<?2)?{ ????????????????System.out.println("玩家數量最少有2位!請重新輸入!"); ????????????????return?false; ????????????} ????????????if?(playerCount?>?poker.size())?{ ????????????????System.out.println("輸入的玩家數量不能大于撲克牌的數量("?+?poker.size()?+?")!請重新輸入!"); ????????????????return?false; ????????????} ????????????return?true; ????????}); ????????for?(int?i?=?1;?i?<=?playerNum;?i++)?{?//這所以寫個循環,是為了方便修改玩家的人數,只需改一下循環的判斷條件就好了 ????????????System.out.print("請輸入第"?+?i?+?"位玩家的姓名:"); ????????????players.add(new?Player(i,?scanner.next())); ????????} ????????//?輸出各位玩家信息 ????????for?(Player?player?:?players)?{ ????????????System.out.println("----歡迎玩家:"?+?player.getName()); ????????} ????} ????/** ?????*?發牌 ?????*/ ????public?void?dealPoker()?{ ????????System.out.println("-------------開始發牌...--------------"); ????????int?cardNum?=?getInput("請設置給每個玩家發多少張牌:",?cardCount?->?{ ????????????if?(cardCount?<=?0)?{ ????????????????System.out.println("發牌數不能必須大于0,請重新輸入!"); ????????????????return?false; ????????????} ????????????if?(cardCount?*?players.size()?>?poker.size())?{ ????????????????System.out.println("非法的發牌數,總發牌數量不能超過撲克牌的數量("?+?poker.size()?+?")!請重新輸入!"); ????????????????return?false; ????????????} ????????????return?true; ????????}); ????????int?limit?=?players.size()?*?cardNum; ????????for?(int?i?=?0;?i?<?limit;?i++)?{ ????????????players.get(i?%?players.size()).add(poker.get(i)); ????????} ????????System.out.println("-------------發牌結束...--------------"); ????} ????/** ?????*?統計 ?????*/ ????public?void?comparePoker()?{ ????????System.out.println("-------------開始統計...--------------"); ????????players.forEach(Player::showMaxCard); ????????Player?winner?=?getWinner(); ????????System.out.println("-------------玩家["?+?winner.getName()?+?"]獲勝!--------------"); ????????System.out.println("玩家各自的手牌為:"); ????????players.forEach(Player::showCards); ????} ????private?Player?getWinner()?{ ????????//?對所有玩家進行排序,排序規則參考Player.compareTo()方法 ????????Collections.sort(players); ????????//?得到獲勝玩家 ????????return?players.get(0); ????} ????/** ?????*?從控制臺接受用戶輸入的一個正整數 ?????* ?????*?@param?hint?????提示信息 ?????*?@param?function?用戶判斷用戶輸入的信息是否合法,如果不合法,需要重新輸入 ?????*?@return ?????*/ ????private?int?getInput(String?hint,?Function<Integer,?Boolean>?function)?{ ????????while?(true)?{ ????????????System.out.print(hint); ????????????try?{ ????????????????int?input?=?scanner.nextInt(); ????????????????if?(!function.apply(input))?{ ????????????????????continue; ????????????????} ????????????????return?input; ????????????}?catch?(Exception?e)?{ ????????????????System.out.println("輸入不合法!請重新輸入!"); ????????????????//?如果出現異常,則跳過本次輸入的信息 ????????????????scanner?=?scanner.skip(".*"); ????????????} ????????} ????} }
Test
/** ?*?測試類 ?*/ public?class?Test?{ ????public?static?void?main(String[]?args)?{ ????????new?PokerGame().startGame(); ????} }
2021-11-23
前輩,寫得好精簡啊!真厲害,感謝分享,我寫得好爛啊,不知道你之前是怎么提升的呢?