2015-07-21 5 views
0

Я пытаюсь написать программу, которая будет тасовать 13 игральных карт от туза до короля. Выполните 2 карты и добавьте значение, присвоенное каждой карте. ace = 11, king = 10, jack = 10, queen = 10, десять = 10, девять = 9, восемь = 8 и т. д. ... вроде как блэкджек.C# присвоение значения массиву

Пока что я могу только перетасовать карты и распечатать две карты случайно, но я не знаю, как назначить ценность каждой карте, добавить их и распечатать. Например, если мои две случайные карты король и восемь, то я хотел бы, чтобы программа распечатать ..

King

Восемь

вот что я получил ...

 static void Main(string[] args) 
    { 
     string[] Cards = new string[] {"Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten", "jack", "Queen", "King", "Ace"}; 

     for (int x = 0; x < 100; x++) // looping the shuffle 100 times to maximize the randomness 
     { 
      for (int i = Cards.Length; i > 0; i--) //shuffle 
      { 
       string temp; 
       Random random = new Random(); 
       int r = random.Next(i); 
       temp = Cards[r]; 
       Cards[r] = Cards[i-1]; 
       Cards[i-1] = temp; 
      } 
     } 
     Console.WriteLine(Cards[0]); //first random card 
     Console.WriteLine(Cards[1]); //second random card 
     Console.ReadKey(); 
    } 
+3

Создайте класс 'Card', в котором хранятся имя и значение. Кроме того, создайте «Словарь », который отображает имя и значение. – Rob

+0

Как указано выше, вы должны использовать 'Collection', например' KeyValuePair' или 'Dictionary'. – Greg

+0

Вызов «Случайный случайный = новый случайный();' внутри цикла приведет к тому, что многие (если не все) случайные числа будут одинаковыми. Вы должны использовать только один экземпляр «Random». – Enigmativity

ответ

0

Для отличного примера программирования карточной игры выполните поиск Google для KarliCards из книги «Начало Visual C# 2012» (вы можете легко найти полный PDF-файл, но я не стану публиковать ссылку, потому что я не уверен, что это законно). У него много вещей, например, как использовать обычных операторов (+) для таких вещей, как классы или структуры.

В любом случае, то, что вы ищете, это перечисление. Это очень похоже на словарь (строка) (int), предложенный Робом (я не уверен, как писать треугольные скобки). Вот пример того, как это работает:

enum CardValue 
    { 
     One = 1, 
     Two = 2, 
     Three = 3, 
     Four = 4 
    } 

    static void Main(string[] args) 
    { 
     int myInt = (int)CardValue.One; 
     Console.WriteLine("output should be 1: " + myInt); 

     int mySum = (int)CardValue.One + (int)CardValue.Three; 
     Console.WriteLine("output should be 4: " + mySum); 
     Console.ReadKey(); 
    } 

Мой первый язык был Perl, поэтому я склонен видеть все как структуры вместо класса. Там всегда больше, чем один способ сделать это ....

public enum CardSuits 
    { 
     Clubs, 
     Spades, 
     Hearts, 
     Diamonds 
    } 

    public enum CardValues 
    { 
     Ace = 1, 
     Two = 2, 
     Three = 3, 
     Four = 4 
    } 

    public struct Card 
    { 
     public CardValues Value; // Card.Value = CardValues.Ace 
     public CardSuits Suit; // Card.Suit = CardSuits.Spades 

     public override string ToString() 
     { 
      // Card.ToString() == "Ace of Spades" 
      return String.Format(Value + " of " + Suit); 
     } 

     public string ToStringAsInteger() 
     { 
      // Card.ToStringAsInteger() == "1 of Spades" 
      return String.Format((int)Value + " of " + Suit); 
     } 
    } 

    static void Main(string[] args) 
    { 
     Card AceOfSpades = new Card(); 
     AceOfSpades.Value = CardValues.Ace; 
     AceOfSpades.Suit = CardSuits.Spades; 

     Card TwoOfClubs = new Card(); 
     TwoOfClubs.Value = CardValues.Two; 
     TwoOfClubs.Suit = CardSuits.Clubs; 

     int mySum = (int)AceOfSpades.Value + (int)TwoOfClubs.Value; 
     Console.WriteLine("Sum of Ace (1) and Two (2) is: " + mySum); // should be 3 
     Console.WriteLine("output of AceOfSpades.ToString() is: " + AceOfSpades.ToString()); 
     Console.WriteLine("output of AceOfSpades.ToStringAsInteger is: " + AceOfSpades.ToStringAsInteger()); 

     Console.ReadKey(); 
    } 
0

Вот как бы я это сделать:

var cards = new Dictionary<string, int>() 
{ 
    { "Two", 2 }, { "Three", 3 }, { "Four", 4 }, { "Five", 5 }, { "Six", 6 }, 
    { "Seven", 7 }, { "Eight", 8 }, { "Nine", 9 }, { "Ten", 10 }, { "Jack", 10 }, 
    { "Queen", 10 }, { "King", 10 }, { "Ace", 11 }, 
}; 

var random = new Random(); 

var selected = cards.OrderBy(c => random.Next()).Take(2).ToArray(); 

foreach (var card in selected) 
{ 
    Console.WriteLine(card.Key); 
} 

Console.WriteLine(selected.Sum(c => c.Value)); 

Запуск этого, я получаю (к примеру):

Two 
Ten 
12 

Теперь для получения дополнительной информации о существующем коде.

Вызов Random random = new Random(); в цикле приведет к тому, что многие (если не все) случайные числа будут одинаковыми. Вы должны использовать только один экземпляр Random.

Нет необходимости в цикле for (int x = 0; x < 100; x++), так как одиночный проход for (int i = Cards.Length; i > 0; i--) петли достаточно, чтобы случайным образом отображать карточки.

Смежные вопросы