天天看點

撲克牌例題與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

<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&lt;Poker&gt; array = </code><code>new</code> <code>ArrayList&lt;&gt;();</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&lt;Poker&gt;(), </code><code>new</code> <code>ArrayList&lt;Poker&gt;(), </code><code>new</code> <code>ArrayList&lt;Poker&gt;() };</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 &lt; </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&lt;Poker&gt; arrayList : trees) {</code>

<code>for</code> <code>(</code><code>int</code> <code>i = </code><code>0</code><code>; i &lt; arrayList.size(); i++) {</code>

<code>for</code> <code>(</code><code>int</code> <code>j = arrayList.size()-</code><code>1</code><code>; j &gt; i; j--) {</code>

<code>if</code> <code>(arrayList.get(j).getDaxiao() &gt; 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 &gt;= </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&lt;Student&gt; {</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,如需轉載請自行聯系原作者