我有2名玩家,我希望他们每人能从这52张牌中随机获得26张牌。有没有人知道我怎么能给每个玩家,从52张牌组中的26张随机牌?
这应该清空原来的52卡Deck字典,并创建2个较小的26卡片组字典。
我已经为此奋斗了3天,并完成了我能做的所有研究。 这是我的甲板课程:
class Deck
{
public Dictionary<int, string> CreateNewDeck()
{
Dictionary<int, string> newDeck = new Dictionary<int, string>()
{
{1, "~/cards/c1.png"}, {2, "~/cards/c2.png"}, {3, "~/cards/c3.png"}, {4, "~/cards/c4.png"},
{5, "~/cards/c5.png"}, {6, "~/cards/c6.png"}, {7, "~/cards/c7.png"}, {8, "~/cards/c8.png"},
{9, "~/cards/c9.png"}, {10, "~/cards/c10.png"}, {11, "~/cards/cj.png"}, {12, "~/cards/cq.png"}, {13, "~/cards/ck.png"},
{14, "~/cards/d1.png"}, {15, "~/cards/d2.png"}, {16, "~/cards/d3.png"}, {17, "~/cards/d4.png"},
{18, "~/cards/d5.png"}, {19, "~/cards/d6.png"}, {20, "~/cards/d7.png"}, {21, "~/cards/d8.png"},
{22, "~/cards/d9.png"}, {23, "~/cards/d10.png"}, {24, "~/cards/dj.png"}, {25, "~/cards/dq.png"}, {26, "~/cards/dk.png"},
{27, "~/cards/h1.png"}, {28, "~/cards/h2.png"}, {29, "~/cards/h3.png"}, {30, "~/cards/h4.png"},
{31, "~/cards/h5.png"}, {32, "~/cards/h6.png"}, {33, "~/cards/h7.png"}, {34, "~/cards/h8.png"},
{35, "~/cards/h9.png"}, {36, "~/cards/h10.png"}, {37, "~/cards/hj.png"}, {38, "~/cards/hq.png"}, {39, "~/cards/hk.png"},
{40, "~/cards/s1.png"}, {41, "~/cards/s2.png"}, {42, "~/cards/s3.png"}, {43, "~/cards/s4.png"},
{44, "~/cards/s5.png"}, {45, "~/cards/s6.png"}, {46, "~/cards/s7.png"}, {47, "~/cards/s8.png"},
{48, "~/cards/s9.png"}, {49, "~/cards/s10.png"}, {50, "~/cards/sj.png"}, {51, "~/cards/sq.png"}, {52, "~/cards/sk.png"},
};
return newDeck;
}
}
以下是我试图划分甲板的方法正如你可能看到的那样,我是一个新手:
class Dealer
{
public Dictionary<int, string> DealPlayersDeck(Deck deck, Player human, Player computer)
{
Deck cards = new Deck();
Player humanPlayer = new Player();
Player computerPlayer = new Player();
var fullDeck = cards.CreateNewDeck();
var playerDeck = humanPlayer.PlayerCards;
var computerDeck = computerPlayer.PlayerCards;
int halfDeck = fullDeck.Count() / 2;
foreach (object i in fullDeck)
{
List<int> keyList = new List<int>(fullDeck.Keys);
Random rand = new Random();
int randomKey = keyList[rand.Next(keyList.Count)];
if (!playerDeck.ContainsKey(randomKey))
{
playerDeck.Add(randomKey, fullDeck[randomKey]);
fullDeck.Remove(randomKey);
}
}
return playerDeck;
}
}
答案 0 :(得分:6)
您可以执行以下操作:keyList
将为您提供26个唯一键的列表。循环遍历键并将其添加到playerDeck
同时从fullDeck
中删除它,以便在循环迭代完成后包含不在playerDeck
中的键您可以将其移至computerDeck
。
List<int> keyList = new List<int>(fullDeck.Keys);
Random rand = new Random();
var keyList = keyList.OrderBy(item => rand.Next()).Take(26).ToList();//will take only 26 random keys
foreach (var randKey in keyList) // loop on keylist
{
playerDeck.Add(randKey, fullDeck[randKey]);
fullDeck.Remove(randKey);
}
computerDeck =fullDeck;
答案 1 :(得分:4)
每次都不必在循环中获取键列表。你不必循环字典。只需获取循环外的键列表。洗牌并迭代它。
List<int> keyList = new List<int>(fullDeck.Keys);
Random rand = new Random();
// shuffle list and take first 26 items from it
var shuffled = keyList.OrderBy(item => rand.Next()).ToList();
var keyListfirst = shuffled.Take(26).ToList();
foreach (var randKey in keyListfirst) // loop on keylist
{
playerDeck.Add(randKey, fullDeck[randKey]);
fullDeck.Remove(randKey);
}
// take the rest of the list
var keyListrest = shuffled.Skip(26).ToList();
foreach (var randKey in keyListrest)
{
computerDeck.Add(randKey, fullDeck[randKey]);
fullDeck.Remove(randKey);
}
在这种情况下,您可以安全地删除此条件if (!playerDeck.ContainsKey(randKey))
。因为现在列表被洗牌了,你正在迭代它。所以你不要两件事。
答案 2 :(得分:3)
它应该适合您的要求。
public void DealPlayersDeck()
{
Deck cards = new Deck();
Player humanPlayer = new Player();
Player computerPlayer = new Player();
var fullDeck = cards.CreateNewDeck();
//var playerDeck = humanPlayer.PlayerCards;
//var computerDeck = computerPlayer.PlayerCards;
Dictionary<int, string> playerDeck=new Dictionary<int,string>();
Dictionary<int, string> computerDeck = new Dictionary<int, string>();
int count=1;
while (fullDeck.Keys.Count>0)
{
Random r = new Random();
int randomKey = fullDeck.Keys.ToList().OrderBy(x => r.Next()).First();
if (count % 2 == 0)
{
playerDeck.Add(randomKey, fullDeck[randomKey]);
}
else
{
computerDeck.Add(randomKey, fullDeck[randomKey]);
}
fullDeck.Remove(randomKey);
count++;
}
}