天天看点

扑克牌例题与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,如需转载请自行联系原作者