撲克牌 洗牌演算法 的java實現
無意中接觸到這種問題,雖然說是個小演算法,不過也大大花費了我好幾個小時的時間才算搞定,不過自己感覺還是挺完美的。
因為運用到了範型的特性,所以程式碼需要在JDK5.0以上環境下才能正常執行。
撲克牌實體類:
package mypoke.entity;
/**
* @author 刃舞琴韻
*
*/
public class Poke {
String pokeFace;//牌面
String pokePoint;//牌點
String pokeColor;//花色
String pokeImgPath;//圖片地址
boolean inUse;//是否使用中
public Poke(){}
public boolean isInUse() {
return inUse;
}
public void setInUse(boolean inUse) {
this.inUse = inUse;
}
public String getPokeColor() {
return pokeColor;
}
public void setPokeColor(String pokeColor) {
this.pokeColor = pokeColor;
}
public String getPokeFace() {
return pokeFace;
}
public void setPokeFace(String pokeFace) {
this.pokeFace = pokeFace;
}
public String getPokeImgPath() {
return pokeImgPath;
}
public void setPokeImgPath(String pokeImgPath) {
this.pokeImgPath = pokeImgPath;
}
public String getPokePoint() {
return pokePoint;
}
public void setPokePoint(String pokePoint) {
this.pokePoint = pokePoint;
}
public String toString(){
StringBuffer sb=new StringBuffer("");
sb.append("------------牌面 " + pokeFace+"\n");
sb.append("------------牌點 " + pokePoint+"\n");
sb.append("------------花色 " + pokeColor+"\n");
sb.append("------------圖片地址 " + pokeImgPath+"\n");
sb.append("------------是否使用中 " + inUse+"\n");
return sb.toString();
}
}
撲克牌業務類(已實現初始化和洗牌兩個業務):
package mypoke.service;
/**
* @author 刃舞琴韻
*
*/
import java.util.LinkedList;
import java.util.List;
import mypoke.entity.Poke;
public class PokeService {
private String[] color=new String[]{"方塊","紅桃","黑桃","梅花"};//花色陣列
private String pokeImgAddress="圖片檔案地址的字首
private List<Poke> pokeList=new LinkedList<Poke>();//存放撲克牌
private Poke[] poke=new Poke[54];//暫時存放所有撲克牌的物件陣列,用來存放生成的54個空撲克牌物件
public PokeService(){}
//初始化撲克牌
public void initPokeList(){
int count=0;//陣列下標
//初始化陣列
for(int i=0;i<poke.length;i++){
poke[i]=new Poke();
}
//初始化list集合
for(int i=1;i<=13;i++){
for(int j=1;j<=4;j++){
String point=new Integer(i).toString();
// 當牌點,牌面大於10的時候用J,Q,K取代
switch(i){
case 11:
poke[count].setPokePoint("J");
poke[count].setPokeFace("J");
poke[count].setPokeImgPath(pokeImgAddress+color[j-1]+"J"+".jpg");
break;
case 12:
poke[count].setPokePoint("Q");
poke[count].setPokeFace("Q");
poke[count].setPokeImgPath(pokeImgAddress+color[j-1]+"Q"+".jpg");
break;
case 13:
poke[count].setPokePoint("K");
poke[count].setPokeFace("K");
poke[count].setPokeImgPath(pokeImgAddress+color[j-1]+"K"+".jpg");
break;
default:
poke[count].setPokePoint(point);
poke[count].setPokeFace(point);
poke[count].setPokeImgPath(pokeImgAddress+color[j-1]+i+".jpg");
break;
}
// 設定花色
poke[count].setPokeColor(color[j-1]);
// 設定使用狀態
poke[count].setInUse(false);
// 放入集合中
pokeList.add(count,poke[count]);
count++;
}
}
// 新增大鬼
Poke big=new Poke();
big.setPokePoint("大鬼");
big.setPokeFace("大鬼");
big.setPokeImgPath(pokeImgAddress+"大鬼"+".jpg");
big.setInUse(false);
pokeList.add(big);
// 新增小鬼
Poke samll=new Poke();
samll.setPokePoint("小鬼");
samll.setPokeFace("小鬼");
samll.setPokeImgPath(pokeImgAddress+"小鬼"+".jpg");
samll.setInUse(false);
pokeList.add(samll);
}
//洗牌
public void washPoke(){
List<Poke> tempList=this.getPokeList();
int times=tempList.size()-1;
while(times>0)
{
int temp=(int)(Math.random()*100)%times;
swap(tempList,temp,times);
times--;
}
this.setPokeList(tempList);
}
//交換LinkedList中兩個已經存在的撲克牌物件
public void swap(List<Poke> tempList,int temp,int times){
Poke poke1=new Poke();
Poke poke2=new Poke();
poke1=tempList.get(temp);
poke2=tempList.get(times);
tempList.remove(temp);
tempList.add(temp,poke2);
tempList.remove(times);
tempList.add(times,poke1);
}
public List<Poke> getPokeList() {
return pokeList;
}
public void setPokeList(List<Poke> pokeList) {
this.pokeList = pokeList;
}
//列印
public void print(){
for(Poke p:pokeList){
System.out.println(p);
}
}
// 測試方法
public static void main(String[] args){
PokeService ps=new PokeService();
ps.initPokeList();
System.out.println(ps.getPokeList().size());
System.out.println("*********************洗牌*****************************");
ps.washPoke();
ps.print();
System.out.println("*********************洗牌完畢*****************************");
System.out.println(ps.getPokeList().size());
}
}