撲克牌例題與Collections工具類
阿新 • • 發佈:2017-10-27
collections
撲克牌例題:
使用集合寫一個具有發牌功能的撲克牌程序。
我們需要創建四個類,一個封裝對象的屬性,一個封裝牌的花色和大小也就是牌的類型,一個實現發牌,排序,洗牌功能,也就是封裝對象的行為,最後一個實現圖形化界面。
代碼示例:
對象屬性封裝類:
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; }
牌的類型封裝類,使用一個枚舉器:
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; }
對象方法實現:
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; // 將最後處理好的三副牌返回出去 } }
實現圖形化界面:
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個數字來進行判斷排序。
代碼示例:
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); } }
本文出自 “zero” 博客,請務必保留此出處http://zero01.blog.51cto.com/12831981/1976557
撲克牌例題與Collections工具類