0

C# の学習方法として、カード バトルのある小さなアドベンチャー ゲームに取り組んでいます。ただし、カードの生成に少し問題があります。私がやろうとしているのは、カードのランダムな値を生成し、それらをインスタンス化し、新しいオブジェクトをプレイヤーに配られる「手」であるリストに割り当てることです。これは私がこれまでに持っているものです:

        public void generateBattleCards()
    {
        string cardStat;
        string cardName;
        int cardValue;
        string[] stats = { "Power", "Precision", "Allure", "Vitality", "Essence" };
        for (int i = 0; i < 5; i++)
        {
            Random random = new Random();
            cardStat = stats[random.Next(0, stats.Length)];
            cardValue = random.Next(1, 10);
            cardName = cardValue.ToString() + " of " + cardStat;
            Card newCard = new Card(cardName, cardStat, cardValue);
            CardHand.Add(newCard);
        }

        picPlayerCard1.Image = CardHand[0].cardImage;
        picPlayerCard2.Image = CardHand[1].cardImage;
        picPlayerCard3.Image = CardHand[2].cardImage;
        picPlayerCard4.Image = CardHand[3].cardImage;
        picPlayerCard5.Image = CardHand[4].cardImage;
    }

カードをリストに追加する場所でヌル参照を取得しています。

しばらくこれに苦労した後、これが機能すると仮定すると、これはおそらくこれを構造化する最もエレガントな方法ではないことがわかりました。したがって、これをより適切に構築する方法について誰かが意見を持っていれば、私は感謝しています。

補足として、プレイヤー クラスのプレイヤー統計を cardStat の最小値と最大値として使用したいと思います。選択したランダムな統計名に基づいて正しい統計値を取得する良い方法がわかりません。統計は、get および set のプロパティを持つプライベート int としてプレーヤー クラスに存在します。

これを自分で理解しようとしているときに、辞書に関する情報に出くわしました。これまで使ったことはありませんが、毎回作成するのではなく、考えられるすべてのカードを作成して保存し、必要なカードだけを取得することを検討する価値はありますか?

あなたが与えたいと思う助けやフィードバックをありがとう:)

4

1 に答える 1

1

カードをリストに追加する場所でヌル参照を取得しています。

CardHandそのメソッド内で宣言されていないため、どこで実行しても、明らかに初期化されていません。

したがって、どこかに次のものが必要です。

CardHand = new List<Card>();

次に、ループ内の前に、generateBattleCardsそのリストをクリアして、前のカードを保持しないようにする必要があります。

CardHand.Clear();

一般に、私はランダムなカードの生成を、プレイヤーの手札を作成する場所から切り離します。これにより、カードを個別に引くことができます (これはゲームに役立つ場合があります)。

さらに、ゲーム ロジック (カードの描画など) とビジュアル ロジック (どのアイコンをどこに表示するか) を分離する必要もあります。たとえば、フォーム コントローラがプレイヤーのカードにアクセスできるようにし、それらの表示方法を完全に任せます。

// keep the random generator around
private readonly Random rand = new Random();

// keep the stats around; even better: make an Enum with those values
private readonly string[] stats = { "Power", "Precision", "Allure", "Vitality", "Essence" };

private Card DrawNewCard ()
{
    string stat = stats[random.Next(0, stats.Length)];
    int value = GetRandomValueForStat(stat);
    string name = string.Format("{0} of {1}", value, stat);

    return new Card(name, value, stat);
}

public void generateBattleCards()
{
    CardHand.Clear();
    for (int i = 0; i < 5; i++)
    {
        CardHand.Add(DrawNewCard());
    }
}
于 2013-07-07T17:15:03.983 に答える