Java集合框架小應用之撲克牌小游戲 學習了Java集合框架之後,我寫了一個撲克牌小游戲來鞏固知識。學習之餘的練習之作,有不足之處還得多多指教了~(*/ω\*) 撲克牌小游戲背景: 1. 創建一副撲克牌,不考慮大小王 包括四種花色:黑桃、紅桃、梅花、方片 十三種點數:2-10,J Q K A 2. ...
Java集合框架小應用之撲克牌小游戲
學習了Java集合框架之後,我寫了一個撲克牌小游戲來鞏固知識。學習之餘的練習之作,有不足之處還得多多指教了~(*/ω\*)
撲克牌小游戲背景:
1. 創建一副撲克牌,不考慮大小王
包括四種花色:黑桃、紅桃、梅花、方片
十三種點數:2-10,J Q K A
2. 創建兩名玩家,玩家至少要有ID、姓名、手牌等屬性,手牌為撲克牌的集合
3. 洗牌,將之前創建的撲克牌順序打亂(說明是有序的)
4. 發牌,將洗牌之後的撲克牌集合,從第一張開始,發給兩名玩家,按照一人一張的方式,每人發兩張
5. 開始游戲,比大小,取兩人各自的點數最大的牌進行比較,點數大的贏,若大小相同比花色(黑紅梅方)
直接上代碼,就是那麼簡單粗暴!
1)Poker類(撲克牌類)
1 import java.util.HashMap; 2 import java.util.Map; 3 import java.util.Scanner; 4 5 /** 6 * 撲克牌類 7 * @author acer 8 * 9 */ 10 public class Poker implements Comparable<Poker>{ 11 private Scanner in; 12 private String kind;//花色 13 private int size;//點數大小 14 PokerMap map=new PokerMap(); 15 private class PokerMap{//內部類 16 public Map<String,Integer> kinds; 17 public Map<Integer,String> sizes; 18 { //初始化 19 kinds=new HashMap<String,Integer>(); 20 kinds.put("黑桃",4); 21 kinds.put("紅桃",3); 22 kinds.put("梅花",2); 23 kinds.put("方片",1); 24 25 sizes=new HashMap<Integer,String>(); 26 sizes.put(2,2+""); 27 sizes.put(3,3+""); 28 sizes.put(4,4+""); 29 sizes.put(5,5+""); 30 sizes.put(6,6+""); 31 sizes.put(7,7+""); 32 sizes.put(8,8+""); 33 sizes.put(9,9+""); 34 sizes.put(10,10+""); 35 sizes.put(11,"J"); 36 sizes.put(12,"Q"); 37 sizes.put(13,"K"); 38 sizes.put(1,"A"); 39 40 } 41 42 } 43 public Poker(){} 44 45 public Poker(String kind,int size){ 46 while(!map.kinds.containsKey(kind)){ 47 System.out.println("創建撲克牌花色有誤,請重新創建花色!"); 48 in=new Scanner(System.in); 49 kind=in.next(); 50 } 51 this.kind=kind; 52 while(!map.sizes.containsKey(size)){ 53 System.out.println("創建撲克牌點數有誤,請重新創建點數!"); 54 in=new Scanner(System.in); 55 size=in.nextInt(); 56 } 57 this.size=size; 58 59 60 61 62 } 63 @Override 64 public String toString() { 65 return kind+":"+map.sizes.get(size); 66 } 67 68 public String getKind() { 69 return kind; 70 } 71 public void setKind(String kind) { 72 this.kind = kind; 73 } 74 public String getSizeMap() { 75 return map.sizes.get(size); 76 } 77 public int getSize(){ 78 return size; 79 } 80 public void setSize(int size) { 81 this.size = size; 82 } 83 84 85 86 @Override 87 public int compareTo(Poker o) {//預設比較大小 88 // TODO Auto-generated method stub 89 if(Integer.valueOf(this.size).compareTo(o.getSize())!=0){//如果點數不同 90 return Integer.valueOf(this.size).compareTo(o.getSize());//比較點數 91 }else{//點數相同 92 return map.kinds.get(this.getKind()).compareTo(map.kinds.get(o.getKind()));//比較花色 93 } 94 95 } 96 97 98 99 }View Code
2)PokerList類(一副撲克牌類)
1 import java.util.ArrayList; 2 import java.util.Arrays; 3 import java.util.List; 4 import java.util.Random; 5 6 /* 7 * 一副有序的撲克牌類 8 */ 9 public class PokerList { 10 private List<Poker> pokerList; 11 public PokerList(){ 12 setPokerList(new ArrayList<Poker>()); 13 } 14 /* 15 * 創建一副有序的撲克牌 16 */ 17 public void creatPokerList(){ 18 Poker[] list=new Poker[52];//總共有52張牌 19 for(int i=0;i<list.length;i++){ 20 if(i<=12){ 21 list[i]=new Poker("黑桃",i+1); 22 } 23 if(i>=13&&i<=25){ 24 list[i]=new Poker("紅桃",i%13+1); 25 } 26 if(i>=26&&i<=38){ 27 list[i]=new Poker("梅花",i%13+1); 28 } 29 if(i>=39){ 30 list[i]=new Poker("方片",i%13+1); 31 } 32 } 33 pokerList.addAll(Arrays.asList(list));//將數組添加到集合 34 } 35 /* 36 * 列印輸出一副撲克牌 37 */ 38 public void printPokerList(){ 39 System.out.println("撲克牌為:"); 40 41 int count=0; 42 for(Poker p:pokerList){ 43 System.out.print(p+" "); 44 count++; 45 if(count%13==0) 46 System.out.println(); 47 } 48 49 50 } 51 /* 52 * 打亂撲克牌順序 53 */ 54 public void shufflePokerList(){ 55 Random random=new Random(); 56 Poker temp; 57 //任意從list中取兩個元素交換位置,迴圈52次 58 for(int i=0;i<pokerList.size();i++){ 59 int index1=random.nextInt(pokerList.size()-1); 60 int index2=random.nextInt(pokerList.size()-1); 61 temp=pokerList.get(index1); 62 pokerList.set(index1, pokerList.get(index2)); 63 pokerList.set(index2, temp); 64 } 65 } 66 public List<Poker> getPokerList() { 67 return pokerList; 68 } 69 public void setPokerList(List<Poker> pokerList) { 70 this.pokerList = pokerList; 71 } 72 }View Code
3)Player類(玩家類)
1 import java.util.ArrayList; 2 import java.util.List; 3 4 /* 5 * 游戲玩家類 6 */ 7 public class Player { 8 private String id;//玩家id 9 10 private String name;//玩家姓名 11 12 private List<Poker> myPoker;//玩家手牌Set集合 13 14 public Player(){setMyPoker(new ArrayList<Poker>());}//初始化Set集合} 15 16 public Player(String id,String name){ 17 this(); 18 this.id=id; 19 this.name=name; 20 } 21 public String printMyPoker(){ 22 return myPoker.toString(); 23 } 24 public String getId() { 25 return id; 26 } 27 public void setId(String id) { 28 this.id = id; 29 } 30 public String getName() { 31 return name; 32 } 33 public void setName(String name) { 34 this.name = name; 35 } 36 37 public List<Poker> getMyPoker() { 38 return myPoker; 39 } 40 41 public void setMyPoker(List<Poker> myPoker) { 42 this.myPoker = myPoker; 43 } 44 45 46 }View Code
4)PokerMain類(主方法類)
1 import java.util.Collections; 2 import java.util.Scanner; 3 4 /** 5 * 1.創建一副撲克牌,不考慮大小王 包括四種花色:黑桃、紅桃、梅花、方片 十三種點數:2-10,J Q K A 6 * 2.創建兩名玩家,玩家至少要有ID、姓名、手牌等屬性,手牌為撲克牌的集合 7 * 3.洗牌,將之前創建的撲克牌順序打亂(說明是有序的) 8 * 4.發牌,將洗牌之後的撲克牌集合,從第一張開始,發給兩名玩家,按照一人一張的方式,每人發兩張 9 * 5.開始游戲,比大小,取兩人各自的點數最大的牌進行比較,點數大的贏,若大小相同比花色(黑紅梅方) 10 * @author acer 11 * 12 */ 13 public class PokerMain { 14 PokerList pList; 15 static Scanner in; 16 { 17 pList=new PokerList(); 18 in=new Scanner(System.in); 19 } 20 /* 21 * 1.創建一副撲克牌,不考慮大小王 包括四種花色:黑桃、紅桃、梅花、方片 十三種點數:2-10,J Q K A 22 */ 23 public void CreatPoker(){ 24 System.out.println("----------創建撲克牌----------"); 25 pList.creatPokerList(); 26 System.out.println("----------創建撲克牌成功----------"); 27 pList.printPokerList(); 28 } 29 /* 30 * 3.洗牌,將之前創建的撲克牌順序打亂 31 */ 32 public void ShufflePoker(){ 33 System.out.println("----------開始洗牌----------"); 34 pList.shufflePokerList(); 35 System.out.println("----------洗牌結束----------"); 36 37 } 38 39 /* 40 * 4.發牌,將洗牌之後的撲克牌集合,從第一張開始,發給兩名玩家,按照一人一張的方式,每人發兩張 41 */ 42 public void PlayPoker(Player p1,Player p2){ 43 System.out.println("----------開始發牌----------"); 44 int i=1; 45 while(i<=4){ 46 if(i%2!=0){ 47 p1.getMyPoker().add(pList.getPokerList().get(i-1)); 48 System.out.println("---玩家:"+p1.getName()+"-拿牌"); 49 }else{ 50 p2.getMyPoker().add(pList.getPokerList().get(i-1)); 51 System.out.println("---玩家:"+p2.getName()+"-拿牌"); 52 } 53 i++; 54 } 55 System.out.println("----------發牌結束----------"); 56 } 57 /* 58 * 5.開始游戲,比大小,取兩人各自的點數最大的牌進行比較,點數大的贏,若大小相同比花色(黑紅梅方) 59 */ 60 public void StartGame(Player p1,Player p2){ 61 System.out.println("----------開始游戲----------"); 62 Collections.sort(p1.getMyPoker()); 63 System.out.println("---玩家:"+p1.getName()+"最大手牌為:"+p1.getMyPoker().get(1)); 64 Collections.sort(p2.getMyPoker()); 65 System.out.println("---玩家:"+p2.getName()+"最大手牌為:"+p2.getMyPoker().get(1)); 66 switch(p1.getMyPoker().get(1).compareTo(p2.getMyPoker().get(1))){ 67 case 1:System.out.println("----------玩家:"+p1.getName()+"獲勝!----------"); 68 break; 69 case -1:System.out.println("----------玩家:"+p2.getName()+"獲勝!----------"); 70 break; 71 case 0:System.out.println("----------平局!!----------"); 72 break; 73 default: 74 75 break; 76 } 77 System.out.println("玩家各自的手牌為:"); 78 System.out.println(p1.getName()+":"+p1.printMyPoker()); 79 System.out.println(p2.getName()+":"+p2.printMyPoker()); 80 } 81 public static void main(String[] args) { 82 // TODO Auto-generated method stub 83 PokerMain test=new PokerMain(); 84 test.CreatPoker(); 85 test.ShufflePoker(); 86 System.out.println("----------創建玩家----------"); 87 System.out.println("請輸入第一位玩家的姓名和id"); 88 System.out.println("輸入id:"); 89 String id=in.next(); 90 System.out.println("輸入姓名:"); 91 String name=in.next(); 92 Player p1=new Player(id,name); 93 System.out.println("請輸入第二位玩家的姓名和id"); 94 System.out.println("輸入id:"); 95 id=in.next(); 96 System.out.println("輸入姓名:"); 97 name=in.next(); 98 Player p2=new Player(id,name); 99 System.out.println("---歡迎玩家1:"+p1.getName()); 100 System.out.println("---歡迎玩家2:"+p2.getName()); 101 test.PlayPoker(p1, p2); 102 test.StartGame(p1, p2); 103 in.close(); 104 } 105 106 }View Code
運行結果:
博主只是一個菜鳥鳥,大牛們不要客氣,直接給建議吧( • ̀ω•́ )✧