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 }

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 }


运行结果:

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

时间: 2024-10-29 10:45:47

Java编程练习(四)——集合框架应用的相关文章

Java编程手冊-Collection框架(上)

该文章所讲内容基本涵盖了Collection里面的全部东西,尽管基于jdk 1.5的.可是思路非常清晰 1.引言 1.1 Collection框架的介绍 尽管我们能够使用数组去存储具有同样类型的元素集合(包含基本类型和对象类型),可是数组不支持所谓的动态内存分配,一旦分配之后,它的长度就是固定的,无法改变,另外,数组是一个简单的线性结构.在我们的实际开发中,可能会须要更复杂的数据结构.比如linked list, stack, hash table, sets, 或者 trees. 在Java中

Java 异常处理机制和集合框架

课程  Java面向对象程序设计   实验名称  异常处理机制.集合框架 班级    13级计三          学号  10503                姓名 一.实验目的 掌握面向对象程序设计技术 二.实验环境 1.微型计算机一台 2.WINDOWS操作系统,Java SDK,Eclipse开发环境 三.实验内容 1.Java异常处理机制涉及5个关键字:try.catch.finally.throw.throws,请理解每个关键字的作用,并在编写程序,使用运用这5个关键字,观察效果

Java修炼之道--集合框架

原作地址:https://github.com/frank-lam/2019_campus_apply 前言 Java集合框架 (Java Collections Framework, JCF) 也称容器,这里可以类比 C++ 中的 STL,在市面上似乎还没能找到一本详细介绍的书籍.在这里主要对如下部分进行源码分析,及在面试中常见的问题. 例如,在阿里面试常问到的 HashMap 和 ConcurrentHashMap 原理等等.深入源码分析是面试中必备的技能,通过本文的阅读会对集合框架有更深一

Java基础---泛型、集合框架工具类:collections和Arrays

第一讲     泛型(Generic) 一.概述 1.JDK1.5版本以后出现的新特性.用于解决安全问题,是一个类型安全机制. 2.JDK1.5的集合类希望在定义集合时,明确表明你要向集合中装入那种类型的数据,无法加入指定类型以外的数据. 3.泛型是提供给javac编译器使用的可以限定集合中的输入类型说明的集合时,会去掉“类型”信息,使程序运行效率不受影响,对参数化的泛型类型,getClass()方法的返回值和原始类型完全一样. 4.由于编译生成的字节码会去掉泛型的类型信息,只要能跳过编译器,就

Java面试准备之集合框架

集合框架 Collection:List列表,Set集 Map:Hashtable,HashMap,TreeMap Collection 是单列集合 List 元素是有序的(元素存取是有序).可重复 有序的 collection,可以对列表中每个元素的插入位置进行精确地控制.可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素.可存放重复元素,元素存取是有序的. List接口中常用类: ?Vector:线程安全,但速度慢,已被ArrayList替代.底层数据结构是数组结构 ?Ar

Java核心技术点之集合框架

概述 Java集合框架由Java类库的一系列接口.抽象类以及具体实现类组成.我们这里所说的集合就是把一组对象组织到一起,然后再根据不同的需求操纵这些数据.集合类型就是容纳这些对象的一个容器.也就是说,最基本的集合特性就是把一组对象放一起集中管理.根据集合中是否允许有重复的对象.对象组织在一起是否按某种顺序等标准来划分的话,集合类型又可以细分为许多种不同的子类型. Java集合框架为我们提供了一组基本机制以及这些机制的参考实现,其中基本的集合接口是Collection接口,其他相关的接口还有Ite

【Java学习笔记】集合框架Ⅱ

迭代 ●迭代是取出集合中元素的一种方式. ●因为Collection中有iterator方法,所以每一个子类集合对象都具备迭代器. ●用法: 第一种 for (iterator iter=iterator(); iter.hasNext();) //老外比较喜欢用这种,省内存(iter的内存),开发时用这个 { System.out.println(iter.next()); } 第二种 Iterator iter = l.iterator(); while(iter.hasNext()) {

【Java学习笔记】集合框架Ⅰ

集合类的由来: 对象用于封装特有数据,对象多了需要存储,如果对象的个数不确定. 就使用集合容器进行存储. 集合特点: 1.用于存储对象的容器. 2.集合的长度是可变的. 3.集合中不可以存储基本数据类型值. 集合容器因为内部的数据结构不同,有多种具体容器,不断向上抽取,就形成了集合框架. 框架的顶层是Collection接口. Collection的常见方法: 1.添加 boolean  add(Object obj); boolean  addAll(Collection coll); 2.删

Java笔记(15):集合框架(01)

1.对象数组的概述和使用 1 package cn.itcast_01; 2 3 public class Student { 4 // 成员变量 5 private String name; 6 private int age; 7 8 // 构造方法 9 public Student() { 10 super(); 11 } 12 13 public Student(String name, int age) { 14 super(); 15 this.name = name; 16 thi

Java开发中各种集合框架简介

在大数据MapReduce作业开发中,我们经常会遇到一些大小表的join,这是如果这个小表足够"小"的话,我们可以使用进行"map-join-side",这要就可以有效的降低reduce端的压力,但是在常用的JDK的集合中的Map有些许鸡肋,因此,各路大神们针对这个问题开发出了不同的集合框架,用以替换原始集合,下面我们具体介绍几种常用的集合框架:首先,我们设想了一个场景--计算不同事业部015.2016年老客,新客-转化,新客-新增的用户数量,这三种类型的用户的定义