系統開發-撲克牌洗牌


Posted by Phyxsius on 2024-10-04

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

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.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}";
    }
}

執行結果:










Related Posts

一次搞懂 var、let、const 三種變數

一次搞懂 var、let、const 三種變數

滲透測試重新打底(6)--Metasploit與Port Forwarding簡介

滲透測試重新打底(6)--Metasploit與Port Forwarding簡介

Day 26-List/Dictionary Comprehension & NATO Alphabet project

Day 26-List/Dictionary Comprehension & NATO Alphabet project


Comments