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 }
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 }
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 }
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 }
运行结果:
博主只是一个菜鸟鸟,大牛们不要客气,直接给建议吧( • ̀ω•́ )✧