2022/09/02
3569

Java程式教室(五):撲克牌洗牌

Java程式密技-撲克牌洗牌

發撲克牌

撲克牌是一種非常大眾化的遊戲,在電腦中有很多與撲克牌有關的遊戲。例如,在windows作業系統下附帶的紙牌、紅心作戰等。在撲克牌的遊戲中,常常都需要執行洗牌操作,就是將一副牌完全打亂,使其排列沒有規律。
這次就以Java來設計如何實現撲克牌發牌>>>

問題分析:

首先決定要如何洗牌。
一副撲克牌共有52張,4種花色(方塊,紅心,黑桃,梅花)。這裡採用隨機方式來產生撲克牌(數字+花色),但是在隨機產生的資料容易和前面的資料重複,所以須加判斷不重複的條件來產生新牌,操作步驟如下:

操作步驟

1首先,按照順序產生一副新牌
2.
從1~52中隨機產生數字,再按照產生的數字重新排列
3.
執行2的步驟連續52次,產生新的排列方式的牌面,如此達到洗牌的目的 程式執行結果如下
D00012-1

根據此要求結果,分析出需要,得出需撰寫3個class

1.Card class定義每張牌組成元素的物件
2.Shufflet class 定義顯示牌面與洗牌方法
3.ShuffletTest class執行顯示與洗牌動作(main)

Card.class每張牌物件的內容

Step 1:
分析需求的類別圖
D0012-2

Step 2:
撰寫Card程式內容
---
//撲克牌類別
class Card
{
     private int suit;//花色
     private char Number;//牌面數字
     public int getSuit() {
         return suit;
     }
     public void setSuit(int suit) {
         this.suit = suit;
     }
     public char getNumber() {
         return Number;
     }
     public void setNumber(char number) {
         Number = number;
     }   
}
---

Shufflet class 撲克牌洗牌相關方法

Step1:
根據需求,分析出需求類別圖
D0012-3

Step 2:
撰寫 Shufflet class內容
---
import java.util.Random;
//洗牌
class Shufflet
{
     static Card[] OneCard=new Card[52];//Card物件-->儲存每張撲克的花色,數字
     //顯示樸克牌
     static void showCard()
     {
         int i,j;
         String s=""; //代表花色
         for(i=0,j=0;i<52;i++,j++) //初始排列-->撲克牌執行迴圈一遍
         {
              if(j%13==0)//控制每種花色一行
              {
                  System.out.print("\n");
              }
              switch(OneCard[i].getSuit()) //設計根據花色屬性,顯示花色符號
              {
                  case 1:
                       s="黑桃"; //1->代表"黑桃"
                       break;
                  case 2:
                       s="紅心"; //2->代表"紅心"
                       break;
                  case 3:
                       s="梅花"; //3->代表"梅花"
                       break;
                  case 4:
                       s="方塊"; //4->代表"方塊"
                       break;
                  default:
                      
              }
              System.out.print(" "+s+OneCard[i].getNumber());
         }
         System.out.println("\n");
     }
     //設計洗牌步驟的方法
     static void shuffle()
     {
         int i,j;
         Card tempcard=new Card();   //交換過程中臨時備份用
        
         Random r=new Random(); //使用隨機產生任意數字
        
         for(i=0;i<52;i++) //切換52次牌
         {
              j=r.nextInt(52);  //搭配隨機產生的數字從52牌抽取
              tempcard=OneCard[j];  //換牌
              OneCard[j]=OneCard[i];
              OneCard[i]=tempcard;
         }
     }
    
     //重新產生一副新牌
     static void initial()
     {
         int i,temp;
         int suit=0;
        
         for(i=0;i<52;i++)  //執行迴圈重新產生52張牌
         {
              if(i%13==0)   //每13張改變花色
              {
                  suit++;  //花色改變
              }
              Card t=new Card(); //重新產生一副樸克牌物件
              t.setSuit(suit);//儲存花色
              temp=i%13; //牌面數字不可超過13
             
              switch(temp) //定義數字對應的牌面
              {
                  case 0:
                       t.setNumber('A'); // 數字0--->代表 A
                       break;
                  case 9:
                       t.setNumber('O'); //數字9--->代表 10
                       break;
                  case 10:
                       t.setNumber('J'); //數字10--->代表 J
                       break;
                  case 11:
                       t.setNumber('Q'); //數字11--->代表 Q
                       break;
                  case 12:
                       t.setNumber('K'); //數字12--->代表 K
                       break;
                  default:
                       t.setNumber((char)(temp+'1')); //其他數字 --->自動加1成牌面數字
                      
              }
             
              OneCard[i]=t;
         }
     }
}
 ---
 
最後撰寫 ShuffletTest class執行步驟
---
//執行洗牌動作
public class ShuffleTest {
     public static void main(String[] args) {
        
         Shufflet.initial(); //首先先產生一副新牌
        
         System.out.println("一副新牌的初始排列如下:\n");
         Shufflet.showCard(); //顯示新牌的排列
                 
         Shufflet.shuffle(); //執行洗牌步驟
        
         System.out.println("\n洗牌後的排列如下:\n");
         Shufflet.showCard();//顯示洗完牌的排列
 
     }
    
}
 
 
---

>>程式課程試聽索取 

>>職訓補助課程
 


相關文章:

>>Java程式教室(三):用JAVA寫出擲骰子遊戲
>>如何利用Python爬取靜態網頁資料
 



  江聖榮 老師
  專長:

  程式設計:從前端(UI front-end)到後端(Back-end)之全端工程師(full-stack)
  精通語言:Java、Javascript 前後端框架   
  開課詳情

 
LINE-friend
近期文章熱搜文章排行
熱門標籤熱門標籤
近期文章你可能有興趣的文章
熱門標籤熱門標籤