我已经制作了一个5骰子yahtzee游戏,我正在尝试使它适用于6个骰子,你能帮助这两个函数更加普遍我的代码:)
我在列表int[] i
中准备了骰子值
我用这个非常简单的方法检测到了fullHouse:
Array.Sort(i);
if( ((i[0] == i[1]) && (i[1] == i[2]) && (i[3] == i[4]))
{
... sum it up
}
else if((i[0] == i[1]) && (i[2] == i[3]) && (i[3] == i[4]))
{
... sum it up
}
我用这个非常简单的方法直接检测到
Array.Sort(i);
if( ((i[0] == 1) &&
(i[1] == 2) &&
(i[2] == 3) &&
(i[3] == 4) &&
(i[4] == 5)) ||
((i[0] == 2) &&
(i[1] == 3) &&
(i[2] == 4) &&
(i[3] == 5) &&
(i[4] == 6)) )
{
... sum it up
}
提前谢谢
答案 0 :(得分:1)
如果你有一个整数列表,你可以检查它们是否是连续值(直线)
bool isfullhouse = !list.Select((i,j) => i-j).Distinct().Skip(1).Any();
return isfullhouse;
您可以通过以下方式将数组设为列表:
var list = yourArray.ToList();
第二个可以修改为:
var list = yourArray.ToList().Skip(2);
if(yourArray[0]==yourArray[1]) // checks XX
{
var distincted = list.Distinct();
if(distincted.Count()==1) // checks if other values are equal
{
if(distincted[0]!=yourArray[0]) // checks if not XXXXXX
return true;
}
}
return false;
它将检查是否有像XX YYYY一样的满屋(它可以有任意数量的Y)
答案 1 :(得分:1)
完全手动编写逻辑会产生难以操作且难以扩展的代码。使用LINQ稍微抽象一些东西会有很大帮助。
要检测完整的房子,组按值滚动并检查每个组的基数(我使用i
作为滚动数组来跟随原始代码,但这是一个错误的数组名称):
var groups = i.GroupBy(i => i);
然后你可以很容易地检查一个完整的房子:
var hasFullHouse = groups.Any(g1 =>
g1.Count >= 3 && groups.Except(g1).Any(g2 => g2.Count >= 2)
);
“如果有任何一组至少有3个骰子,并且还有一个 不同的小组,至少有2个骰子,你有一个满堂红。“
要检查直线,请按顺序迭代组。对于每个,检查表示前一个模具的组是否存在。如果它确实递增计数器,否则重置计数器。如果计数器达到5,则有直线:
var runLength = 0;
var map = groups.ToDictionary(g => g.Key, g => g.Count);
foreach (var roll in map.Keys.OrderBy(k => k))
{
var runLength = map.Contains(roll - 1) ? runLength + 1 : 0;
if (runLength == 5)
{
// straight detected
}
}
无论游戏中的骰子数量如何,这两种方法都能正常工作。