扑克牌例题与Collections工具类

简介:

扑克牌例题:

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

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

代码示例:

对象属性封装类:

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,如需转载请自行联系原作者
相关文章
|
2天前
|
搜索推荐 编译器 Linux
一个可用于企业开发及通用跨平台的Makefile文件
一款适用于企业级开发的通用跨平台Makefile,支持C/C++混合编译、多目标输出(可执行文件、静态/动态库)、Release/Debug版本管理。配置简洁,仅需修改带`MF_CONFIGURE_`前缀的变量,支持脚本化配置与子Makefile管理,具备完善日志、错误提示和跨平台兼容性,附详细文档与示例,便于学习与集成。
265 116
|
17天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~
|
12天前
|
安全 Java Android开发
深度解析 Android 崩溃捕获原理及从崩溃到归因的闭环实践
崩溃堆栈全是 a.b.c?Native 错误查不到行号?本文详解 Android 崩溃采集全链路原理,教你如何把“天书”变“说明书”。RUM SDK 已支持一键接入。
657 220
|
5天前
|
数据采集 人工智能 自然语言处理
Meta SAM3开源:让图像分割,听懂你的话
Meta发布并开源SAM 3,首个支持文本或视觉提示的统一图像视频分割模型,可精准分割“红色条纹伞”等开放词汇概念,覆盖400万独特概念,性能达人类水平75%–80%,推动视觉分割新突破。
329 32
Meta SAM3开源:让图像分割,听懂你的话
|
10天前
|
人工智能 移动开发 自然语言处理
2025最新HTML静态网页制作工具推荐:10款免费在线生成器小白也能5分钟上手
晓猛团队精选2025年10款真正免费、无需编程的在线HTML建站工具,涵盖AI生成、拖拽编辑、设计稿转代码等多种类型,均支持浏览器直接使用、快速出图与文件导出,特别适合零基础用户快速搭建个人网站、落地页或企业官网。
1520 157
|
存储 人工智能 监控
从代码生成到自主决策:打造一个Coding驱动的“自我编程”Agent
本文介绍了一种基于LLM的“自我编程”Agent系统,通过代码驱动实现复杂逻辑。该Agent以Python为执行引擎,结合Py4j实现Java与Python交互,支持多工具调用、记忆分层与上下文工程,具备感知、认知、表达、自我评估等能力模块,目标是打造可进化的“1.5线”智能助手。
896 61
|
7天前
|
编解码 Linux 数据安全/隐私保护
教程分享免费视频压缩软件,免费视频压缩,视频压缩免费,附压缩方法及学习教程
教程分享免费视频压缩软件,免费视频压缩,视频压缩免费,附压缩方法及学习教程
291 140