更新於 2024/10/12閱讀時間約 10 分鐘

系統開發-撲克牌洗牌

    撲克牌初始化後,加入洗牌功能,並顯示洗牌前和洗牌後撲克牌的排列狀態


    Shuffle.aspx

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Shuffle.aspx.cs" Inherits="_Default" %>

    <!DOCTYPE html>

    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
    </head>
    <body>
    <form id="form1" runat="server">
    <div>
    洗牌前:<br />
    <asp:Label ID="Label1" runat="server" Text=""></asp:Label>
    <br />
    <br />
    洗牌後:<br />
    <asp:Label ID="Label2" runat="server" Text=""></asp:Label>
    <br /><br />
    可按F5或重新載入更新畫面,每次洗牌後結果都會不一樣
    </div>
    </form>
    </body>
    </html>

    Shuffle.aspx.cs

    public partial class _Default : System.Web.UI.Page
    {
    protected void Page_Load(object sender, EventArgs e)
    {
    string[] suits = { "S", "H", "D", "C" }; //"S黑桃" , "H紅心" , "D方塊" , "C梅花"

    Card[] cards = new Card[52]; //一副牌52張
    int index = 0;

    for (int i = 0; i < suits.Length; i++) //四種花色
    {
    for (int j = 1; j <= 13; j++) //一種花色13張牌1-13
    {
    cards[index] = new Card(suits[i], j); //初始化
    index++;
    }
    }

    //洗牌前
    for (int i = 0; i < cards.Length; i++)
    {
    if (i % 13 == 0) //13張牌排成一行
    {
    Label1.Text += $"<br>{cards[i].ToString()}"; //換行
    }
    else
    {
    //Label1.Text += $",{cards[i].ToString()}"; //Card class預設顯示方式
    Label1.Text += $",{cards[i].Suit}{cards[i].Rank}"; //自訂顯示方式
    }
    }

    //洗牌
    Shuffle(cards);

    //洗牌後
    for (int i = 0; i < cards.Length; i++)
    {
    if (i % 13 == 0) //13張牌排成一行
    {
    Label2.Text += $"<br>{cards[i].ToString()}"; //換行
    }
    else
    {
    //Label1.Text += $",{cards[i].ToString()}"; //Card class預設顯示方式
    Label2.Text += $",{cards[i].ToString()}"; //自訂顯示方式
    }
    }
    }

    //洗牌
    void Shuffle(Card[] cards)
    {
    Random rand = new Random();

    for(int i=0; i<cards.Length; i++)
    {
    int j = rand.Next(cards.Length); //// 產生一個隨機索引 0-51

    //例如:
    // i=0, j=12,表示第一張牌 (cards[0] 黑桃1) 與第13張牌 (cards[12]黑桃13) 互換
    // 互換後的結果為,第一張牌 (cards[0] 黑桃13,第13張牌 (cards[12]黑桃1)
    // 一直換52次(每一個位置的牌都換一次)
    Swap(cards, i, j);
    }
    }

    //陣列中兩個元素交換,通過暫存變數的方式來實現交換
    void Swap(Card[] cards, int i, int j)
    {
    Card tmp = cards[i]; //將 cards[i] 的值暫存到 temp
    cards[i] = cards[j]; //將 cards[j] 的值賦給 cards[i]
    cards[j] = tmp; //將剛才暫存的 tmp 值賦給 cards[j]
    }
    }

    class Card
    {
    public string Suit { get; set; }
    public int Rank { get; set; }

    // Card建構函數
    public Card(string suit, int rank)
    {
    this.Suit = suit; //花色
    this.Rank = rank; //點數
    }

    // 覆寫ToString()方法來顯示撲克牌訊息
    public override string ToString()
    {
    string suitName = "";

    switch (Suit)
    {
    case "S":
    suitName = "黑桃";
    break;
    case "H":
    suitName = "紅心";
    break;
    case "D":
    suitName = "方塊";
    break;
    case "C":
    suitName = "梅花";
    break;
    }

    return $"{suitName}{Rank}";
    }
    }

    執行結果:


    分享至
    成為作者繼續創作的動力吧!
    © 2024 vocus All rights reserved.