-4

こんにちはみんな私はここでいくつかの助けが必要です私は繰り返しなしでテキストとして6つのボタンでランダムに6つの文字列を配布したいと思います。つまり、ある種のシャッフルを実行して配布したいのですが、重複はなく、各ボタンは一意の文字列を保持します。誰かがコードを投稿できればそれは素晴らしいことです:)ありがとう

class Card_Deck
{
    public Random r;
    public string ReceiveCards()
    {
        List<string> cards = new List<string>();
        cards.Add("♣ King");
        cards.Add("♦ King");
        cards.Add("♥ King");
        cards.Add("♠ King");
        cards.Add("♣ Jack");
        cards.Add("♦ Jack");

        int index = r.Next(cards.Count);
        var card = cards[index];
        cards.RemoveAt(index);
        return card;

    }
}

}

これはメインフォームです

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        Card_Deck cd = new Card_Deck() { r = new Random(DateTime.Now.Millisecond) };

        button1.Text = cd.ReceiveCards();
        button2.Text = cd.ReceiveCards();
        button3.Text = cd.ReceiveCards();
        button4.Text = cd.ReceiveCards();
        button5.Text = cd.ReceiveCards();
        button6.Text = cd.ReceiveCards();
    }
}

}

4

2 に答える 2

0

CardDeckこれを行う最も簡単な方法は、クラス内にシャッフル アルゴリズムを実装すること です。フィッシャー・イェイツのようなもの。

あなたが抱えている問題は、毎回配列を再作成してからラドム要素を取得していることです。これにより、重複が発生します。選択肢は、シャッフルされた配列全体を返すか (より良いもの imo )、またはプライベート変数を使用してカードのデッキをステートフルにするかのいずれかです。

public class CardDeck {

    private List<String> cards;

    public CardDeck () { 
        cards = { "♣ King", "♦ King", "♥ King",
                  "♠ King", "♣ Jack", "♦ Jack" }.toList<String>();
    }

    public List<String> Shuffle () {
        // shuffle cards here

        var rand = new System.Random();
        return cards.OrderBy( x => rand.Next() ).toList<String>();
    }
}

public partial class Form1 : Form 
{
    public Form1()
    {
        InitializeComponent();

        var deck = new CardDeck();
        var shuffledDeck = deck.Shuffle();

        buttom1.Text = shuffledDeck.pop();
        buttom2.Text = shuffledDeck.pop();
        // ...
    }
}
于 2012-07-29T06:23:24.877 に答える
0

パブリック部分クラス Form1 : Form { public Form1() { InitializeComponent(); }

    private void button1_Click(object sender, EventArgs e)
    {
        label1.Text = Card_Deck.ReceiveCards();
    }

    private void button2_Click(object sender, EventArgs e)
    {
        label2.Text = Card_Deck.ReceiveCards();
    }

    private void button3_Click(object sender, EventArgs e)
    {
        label3.Text = Card_Deck.ReceiveCards();
    }
    private void button4_Click(object sender, EventArgs e)
    {
        label4.Text = Card_Deck.ReceiveCards();
    }
    private void button5_Click(object sender, EventArgs e)
    {
        label5.Text = Card_Deck.ReceiveCards();
    }
    private void button6_Click(object sender, EventArgs e)
    {
        label6.Text = Card_Deck.ReceiveCards();
    }
    class Card_Deck
    {
        public static Random r = new Random();
        private static List<string> cards = new List<string>() { "♣ King 1",
            "♦ King 2", 
            "♥ King 3",
            "♠ King 4", 
            "♣ Jack 5", 
            "♦ Jack 6" };

        public static string ReceiveCards()
        {
            if (cards.Count > 0)
            {
                int index = r.Next(cards.Count);
                var card = cards[index];
                cards.RemoveAt(index);
                return card;
            }
            else
            {
                return "";
            }

        }
    } 

}
于 2012-07-29T06:29:31.557 に答える