更新於 2024/11/01閱讀時間約 9 分鐘

補充教學-SSR十連抽

    這一篇用前面的範例來修改做一個SSR十連抽範例,看看有沒有抽到SSR。

    發源於《遊戲王》,N就是normal(正常)R就是Rare(罕見),SR就是Super Rare(非常稀有),SSR表示Superior Super Rare(超級稀有),UR則是Ultra Rare(極度稀有)。

    主要是Card的定義改成這次需要的內容(卡牌類型、編號、顏色),在這裡就不做卡牌名字與效果,有需要可以自己定義寫寫看。

    假設SSR抽中機率5%,SR抽中機率30%,R抽中機率65%,宣告一個100大小的Card陣列,裡面放入5張SSR,30張SR、剩下的都是R,經過亂數洗牌後,取出前十張,即可知道此次的連十次抽牌結果。


    SSR.aspx

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

    <!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 />
    十連抽結果:<br />
    <asp:Label ID="Label3" runat="server" Text=""></asp:Label>
    </div>
    </form>
    </body>
    </html>

    SSR.aspx.cs

    public partial class SSR : System.Web.UI.Page
    {
    protected void Page_Load(object sender, EventArgs e)
    {
    //卡牌分為三類:SSR、SR、R
    //抽到機率為 SSR (5%)、SR (30%)、R(65%)
    Card[] cards = new Card[100]; //100張,因抽到機率為百分比

    for (int i = 0; i < cards.Length; i++) //四種花色
    {
    if(i < 5) //SSR 5張
    {
    cards[i] = new Card("SSR", i, "#ff0000");
    }
    else if(i>=5 && i<35) //SSR 30張
    {
    cards[i] = new Card("SR", i, "#0000ff");
    }
    else //剩下的都是R
    {
    cards[i] = new Card("R", i, "#009900");
    }
    }

    //洗牌前
    for (int i = 0; i < cards.Length; i++)
    {
    if(i % 10 == 0)
    {
    Label1.Text += "<br>";
    }
    Label1.Text += $"{cards[i].ToString()},";
    }

    //洗牌
    Shuffle(cards);

    //洗牌前
    for (int i = 0; i < cards.Length; i++)
    {
    if (i % 10 == 0)
    {
    Label2.Text += "<br>";
    }
    Label2.Text += $"{cards[i].ToString()},";
    }

    //十連抽結果
    for(int i=0; i<10; i++)
    {
    Label3.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 Rare { get; set; }
    public int No { get; set; }
    public string Color { get; set; }

    // Card建構函數
    public Card(string suit, int rank, string c)
    {
    this.Rare = suit; //類型,SSR / SR / R
    this.No = rank; //編號
    this.Color = c; //顏色
    }

    // 覆寫ToString()方法來顯示撲克牌訊息
    public override string ToString()
    {
    return $"<font color={Color}>{Rare} ({No})</font>";
    }
    }

    執行結果:



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