Java编程练习——集合框架应用

Posted 云开的立夏

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java编程练习——集合框架应用相关的知识,希望对你有一定的参考价值。

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

运行结果:

博主只是一个菜鸟鸟,大牛们不要客气,直接给建议吧( • ̀ω•́ )✧

以上是关于Java编程练习——集合框架应用的主要内容,如果未能解决你的问题,请参考以下文章

Java学习中注解与多线程,网络编程与XML技术,集合框架等

Java集合框架上机练习题:用户分别从两个文本框输入学生的姓名和分数..........

JAVA-初步认识-常用对象API(集合框架-LinkedList集合-练习栈堆和队列)

集合框架

集合类框架

集合类框架