2017-07-26 117 views
0

我觉得我有一个大脑放屁。我想在给定的时间只允许2个布尔值中的一个为真(但两者都可以是假的,因此不完全相反),因此所有可能的状态应该是:只有当一个布尔值设置为true时,才能将另一个布尔值设置为另一个布尔值。

  1. bool1 = false; bool2 = false;
  2. bool1 = true; bool2 = false;
  3. bool1 = false; bool2 = true;

我试过几件事情,包括这个简单的声明:

if(bool1 == true) 
     bool2 = false; 
    if(bool2 == true) 
     bool1 = false; 

但是,这并不工作,因为它不允许BOOL2永远= true如果BOOL1 =正确,因为第一语句首先被读取(设置bool2 = false)。如果一个是真的,另一个是被选中的,我会希望他们切换。任何建议?

谢谢!

+1

它不清楚,你还没说,这是允许的,无论是真实的。什么意思_“另一种选择” _ –

+0

@TimSchmelter他在状态列表 –

+1

没有你为什么不干脆让客户端的值设置为为所欲为,那么错误,如果'BOOL1 && bool2'?你如何决定*两个值中的哪一个应该是'false'否则呢?案件是对称的。除非必须,否则不要破坏对称性。 –

回答

0

编辑:正如你在评论中所说,你的问题是你有2个动画,最多只能一次播放。然后使用enum

enum PlayingAnim { 
    None, 
    Anim1, 
    Anim2 
} 

然后,你需要持有PlayingAnim current并同时实现动画,使他们的行为恭敬地该值。

现在有一个问题,这两个动作(最初是布尔)如何控制。例如,如果您有键绑定,那么您需要(当键处于上一帧,当前处于关闭状态时),请检查当前正在播放的动画。您必须决定,当两个键都关闭时,您的游戏的行为将如何。我会走这样的:

bool k1, k2; // is keys pressed? suppose that at least one is true 
// k1, k2 means: in previous frame, key was up, in this frame it's pressed  

if(k1 && !k2) // this construction applies also for !k1 && k2 
{ 
// select correct anim to play 
} 

if(k1 && k2) 
{ 
    // you need to decide what to do - create new animation? 
    // or ignore and continue with current playing anim? 
} 

而且当按键被释放时,逻辑几乎是相同的,但有负面影响。


老答案:

简单的方法是使用可空 - bool?。然后状态是:

null : both are false 
false : b1 is true, b2 is false 
true : b1 is false, b2 is true 

然后,当你尝试设置b1b2你可以看看控股bool?,然后实现正确的行为。

+0

这是一个非常糟糕的主意。这对任何未来的维护者都是不直观的,并且需要明确的文档。此外,这甚至没有直接解决OP的问题,即在更新阶段**期间,他不知道哪个布尔值应该被保持(如果它们都是真的)**。如果OP知道哪个布尔值是正确的,他将不会遇到上述问题。 – Flater

+0

@Flater由于我们不知道这个逻辑背后的真实意图,所以不可能写出正确的答案。例如,我看到某种'无线电选择',这也可能导致在它后面使用'enum'。但是,如果没有真正意图的知识,就很难说。 –

+2

_it不可能写出正确的答案,所以......你为什么要添加一个? :) – Pikoh

-1

你好干净的方式来做到这一点仅使用一个布尔VAR, 被设置为真/假 一个它的== true使用的情况下BOOL1是真实的,当它的虚假的情况下使用时, bool2是真的,所以你只需要以一种干净的方式操纵一个变量。 希望能帮助
更清洁的方式你只需要控制一个变量只有

祝你好运!

UPDATE

当案例是虚假ü可以指定为null,并检查其空,

+0

这是不适用的,因为它没有考虑假+假状态,这在问题中被明确提及为可能的状态。 – Flater

+0

您的更新仍不能解决问题。首先,你不提及使用可空布尔值。其次,你的答案仍然不能提供一个解决方案,以知道哪些布尔值(必须设为true)必须被保留,哪些布尔值必须被删除。您的答案也与PavelPájaHalbich完全相同。 – Flater

