扑克牌例题:
使用集合写一个具有发牌功能的扑克牌程序。
我们需要创建四个类,一个封装对象的属性,一个封装牌的花色和大小也就是牌的类型,一个实现发牌,排序,洗牌功能,也就是封装对象的行为,最后一个实现图形化界面。
代码示例:
对象属性封装类:
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
<code>package</code> <code>poker;</code>
<code> </code>
<code>public</code> <code>class</code> <code>Poker {</code>
<code>//封装对象的属性</code>
<code>public</code> <code>Poker(String title, String image, Type type, </code><code>int</code> <code>daxiao) {</code>
<code>this</code><code>.title = title;</code>
<code>this</code><code>.image = image;</code>
<code>this</code><code>.type = type;</code>
<code>this</code><code>.daxiao = daxiao;</code>
<code>}</code>
<code>private</code> <code>String title; </code><code>// 牌面标题</code>
<code>private</code> <code>String image; </code><code>// 照片文件</code>
<code>private</code> <code>int</code> <code>daxiao; </code><code>// 牌的大小</code>
<code>private</code> <code>Type type; </code><code>//牌的花色</code>
<code>public</code> <code>String getTitle() {</code>
<code>return</code> <code>title;</code>
<code>public</code> <code>void</code> <code>setTitle(String title) {</code>
<code>public</code> <code>String getImage() {</code>
<code>return</code> <code>image;</code>
<code>public</code> <code>void</code> <code>setImage(String image) {</code>
<code>public</code> <code>int</code> <code>getDaxiao() {</code>
<code>return</code> <code>daxiao;</code>
<code>public</code> <code>void</code> <code>setDaxiao(</code><code>int</code> <code>daxiao) {</code>
<code>public</code> <code>Type getTypu() {</code>
<code>return</code> <code>type;</code>
<code>public</code> <code>void</code> <code>setTypu(Type typu) {</code>
<code>this</code><code>.type = typu;</code>
牌的类型封装类,使用一个枚举器:
<code>public</code> <code>enum</code> <code>Type {</code>
<code>HONGTAO(</code><code>"hong"</code><code>, </code><code>3</code><code>), HEITAO(</code><code>"hei"</code><code>, </code><code>4</code><code>), MEIHUA(</code><code>"mei"</code><code>, </code><code>2</code><code>), FANGKUAI(</code><code>"fang"</code><code>, </code><code>1</code><code>);</code>
<code>// 两个变量一个储存花色,一个存储牌的大小</code>
<code>private</code> <code>String name;</code>
<code>private</code> <code>int</code> <code>num;</code>
<code>private</code> <code>Type(String name, </code><code>int</code> <code>num) {</code>
<code>this</code><code>.name = name;</code>
<code>this</code><code>.num = num;</code>
<code>// 只提供get方法</code>
<code>public</code> <code>String getName() {</code>
<code>return</code> <code>name;</code>
<code>public</code> <code>int</code> <code>getNum() {</code>
<code>return</code> <code>num;</code>
对象方法实现:
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
<code>import</code> <code>java.util.ArrayList;</code>
<code>import</code> <code>java.util.Collections;</code>
<code>import</code> <code>java.util.Iterator;</code>
<code>public</code> <code>class</code> <code>Method {</code>
<code>public</code> <code>static</code> <code>ArrayList[] getPoker() {</code>
<code>ArrayList<Poker> array = </code><code>new</code> <code>ArrayList<>();</code>
<code>String[] titles = { </code><code>"3"</code><code>, </code><code>"4"</code><code>, </code><code>"5"</code><code>, </code><code>"6"</code><code>, </code><code>"7"</code><code>, </code><code>"8"</code><code>, </code><code>"9"</code><code>, </code><code>"10"</code><code>, </code><code>"J"</code><code>, </code><code>"Q"</code><code>, </code><code>"K"</code><code>, </code><code>"A"</code><code>, </code><code>"2"</code> <code>};</code><code>// 牌面的数字</code>
<code>String[] imagename = { </code><code>"03"</code><code>, </code><code>"04"</code><code>, </code><code>"05"</code><code>, </code><code>"06"</code><code>, </code><code>"07"</code><code>, </code><code>"08"</code><code>, </code><code>"09"</code><code>, </code><code>"10"</code><code>, </code><code>"_j"</code><code>,</code><code>"_q"</code><code>, </code><code>"_k"</code><code>, </code><code>"01"</code><code>, </code><code>"02"</code> <code>};</code><code>// 照片文件的后缀</code>
<code>// 把所有花色的牌加入集合中</code>
<code>for</code> <code>(Type type : Type.values()) {</code>
<code>int</code> <code>daxiao = </code><code>10</code> <code>+ type.getNum(); </code><code>// 牌的大小</code>
<code>int</code> <code>imageIndex = </code><code>0</code><code>; </code><code>// 记录照片文件的后缀数组的下标</code>
<code>for</code> <code>(String title : titles) { </code><code>// 遍历牌面的数字</code>
<code>Poker p = </code><code>new</code> <code>Poker(title, type.getName() + imagename[imageIndex++] + </code><code>".jpg"</code><code>, type, daxiao += </code><code>10</code><code>); </code><code>// 储存每张牌的牌面数字、照片地址、牌的花色、牌的大小</code>
<code>array.add(p); </code><code>// 把每一张牌作为一个对象存储进集合中</code>
<code>// 单独处理大小王的数据注册</code>
<code>Poker dw = </code><code>new</code> <code>Poker(</code><code>"大王"</code><code>, </code><code>"dagui.jpg"</code><code>, Type.FANGKUAI, </code><code>300</code><code>);</code>
<code>array.add(dw);</code>
<code>Poker xw = </code><code>new</code> <code>Poker(</code><code>"小王"</code><code>, </code><code>"xiaogui.jpg"</code><code>, Type.FANGKUAI, </code><code>200</code><code>);</code>
<code>array.add(xw);</code>
<code>Collections.shuffle(array); </code><code>// 使用Collections操作类中的混排方法来实现洗牌功能</code>
<code>// 发出三副牌</code>
<code>ArrayList[] trees = </code><code>new</code> <code>ArrayList[] { </code><code>new</code> <code>ArrayList<Poker>(), </code><code>new</code> <code>ArrayList<Poker>(), </code><code>new</code> <code>ArrayList<Poker>() };</code>
<code>// 使用迭达器拿值</code>
<code>Iterator it = array.iterator();</code>
<code>// 均匀的发出17张牌</code>
<code>for</code> <code>(ArrayList arrayList : trees) {</code>
<code>for</code> <code>(</code><code>int</code> <code>i = </code><code>0</code><code>; i < </code><code>54</code> <code>/ </code><code>3</code><code>; i++) {</code>
<code>if</code><code>(it.hasNext()){</code>
<code>arrayList.add(it.next());</code>
<code>// 将三副牌拿出来,然后使用冒泡排序法排序</code>
<code>for</code> <code>(ArrayList<Poker> arrayList : trees) {</code>
<code>for</code> <code>(</code><code>int</code> <code>i = </code><code>0</code><code>; i < arrayList.size(); i++) {</code>
<code>for</code> <code>(</code><code>int</code> <code>j = arrayList.size()-</code><code>1</code><code>; j > i; j--) {</code>
<code>if</code> <code>(arrayList.get(j).getDaxiao() > arrayList.get(j - </code><code>1</code><code>).getDaxiao()) {</code>
<code>Poker p2 = arrayList.get(j);</code>
<code>arrayList.set(j, arrayList.get(j-</code><code>1</code><code>));</code>
<code>arrayList.set(j - </code><code>1</code><code>, p2);</code>
<code>return</code> <code>trees; </code><code>// 将最后处理好的三副牌返回出去</code>
实现图形化界面:
<code>import</code> <code>java.awt.BorderLayout;</code>
<code>import</code> <code>java.awt.EventQueue;</code>
<code>import</code> <code>javax.swing.ImageIcon;</code>
<code>import</code> <code>javax.swing.JFrame;</code>
<code>import</code> <code>javax.swing.JLabel;</code>
<code>import</code> <code>javax.swing.JPanel;</code>
<code>import</code> <code>javax.swing.border.EmptyBorder;</code>
<code>public</code> <code>class</code> <code>JFramePoker </code><code>extends</code> <code>JFrame {</code>
<code>private</code> <code>JPanel contentPane;</code>
<code>/**</code>
<code> </code><code>* Launch the application.</code>
<code> </code><code>*/</code>
<code>public</code> <code>static</code> <code>void</code> <code>main(String[] args) {</code>
<code>EventQueue.invokeLater(</code><code>new</code> <code>Runnable() {</code>
<code>public</code> <code>void</code> <code>run() {</code>
<code>try</code> <code>{</code>
<code>JFramePoker frame = </code><code>new</code> <code>JFramePoker();</code>
<code>frame.setVisible(</code><code>true</code><code>);</code>
<code>} </code><code>catch</code> <code>(Exception e) {</code>
<code>e.printStackTrace();</code>
<code>});</code>
<code> </code><code>* Create the frame.</code>
<code>public</code> <code>JFramePoker() {</code>
<code>setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);</code>
<code>setBounds(</code><code>500</code><code>, </code><code>100</code><code>, </code><code>1121</code><code>, </code><code>871</code><code>);</code>
<code>setTitle(</code><code>"发牌"</code><code>);</code>
<code>setResizable(</code><code>false</code><code>);</code>
<code>contentPane = </code><code>new</code> <code>JPanel();</code>
<code>contentPane.setLayout(</code><code>null</code><code>);</code>
<code>setContentPane(contentPane);</code>
<code>ArrayList[] trees = Method.getPoker(); </code><code>//将存储了三副牌的集合拿出来</code>
<code>int</code> <code>row = </code><code>0</code><code>; </code><code>//记录图片y坐标的位置</code>
<code>for</code> <code>(ArrayList arrayList : trees) { </code><code>//将牌一副副拿出来</code>
<code>for</code> <code>(</code><code>int</code> <code>i = arrayList.size() - </code><code>1</code><code>; i >= </code><code>0</code><code>; i--) { </code><code>//将牌一张张的拿出来,并且将原本牌的顺序反过来</code>
<code>Poker p = (Poker) arrayList.get(i); </code><code>//将每一张牌转换成对象</code>
<code>//添加照片</code>
<code>final</code> <code>JLabel label = </code><code>new</code> <code>JLabel(</code><code>new</code> <code>ImageIcon(</code><code>"image/"</code> <code>+ p.getImage())); </code>
<code>label.setBounds(i * </code><code>40</code><code>, row, </code><code>170</code><code>, </code><code>259</code><code>);</code>
<code>getContentPane().add(label);</code>
<code>row += </code><code>270</code><code>; </code><code>//每发一张牌就改变一下坐标位置</code>
Collections集合工具类:
此类的操作都是针对List系列的集合,能对集合实现排序等操作,但是如果需要排序自己写的类的实例化对象的话,需要在需要排序的类里重写compareTo();方法。
compareTo();方法:
此方法返回的是3个数字:1 0 -1,1代表大于,0代表等于,-1则代表小于,就是利用这3个数字来进行判断排序。
<code>public</code> <code>class</code> <code>Student </code><code>implements</code> <code>Comparable<Student> {</code>
<code>public</code> <code>Student(String name, String address, </code><code>int</code> <code>age) {</code>
<code>this</code><code>.address = address;</code>
<code>this</code><code>.age = age;</code>
<code>private</code> <code>int</code> <code>age;</code>
<code>private</code> <code>String address;</code>
<code>public</code> <code>String getAddress() {</code>
<code>return</code> <code>address;</code>
<code>public</code> <code>void</code> <code>setAddress(String address) {</code>
<code>public</code> <code>int</code> <code>getAge() {</code>
<code>return</code> <code>age;</code>
<code>public</code> <code>void</code> <code>setAge(</code><code>int</code> <code>age) {</code>
<code>public</code> <code>void</code> <code>setName(String name) {</code>
<code>//重写compareTo方法,按照name属性来排序</code>
<code>public</code> <code>int</code> <code>compareTo(Student o) {</code>
<code>return</code> <code>this</code><code>.name.compareTo(o.name);</code>
<code></code>
本文转自 ZeroOne01 51CTO博客,原文链接:http://blog.51cto.com/zero01/1976557,如需转载请自行联系原作者