撲克牌例題:
使用集合寫一個具有發牌功能的撲克牌程式。
我們需要建立四個類,一個封裝對象的屬性,一個封裝牌的花色和大小也就是牌的類型,一個實作發牌,排序,洗牌功能,也就是封裝對象的行為,最後一個實作圖形化界面。
代碼示例:
對象屬性封裝類:
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,如需轉載請自行聯系原作者