• 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

    运行结果:

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

  • 相关阅读:
    屠呦呦团队研究新进展:青蒿中有其他抗疟成分
    lammps模拟化学反应(1)
    伪类的使用--鼠标悬浮效果
    bootstrap中模态框的使用
    idea_2018.1.5版本的激活使用
    火狐浏览器开发者版本
    使用bootstrap的相关配置
    StringBuffer类
    如何判断字符串中大写字母,小写字母和数字出现的次数??
    ssm框架结构的搭建
  • 原文地址:https://www.cnblogs.com/hysum/p/7147237.html
Copyright © 2020-2023  润新知