更有效的布尔代数,用于比较通配符的条件

时间:2013-10-09 15:07:43

标签: c# operators boolean-logic

在赌场老虎机游戏中,你经常会有一款Wild游戏。将这种机制与其他2件相比较的好方法是什么?例如给了3个游戏片[樱桃] [樱桃] [小丑]将是一场比赛。

我现在使用的代码看起来真的超重,有没有什么可以做的(想想按位运算符?)以便更容易使用?

if ((box1.BoxRank == box2.BoxRank || 
      box1.BoxRank == BoxGameObject.Ranks.Joker ||
      box2.BoxRank == BoxGameObject.Ranks.Joker) &&
    (box1.BoxRank == box3.BoxRank || 
      box1.BoxRank == BoxGameObject.Ranks.Joker ||
      box3.BoxRank == BoxGameObject.Ranks.Joker) &&
    (box2.BoxRank == box3.BoxRank || 
      box2.BoxRank == BoxGameObject.Ranks.Joker ||
      box3.BoxRank == BoxGameObject.Ranks.Joker))
{
  // has 3 of a kind, or 1 joker and 2 of a kind, or 2 jokers and 1 other
  return true;
}

2 个答案:

答案 0 :(得分:2)

如果您根据所有框的值设置来考虑操作,这会更容易。只需从该集合中删除所有的jokers,然后验证所有值是否相同:

var allRanks = new[]{box1.BoxRank, box2.BoxRank, box3.BoxRank};

var threeOfAKind = allRanks.Where(rank => rank != BoxGameObject.Ranks.Joker)
    .Distinct()
    .Count() < 2;

首先删除所有的笑话。如果在这之后有两个或更多不同的值,那么我们就没有三个。

答案 1 :(得分:1)

是的,将Joker表示为包含所有二进制1的int,如7,15或31。 代表樱桃和其他人使用int,只有单个二进制1,比小丑的1,2,4,8小。不使用零。 然后,使用按位AND您的条件相当于:

(box1.BoxRank & box2.BoxRank & box3.BoxRank) > 0

请注意,3个Jokers也会满足这个条件。