扑克牌例题与Collections工具类
发布日期:2021-08-29 00:27:02 浏览次数:0 分类:技术文章

扑克牌例题:

使用集合写一个具有发牌功能的扑克牌程序。

我们需要创建四个类,一个封装对象的属性,一个封装牌的花色和大小也就是牌的类型,一个实现发牌,排序,洗牌功能,也就是封装对象的行为,最后一个实现图形化界面。

代码示例:

对象属性封装类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
package  poker;
  
public  class  Poker {
//封装对象的属性
public  Poker(String title, String image, Type type,  int  daxiao) {
this .title = title;
this .image = image;
this .type = type;
this .daxiao = daxiao;
}
  
private  String title;  // 牌面标题
private  String image;  // 照片文件
private  int  daxiao;  // 牌的大小
private  Type type;  //牌的花色
  
public  String getTitle() {
return  title;
public  void  setTitle(String title) {
this .title = title;
public  String getImage() {
return  image;
public  void  setImage(String image) {
this .image = image;
}
public  int  getDaxiao() {
return  daxiao;
}
public  void  setDaxiao( int  daxiao) {
this .daxiao = daxiao;
}
public  Type getTypu() {
return  type;
}
public  void  setTypu(Type typu) {
this .type = typu;
}



牌的类型封装类,使用一个枚举器:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package  poker;
public  enum  Type {
HONGTAO( "hong" 3 ), HEITAO( "hei" 4 ), MEIHUA( "mei" 2 ), FANGKUAI( "fang" 1 );
// 两个变量一个储存花色,一个存储牌的大小
private  String name;
private  int  num;
  
private  Type(String name,  int  num) {
this .name = name;
this .num = num;
 
// 只提供get方法
public  String getName() {
return  name;
 
public  int  getNum() {
return  num;
}



对象方法实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
package  poker;
  
import  java.util.ArrayList;
import  java.util.Collections;
import  java.util.Iterator;
  
public  class  Method {
  
public  static  ArrayList[] getPoker() {
ArrayList<Poker> array =  new  ArrayList<>();
  
String[] titles = {  "3" "4" "5" "6" "7" "8" "9" "10" "J" "Q" "K" "A" "2"  }; // 牌面的数字
String[] imagename = {  "03" "04" "05" "06" "07" "08" "09" "10" "_j" , "_q" "_k" "01" "02"  }; // 照片文件的后缀
  
// 把所有花色的牌加入集合中
for  (Type type : Type.values()) {
int  daxiao =  10  + type.getNum();  // 牌的大小
int  imageIndex =  0 // 记录照片文件的后缀数组的下标
  
for  (String title : titles) {  // 遍历牌面的数字
Poker p =  new  Poker(title, type.getName() + imagename[imageIndex++] +  ".jpg" , type, daxiao +=  10 );  // 储存每张牌的牌面数字、照片地址、牌的花色、牌的大小
array.add(p);  // 把每一张牌作为一个对象存储进集合中
}
}
  
// 单独处理大小王的数据注册
Poker dw =  new  Poker( "大王" "dagui.jpg" , Type.FANGKUAI,  300 );
array.add(dw);
Poker xw =  new  Poker( "小王" "xiaogui.jpg" , Type.FANGKUAI,  200 );
array.add(xw);
  
Collections.shuffle(array);  // 使用Collections操作类中的混排方法来实现洗牌功能
  
// 发出三副牌
ArrayList[] trees =  new  ArrayList[] {  new  ArrayList<Poker>(),  new  ArrayList<Poker>(),  new  ArrayList<Poker>() };
  
// 使用迭达器拿值
Iterator it = array.iterator();
  
// 均匀的发出17张牌
for  (ArrayList arrayList : trees) {
for  ( int  i =  0 ; i <  54  3 ; i++) {
if (it.hasNext()){
arrayList.add(it.next());
}
}
}
  
// 将三副牌拿出来,然后使用冒泡排序法排序
for  (ArrayList<Poker> arrayList : trees) {
for  ( int  i =  0 ; i < arrayList.size(); i++) {
for  ( int  j = arrayList.size()- 1 ; j > i; j--) {
if  (arrayList.get(j).getDaxiao() > arrayList.get(j -  1 ).getDaxiao()) {
Poker p2 = arrayList.get(j);
 
arrayList.set(j, arrayList.get(j- 1 ));
arrayList.set(j -  1 , p2);
}
}
}
}
return  trees;  // 将最后处理好的三副牌返回出去
}
}



实现图形化界面:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
package  poker;
  
import  java.awt.BorderLayout;
import  java.awt.EventQueue;
import  java.util.ArrayList;
  
import  javax.swing.ImageIcon;
import  javax.swing.JFrame;
import  javax.swing.JLabel;
import  javax.swing.JPanel;
import  javax.swing.border.EmptyBorder;
  
public  class  JFramePoker  extends  JFrame {
  
private  JPanel contentPane;
  
/**
  * Launch the application.
  */
public  static  void  main(String[] args) {
EventQueue.invokeLater( new  Runnable() {
public  void  run() {
try  {
JFramePoker frame =  new  JFramePoker();
frame.setVisible( true );
catch  (Exception e) {
e.printStackTrace();
}
}
});
}
  
/**
  * Create the frame.
  */
public  JFramePoker() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds( 500 100 1121 871 );
setTitle( "发牌" );
setResizable( false );
contentPane =  new  JPanel();
contentPane.setLayout( null );
setContentPane(contentPane);
  
ArrayList[] trees = Method.getPoker();  //将存储了三副牌的集合拿出来
int  row =  0 //记录图片y坐标的位置
for  (ArrayList arrayList : trees) {  //将牌一副副拿出来
for  ( int  i = arrayList.size() -  1 ; i >=  0 ; i--) {  //将牌一张张的拿出来,并且将原本牌的顺序反过来
Poker p = (Poker) arrayList.get(i);  //将每一张牌转换成对象
//添加照片
final  JLabel label =  new  JLabel( new  ImageIcon( "image/"  + p.getImage())); 
label.setBounds(i *  40 , row,  170 259 );
getContentPane().add(label);
}
row +=  270 //每发一张牌就改变一下坐标位置
}
}
}





Collections集合工具类:

此类的操作都是针对List系列的集合,能对集合实现排序等操作,但是如果需要排序自己写的类的实例化对象的话,需要在需要排序的类里重写compareTo();方法。

 

compareTo();方法:

 此方法返回的是3个数字:1 0 -1,1代表大于,0代表等于,-1则代表小于,就是利用这3个数字来进行判断排序。

 

代码示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
public  class  Student  implements  Comparable<Student> {
  
public  Student(String name, String address,  int  age) {
  
this .name = name;
this .address = address;
this .age = age;
}
  
private  String name;
private  int  age;
private  String address;
  
public  String getAddress() {
return  address;
}
  
public  void  setAddress(String address) {
this .address = address;
}
  
public  int  getAge() {
return  age;
}
  
public  void  setAge( int  age) {
this .age = age;
}
  
public  String getName() {
return  name;
}
  
public  void  setName(String name) {
this .name = name;
}
  
//重写compareTo方法,按照name属性来排序
public  int  compareTo(Student o) {
  
return  this .name.compareTo(o.name);
}
  
}





本文转自 ZeroOne01 51CTO博客,原文链接:http://blog.51cto.com/zero01/1976557,如需转载请自行联系原作者
上一篇:grep、egrep正则表达式之初窥门径
下一篇:centos5安装supervisor 3.1.3

关于作者

    白红宇是个全栈工程师,前端vue,小程序,app开发到后端框架设计,数据库设计,环境部署上线运维。

最新文章

绝地求生服务器维护9月19日,《绝地求生》9月19日上午停机更新维护 修复诸多BUG... 2021-11-18
telnet服务器位置,教你更改telnet默认根路径的方法 2021-11-18
方舟生存服务器没有响应怎么办,方舟生存进化搜服务器闪退怎么办? Fata error临时解决办法一览... 2021-11-18
南开大学计算机考博参考书目,南开大学胡翠娥导师博士生招生参考书目 2021-11-18
计算机竞赛设计思路怎么写,青少年信息学(计算机)竞赛:程序设计的基本方法(2)... 2021-11-18
计算机忘了考研大纲,2018计算机考研大纲原文(完整版) 2021-11-18
计算机采用地进制是因为,计算机中采用二进制,是因为什么? 2021-11-18
软件测试的SQL语句,软件测试人员需掌握的SQL语句集锦 2021-11-18
计算机导论中 网络课程的引入,依托学科课程体系的《计算机导论》课程改革... 2021-11-18
微型计算机ROM和RAM,4微机中ROM和RAM的区别是什么 2021-11-18
mysql错误代码1054,MySQL错误#1054-“字段列表”中的未知列 2021-11-18
gitlab 构建tag,GitLab CI-添加标签时避免构建 2021-11-18
anaconda安装不同版本python,如何在Anaconda中为不同的Python版本安装软件包? 2021-11-18
计算机网络原理统考题,计算机网络原理考试题及答案 2021-11-18
无法安装驱动程序 此计算机上不存在英特尔适配器,win10系统提示无法安装驱动程序,此计算机中没有Intel适配器怎么办... 2021-11-18
html劫持测试,HTML5 MutationObserver检测页面劫持 2021-11-18
计算机语言学大会,第二十届中国计算语言学大会(CCL 2021)征稿启事 2021-11-18
Windows10怎么用计算机,Win10重置此电脑怎么用 2021-11-18
你有必要不沾计算机一段时间英语,新人教版八年级英语下册unit 1必背词组及句子... 2021-11-18
计算机重启如何进行用户选择,怎么才能让电脑开机时有两个用户出现供挑选?有一个是Administrator,还有一个好像是管理员... 2021-11-18