当前位置: 首页 > 知识库问答 >
问题:

“if”语句太多?

边桐
2023-03-14

下面的代码确实可以按照我需要的方式工作,但是它很难看、太多或者其他一些事情。我看过一些公式,并试图写出一些解决方案,但最终得到的是类似数量的语句。

在这种情况下,有没有一种数学公式对我有利,或者16个if语句是可以接受的?

解释一下代码,这是一种同时回合制游戏。两个玩家各有四个动作按钮,结果来自一个数组(0-3),但如果这有帮助,变量'one'和'two'可以赋值任何值。结果是,0=两个都不赢,1=p1赢,2=p2赢,3=两个都赢。

public int fightMath(int one, int two) {

    if(one == 0 && two == 0) { result = 0; }
    else if(one == 0 && two == 1) { result = 0; }
    else if(one == 0 && two == 2) { result = 1; }
    else if(one == 0 && two == 3) { result = 2; }
    else if(one == 1 && two == 0) { result = 0; }
    else if(one == 1 && two == 1) { result = 0; }
    else if(one == 1 && two == 2) { result = 2; }
    else if(one == 1 && two == 3) { result = 1; }
    else if(one == 2 && two == 0) { result = 2; }
    else if(one == 2 && two == 1) { result = 1; }
    else if(one == 2 && two == 2) { result = 3; }
    else if(one == 2 && two == 3) { result = 3; }
    else if(one == 3 && two == 0) { result = 1; }
    else if(one == 3 && two == 1) { result = 2; }
    else if(one == 3 && two == 2) { result = 3; }
    else if(one == 3 && two == 3) { result = 3; }

    return result;
}

共有2个答案

欧君之
2023-03-14

由于您的数据集如此之小,您可以将所有内容压缩为1个长整数,并将其转化为公式

public int fightMath(int one,int two)
{
   return (int)(0xF9F66090L >> (2*(one*4 + two)))%4;
}

这就利用了这样一个事实:一切都是2的倍数

public int fightMath(int one,int two)
{
   return (0xF9F66090 >> ((one << 3) | (two << 1))) & 0x3;
}

我能说什么呢?这个世界需要魔力,有时某件事的可能性呼唤它的创造。

解决OP问题的函数的本质是从域{0,1,2,3}的2个数(1,2,2)到范围{0,1,2,3}的映射。每一个答案都探讨了如何实现该地图。

同样,你可以在许多答案中看到一个问题的重述,作为一个2位数字基础的4个数字N(一,二)的映射,其中一是数字1,二是数字2,并且N=4*1+2;N={0,1,2,...,15}--16个不同的值,这很重要。函数的输出是一个1位数的4个数字{0,1,2,3}--4个不同的值,也很重要。

现在,1位基数4的数字可以表示为2位基数2的数字;{0,1,2,3}={00,01,10,11},因此每个输出只能用2位进行编码。从上面看,只有16种不同的输出可能,因此16*2=32位是编码整个映射所必需的全部;这些都可以放入1个整数。

常数M是映射M的编码,其中M(0)被编码在位M[0:1]中,M(1)被编码在位M[2:3]中,并且M(n)被编码在位M[n*2:n*2+1]中。

剩下的就是索引并返回常数的右部分,在这种情况下,可以将M右移2*N次,取2个最低有效位,即(M>>2*N)&0x3。表达式(one<<3)和(two<<1)只是将事物相乘,同时注意到2*x=x<<1和8*x=x<<3。

漆雕欣德
2023-03-14

如果你无法得出一个公式,你可以用一个表来计算这样有限的结果:

final int[][] result = new int[][] {
  { 0, 0, 1, 2 },
  { 0, 0, 2, 1 },
  { 2, 1, 3, 3 },
  { 1, 2, 3, 3 }
};
return result[one][two];
 类似资料:
  • 我有一些话题要讨论。我有一个24s/s的代码片段。是我自己的类,它表示类似于的功能。 这是一段代码: 我从可读性的角度考虑。是否最好将其更改为24个类并使用多态性?我不相信它会使我的代码可维护。。。一方面,那些if很清楚,应该不难理解,另一方面,if太多了。 我的问题相当笼统,但是我用Python编写代码,所以我不能使用像switch这样的构造。 你觉得呢? 更新: 一件重要的事情是、和是构造函数

  •  if 语句,就是类似于「如果○○的话,做●●」,根据条件判断脚本的一部分是否执行的语法。  语法如下: if(expression) 语句或语句块 else 语句或语句块  第一个“语句或语句块”是当 expression 表达式的结果为真时执行的部分,第二个“语句或语句块”则是结果为假时执行的部分。如果不需要 else 以后的部分,可以省略。 例: if(a==b) inform("a和b相等

  • 主要内容:示例第一个决策声明中,我们来看看 'if' 语句。在 Erlang 这个语句的一般形式,如下面的程序所显示 - 在 Erlang 中,条件它是计算结果为真或假的表达式。如果条件为真,则 statement#1 将被执行,否则 statement#2 将被执行。 下面的程序是 Erlang 中的 if 表达式的一个简单的例子 - 示例 以下是上述程序需要说明的一些关键点 - 这里所使用的表达式是变量A和

  • Rust 的 if 并不是特别复杂,不过你会发现它更像动态类型语言而不是更传统的系统语言。所以让我来说说它,以便你能把握这些细节。 if 语句是分支这个更加宽泛的概念的一个特定形式。它的名字来源于树的树枝:一个选择点,根据选择的不同,将会使用不同的路径。 在 if 语句中,有一个引向两条路径的选择: let x = 5; if x == 5 { println!("x is five!"

  • Swift 条件语句 一个 if 语句 由一个布尔表达式后跟一个或多个语句组成。 语法 Swift 语言中 if 语句的语法: if boolean_expression { /* 如果布尔表达式为真将执行的语句 */ } 如果布尔表达式为 true,则 if 语句内的代码块将被执行。如果布尔表达式为 false,则 if 语句结束后的第一组代码(闭括号后)将被执行。 流程图 实例 i

  • 在程序中 if 语句属于条件语句的一种。 如同 if 的本意,就是根据条件做不同的事情。 1. 基本语法 if 语句的最基本语法如下: // 方式1 if (条件) { // 条件满足做的事情; } // 方式2 if (条件) 条件满足时候做的事情; 通常方式2的使用场景是在条件满足时只会写一行代码的情况,有些代码压缩工具可能会将多个语句配合逗号表达式压缩成方式2。 这是 if 语句两种