1. 程式人生 > >撲克牌 洗牌演算法 的java實現

撲克牌 洗牌演算法 的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());
}
}