ToArray() 在不同的方法中
本文关键字:方法 ToArray | 更新日期: 2023-09-27 18:35:42
我有一个名为mainDeck
的数组,它保存一副扑克牌的值。接下来我要做的是将该数组中的牌分发到名为 playerDeck
和 computerDeck
的两个独立数组中,每副牌必须包含一张唯一的牌。
我遇到的问题是分发具有唯一价值的牌 - 每副牌 26 张。我尝试了几种不同的方法,评论底部的编码是我不得不离开去上课之前试图做的事情的最后残余,但还没有完成。
请注意:我的编程技能仅限于请解释您的答案,而不是仅仅给出解决方案,因为这不会进一步加深我的理解。
static void Main(string[] args)
{
// 1 = Ace , 13 = King : 0 = Hearts, 1 = Diamonds, 2 = Clubs, 3 = Spades
int[] mainDeck = new int[52];
FillDeck(mainDeck);
int[] playerDeck = new int[26];
int[] computerDeck = new int[26];
// Check mainDeck elements
foreach (int number in mainDeck)
{
Console.WriteLine(number);
}
}
public static void FillDeck(int [] mainDeck)
{
int cardType = 1;
List<int> deck = new List<int>();
// Add cards to a list
for (int x = 0; x < 13; x++)
for(int y = 0; y < 4; y++)
{
deck.Add(cardType);
if (y == 3)
++cardType;
}
// Insert deck list into a new Array
int[] cards = deck.GetRange(0, 52).ToArray();
// Add cards array to mainDeck
for (int x = 0; x < 52; ++x)
{
mainDeck[x] = cards[x];
}
}
//public static void Distribute()
//{
// RandomNumber number = new RandomNumber();
// int value = number.RandomNum;
// List<int> playerCards = new List<int>();
// for (int x = 0; x < 2; ++x)
// {
// Console.WriteLine(number.RandomNum);
// }
//}
}
//class RandomNumber
//{
// private int randomNum;
// Random ranNumberGenerator;
// public RandomNumber()
// {
// ranNumberGenerator = new Random();
// }
// public int RandomNum
// {
// get
// {
// randomNum = ranNumberGenerator.Next(1, 26);
// return randomNum;
// }
// }
//}
如果您尝试像在典型的纸牌游戏中那样随机分发卡片,这里有一篇关于洗牌数组的文章。 - http://www.dotnetperls.com/shuffle - 它应该做你想做的事。
洗牌后,您只需循环遍历它,以与现实生活中发牌相同的方式交替将牌分配给玩家和计算机套牌。
纸牌游戏套牌的常见解决方案
- 使用所有可用的卡牌创建套牌
- 随机播放套牌
- 从顶部获取卡片
所以代码:)
public enum CardColor
{
Hearts = 0,
Diamonds = 1,
Clubs = 2,
Spades = 3
}
public enum CardValue
{
Ace = 1,
Two,
Three,
Four,
Five,
Six,
Seven,
Eight,
Nine,
Ten,
Jack,
Queen,
King
}
public class Card
{
public Card(CardValue value, CardColor color)
{
Value = value;
Color = color;
}
public readonly CardValue Value;
public readonly CardColor Color;
}
public class Deck
{
private Queue<Card> deckInternal;
public Deck()
{
var deck = new List<Card>();
for(int index = 0; index < 52; index++)
{
var cardValue = (CardValue)(index % 4) + 1;
var cardColor = (CardColor)index / 4;
dec.Add(new Card(cardValue, cardColor));
}
var rand = new Random();
dec = dec
.OrderBy(c => rand.Next(52))
.ToList();
deckInternal = new Queue<Card>(deck);
}
public Card GetCard()
{
return deckInternal.Dequeue();
}
}
要获得套牌并拆分它,您可以接下来执行
var deck = new Deck();
var player = new List<Card>();
var computer = new List<Card>();
for(int index = 0; index < 52; index++)
{
if(index % 2 == 0)
{
player.Add(deck.GetCard());
}
else
{
computer.Add(deck.GetCard());
}
}
您有两个选项可以在此处保持牌组中的值唯一。 你可以创建一个表示牌的新类,该类具有 Rank 和 Suit 的属性,或者如果你想保持简单(无论如何,从编译器的角度来看),你可以使用该值来指示等级和花色,而你只使用 1 到 13 来指示等级。
对于后一种解决方案,您可能希望使用数字 0 到 12 来表示 Ace 到红心之王,使用 13 到 25 来表示 Ace 到钻石之王,依此类推。 要获得您将使用的任何卡牌的等级card % 13
并获得您将使用的卡牌的花色card / 4
.
不过,我更喜欢前一种解决方案,并且会创建一个这样的类(您也可以将 int 属性替换为枚举以提高可读性):
public class Card
{
public int Rank { get; set; }
public int Suit { get; set; }
}
之后,您可以创建一个循环,该循环运行直到主套牌为空,并从主套牌中随机挑选一张牌放入其他两副牌中。 在伪代码中,它可能看起来像:
while (mainDeck has any elements)
num = random number between 0 and elements in mainDeck - 1, inclusive
deckToAddTo = alternate between playerDeck and computerDeck
remove card num from mainDeck and insert into deckToAddTo
给玩家前26张牌。
playerDeck = mainDeck.Take(26).ToArray();
跳过玩家的卡并获得接下来的 26 张卡。
computerDeck = mainDeck.Skip(26).Take(26).ToArray();
Random rnd = new Random();
// you can Shuffle Array and Take random 26 items using Linq as below
int[] playerDeck = mainDeck.OrderBy(x => rnd.Next()).Take(26).ToArray();
// get rest of the items using Except linq method
int[] computerDeck = mainDeck.Except(playerDeck).ToArray();