1

前提条件:布尔变量是处于有效状态,

void setB1(bool value) 
    b1 = value; 
    if b1 
    b2 = false; 

void setB2(bool value) 
    b2 = value; 
    if b2 
    b1 = false 
+0

虽然这是一个正确的方法(我将使用的方法),但看起来OP的代码片段在更新阶段运行;而不是在UI中设置值的阶段。要真正帮助OP,这个答案需要详细说明_shifting_从更新逻辑代码到viewmodel本身(基本上:您的答案需要在点击保存按钮之前的某个时间点执行)。 – Flater

0

如果你使用类似'选择器'的东西,你可以只设置其中一个选项为真。

  • 如果bothFalse的值是true,然后设置他们两个是假
  • 如果选择的值是true,则设置BOOL1为真
  • 如果选择的值是假的,然后设置BOOL2为真

您可以简单地使用这样的事情:

 bool bool1; 
     bool bool2; 
     bool selector = false; 
     bool bothFalse = false; 

     if (bothFalse) 
     { 
      bool1 = bool2 = false; 
     } 
     else 
     { 
      switch (selector) 
      { 
       case true: 
        bool1 = true; 
        bool2 = false; 
        break; 
       case false: 
        bool1 = false; 
        bool2 = true; 
        break; 
       default: 
        break; 
      } 
     } 
0

我想你应该制定者工作... 事情是这样的:

static private bool bool1 
    { 
     get 
     { 
      return bool1; 
     } 
     set 
     { 
      bool1 = value; 
      if (bool1 && bool2) 
       bool2 = !bool1 ; 
     } 
    } 
    static private bool bool2 
    { 
     get 
     { 
      return bool2; 
     } 
     set 
     { 
      bool2 = value; 
      bool1 = value; 
      if (bool1 && bool2) 
       bool1 = !bool2; 
     } 
    } 

心连心, Cyrebre

+0

你有正确的方法,但你的实际代码看起来不对。如果有的话,实现应该是对称的,他们目前不是。 – Flater

-1

如果这是一个Web表单,该解决方案将是两个复选框。两者都可以是假的,然后办理强制执行,只有一个能真正用例的事件:

$(document).ready(function() { 
    $('#A').on('click', function() { 
     if (this.checked) { 
     $('#B')[0].checked = false; 
    } 
    }); 

    $('#B').on('click', function() { 
     if (this.checked) { 
     $('#A')[0].checked = false; 
    } 
    }); 
}); 

JSFiddle

服务器端:如果两个都是真的,抛出验证错误。

+0

客户端验证不是验证输入的安全方式。另请参阅:[为什么客户端验证安全风险而不是服务器端验证?](https://stackoverflow.com/questions/3531968/why-is-client-side-validation-a-security-risk -as-opposite-to-server-side-validati) – Flater

+0

我的答案是或将会导致OP的解决方案取决于他的表示层。我认为反对票是没有根据的。 – jaybro

+0

不,它不。甚至没有保证OP正在使用Web界面。如果他不是,那么你的答案是无关紧要的。如果他是,那么你的答案本质上是不安全的,因为它放弃了服务器端验证。你的答案也不应该让OP成为解决方案,它应该是**的解决方案。这不是寻宝。 – Flater

1

好吧,我想出了这个:

public static class ThereCanBeOnlyOne 
{ 
    private static bool _One, _Two; 
    public static bool One 
    { 
     get 
     { 
      return _One; 
     } 
     set 
     { 
      if(value) 
      { 
       _Two = false; 
      } 
      _One = value; 
     } 
    } 

    public static bool Two 
    { 
     get 
     { 
      return _Two; 
     } 
     set 
     { 
      if (value) 
      { 
       _One = false; 
      } 
      _Two = value; 
     } 
    } 
} 

在你的代码,而不是当地的布尔值使用ThereCanBeOnlyOne.OneThereCanBeOnlyOne.Two

当然,你并不真的需要使用不同的类这一点,你可以采用同样的逻辑在你现有的类。

相关问题