1

別の古典的なカード/ポーカー ゲームの問題。ランダムなカード (ユーザー、コンピューター) で 2 つのハンドを埋めています。今のところ、2 つのハンドを比較し、ハンドの enum/rank 値を合計して比較しています。正しく表示されており、ロジックは正しいと思いますが、特に列挙型に関しては、キャストをよく理解していません。ランクは列挙型 (デュース = 2 など) で確立されます。SuperCard 親クラスは、cardRank としてランクの設定プロパティを取得しています

SuperCard クラスは次のとおりです。

public abstract class SuperCard
{
    #region Properties

    public Rank cardsRank { get; set; }
    public abstract Suit cardSuit { get; }

    #endregion

    public abstract void Draw();
}

主なプログラムは次のとおりです。

CardLibrary.CardSet myDeck = new CardLibrary.CardSet(); // create deck of 52 cards
int howManyCards = 5;
int balance = 10;
Console.ForegroundColor = ConsoleColor.Yellow;
Console.BackgroundColor = ConsoleColor.DarkBlue;

Console.WriteLine("Welcome to NewPoker! \nYou get $10 to start. Each bet is $1"); // intro and rules

while (balance != 0)
{
    SuperCard[] computerHand = myDeck.GetCards(howManyCards); // create two hands, user/comp
    SuperCard[] myHand = myDeck.GetCards(howManyCards);
    DrawHands(computerHand, myHand); // call hands
    Console.ReadLine();
    bool won = CompareHands(computerHand, myHand);
    if (won)
    {
        Console.WriteLine("You win this hand! Your balance is {0}", balance.ToString("C"));
        balance++;
        Console.WriteLine("Press enter to play the next hand");
        Console.ReadLine();
    }
    if (!won)
    {
        Console.WriteLine("The dealer wins this hand! Your balance is {0}", balance.ToString("C"));
        balance--;
        if (balance > 0)
        {
            Console.WriteLine("Press enter to play the next hand");
            Console.ReadLine();
        }
    }
}

CompareHands メソッドは次のとおりです。

public bool CompareHands(SuperCard[] compHand, SuperCard[] userHand)
{
    int compTotal = 0, userTotal = 0;
    foreach (var item in compHand)
    {
        //cast enum rank to int, add?
    }
    foreach (var item in userHand)
    {
        //cast enum rank to int, add?
    }
    if (userTotal > compTotal)
    {
        return true;
    }
    else
        return false;
}

私の考えでは、foreachそれぞれを循環させ、int にキャスト (列挙型item.cardsRankの SuperClass で設定されたプロパティを取得) し、その値を現在の合計 ( 、) に追加するには、ループが必要だと考えています。次に、プログラムで bool を「won」と呼んでいるので、それらを戻り値と比較します。ヒントやガイダンスをいただければ幸いです。RankuserTotalcompTotal

4

2 に答える 2

0

あなたが探しているのは、「列挙型の基になる型」​​と呼ばれます。基本的に、列挙値を表すことができる値を指定します。

任意の整数定数を使用できます。すべての C# 整数型については、MSDNに移動します。intあなたが言うとき、デフォルトはそうです

public enum Rank 
{
    Value1,
    Value2
}

コンパイラはそれを次のように認識します

public enum Rank : int
{
    Value1 = 0,
    Value2 = 1
}

デフォルトでは、最初の項目が 0 から始まり、順番に 1 ずつ増加します。しかし、それに従う必要はありません。値を 0 に設定する必要はありません。コードから基になる値を取得する必要がある場合は、呼び出すだけです。

int rank = (int)Rank.Value1;

(int)使用しているタイプに置き換えます。後ろ向きにすることもできます。

Rank rank = (Rank)1;

しかし、心に留めておいてください

任意の整数値をランクに割り当てることができます。たとえば、次のコード行はエラーを生成しません: rank = (Rank) 42. ただし、列挙型変数は列挙型によって定義された値の 1 つだけを保持することが暗黙的に想定されているため、これを行うべきではありません。列挙型の変数に任意の値を割り当てると、エラーが発生するリスクが高くなります。MSDN から

于 2013-11-12T07:19:38.713 に答える
0

int 値を取得するために必要なのはキャストだけです。

void Main()
{
var rank = Rank.Two;
Console.Write((int)rank);
}

public enum Rank
{
None,
One = 1,
Two = 2
}

たとえば、これは2を出力します。列挙型はゼロに初期化されるため、そこに「なし」の値を貼り付けます。

于 2013-11-12T02:33:52.217 に答える