【问题标题】:How do I add a deck of cards to an array in C# [closed]如何在 C# 中将一副纸牌添加到数组中 [关闭]
【发布时间】:2020-08-07 10:31:08
【问题描述】:

我被困在一个项目中,我必须将一副纸牌添加到一个数组中,我们不能使用一个类,而只能使用一个方法,但我被困在如何去做这件事上。纸牌将用于比较像纸牌游戏“战争”的价值

所以如果玩家 1 得到黑桃 5 而电脑得到黑桃 2 它会说

玩家 1 拿到了黑桃 5 玩家 2 得到了黑桃 2 玩家 1 获胜

想知道是否有人可以指导我在正确的方向上从哪里开始

【问题讨论】:

  • 这将是很长的解释,但我在下面创建了一个简单的指南,它可以让你知道下一步该做什么......我没有包括所有内容,但我已经离开了线索。

标签: c# arrays methods playing-cards


【解决方案1】:

你可以试试这个,作为一个设置:

定义所有卡片类型:

var carTypes = new List<string>() 
{
  "Spades", "Diamonds", "Heads", "Clubs"
}

现在将卡片名称及其值定义为enum

enum cards
{
  Ace = 1, Two = 2, Three = 3, Four = 4, Five = 5, Six = 6, 
  Seven = 7, Either = 8, Nine = 9, Ten = 10, Jack = 11, Queen = 12, King = 13
}

定义卡片结构:

class Card
{
  public string Name { get; set; }
  public string Type {get; set;
  public int value{ get; set; }
}

从这里开始。您需要做的就是声明一个牌组并将所有牌放在那里...

让我们定义一个 Deck...

List<Card> deck = new List<Card>();

让我们按顺序将牌填满我们的牌库...稍后我们会洗牌。

var cardsValues = Enum.GetValues(typeof(cards));
for(int c = 0; c < cardValues.Count(); c++)
{
  // create each card of 4 different types
  foreach(var cardType in cardTypes)
  {
    deck.add(new Card{
       Name =  Enum.GetName(typeof(cards), c),
       Type = cardType,
       Value = cardsValues[c]
    });
  }
}

我会把它留在这里,这是接下来的步骤:

此时,我们的堆栈已满是卡片,但它们都按其值排列。下面的步骤是要遵循的

  • 使用Random()生成器将牌组中的牌洗牌,使用[0, deck.Count()]作为您的随机生成范围...还要确保生成的每个数字不重复...所以生成随机数字deck.Count()次。
  • 板条箱玩家类
 class Player{
   public string Name { get; set; } 
   public bool is activePlayer { get; set; }
   public List<Card> StartCards { get; set;} // Stores Initial Cards.
   public List<Card> CardsPlayed { get; set; };
   public List<Card> CardsWon { get; set; };

   //... add methods that manipulate these arrays as the player plays
 }
  • 现在创建您的游戏,其中包含两个玩家和一个新数组 List&lt;Card&gt; PlayedCards,该数组存储在地面上打出的牌,并为每个玩家拆分 deck 一半......所以每个玩家都将收到 deck.Count() / 2,即26 张卡片。

  • 创建一个逻辑类,用于在每个玩家之间切换并调用玩家方法来在他们玩牌时操作他们的牌...

【讨论】:

  • 好的,谢谢!!我想我明白这一点,老师说我们无法使用课程,因为使用没有达到本章中的那个点,但我问她我们是否可以尝试一下!谢谢!!
  • 酷,祝一切顺利! :) 多么有趣的游戏啊。我真的很喜欢写这个答案..
【解决方案2】:

你说你不能使用一个类,我强烈推荐,但如果你不能,那么就用一个 int 作为卡片 (0-51)。

// initialize the decks
var rand = new Random();
var deck = Enumerable.Range(0,52)
  .Select(z=> new {num = z, order = rand.Next()} )
  .OrderBy(z=>z.order)
  .Select(z=>z.num)
  .ToArray();

var hand1 = deck.Take(26);
var hand2 = deck.Skip(26);

那么如果你想让你的方法比较...

var faces = new [] {"2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A"};
var suit = new [] {"Spades", "Diamonds", "Hearts", "Clubs"};
var result = $"Player 1 has a {faces[card1/4]} of {suit[card1 % 4]} " +
             $"Player 2 has a {faces[card2/4]} of {suit[card2 % 4]} ";

if (card1 / 4 == card2 / 4)
{
  result += "War!";
} else if (card1 < card2)
{
  result += "Player 2 wins";
} else {
  result += "Player 1 wins";

【讨论】:

  • 请注意,我没有实现实际的战争序列。您将不得不循环或递归来处理它。而且您可能还必须处理弃牌堆,并将适当的牌添加到每个玩家弃牌堆中,以便在他们的主牌堆中的牌用完时重复使用(和洗牌)。虽然这段代码非常高效(内存/cpu),但我永远不会推荐这个(现在……也许是 35 年前)。使用类,并保持代码可维护。
  • 好的,谢谢!!我尝试使用这个和使用枚举的 triex 但不断收到错误我需要声明什么吗?喜欢使用 System.Generics;还是什么?
  • 是的。您可能需要 System.Collections.Generic 和 System.Linq。如果您列出错误,它会有所帮助。
猜你喜欢
  • 1970-01-01
  • 2014-07-16
  • 2022-11-25
  • 2019-12-04
  • 2012-06-07
  • 2020-05-30
  • 2011-07-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多