1. 程式人生 > >撲克牌例題與Collections工具類

撲克牌例題與Collections工具類

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工具類