将 2 个 if 语句简化为一个循环
simplification of 2 if statements into a loop
我想简化一个代码片段,其中我有一个主循环,其中放置了 2 个 if 语句。第一个 if 语句是关于测试“if (test1 or test2)
”,第二个是测试“if (test1 and test2)
”。
目前,为了区分它们,我必须在更高级别(但仍在主循环中)放置另一个 "if"(在 diagExpression boolean
上测试,见下文);这是代码:
// Main loop
while (Hit.arrayCurrent[Hit.coordCurrent[0]+k][Hit.coordCurrent[1]+l] == Hit.currentPlayer[1])
{
if (diagExpression)
{
if ((a > b) || (b > c))
return;
else if (d)
{
//do stuff1
}
}
else
{
if ((a > b) && (b > c))
return;
else if (d)
{
//do stuff1
}
}
}
我不知道如何简化此代码段并避免使用 stuff1
2 次。
如果有人能看到解决方案。
更新:
diagExpression
在主循环之前计算:
// Boolean for 2 versions
var diagExpression = false;
if (Hit.direction == 'rightbottom')
{
diagExpression = true;
shift_x = 1;
shift_y = 1;
factor_x = 1;
factor_y = 1;
limit_x = 7;
limit_y = 7;
}
else if (Hit.direction == 'left')
{
shift_x = -1;
shift_y = 0;
factor_x = -1;
factor_y = 1;
limit_x = 0;
limit_y = -1;
}
...
// Main loop
while (Hit.arrayCurrent[Hit.coordCurrent[0]+k][Hit.coordCurrent[1]+l] == Hit.currentPlayer[1])
我在我的代码中使用了不同的方向值,如果我有对角线方向,这个布尔值是真,vertical/horizontal 方向是假。
你可以这样使用:
if (diagExpression) {
if ((a > b) || (b > c))
return;
if ((a > b) && (b > c))
return;
}
if (d){
//do stuff1
}
我相信@Daniel Daranas 也是这个意思。
首先,您可以简化代码,这样 stuff1 只需编写一次:
while (…) {
if (diagExpression) {
if ((a > b) || (b > c))
return;
} else {
if ((a > b) && (b > c))
return;
}
if (d) {
// do stuff1
}
}
甚至
while (…) {
if (diagExpression ? (a > b) || (b > c) : (a > b) && (b > c)) {
return;
} else if (d) {
// do stuff1
}
}
然后你可以得到更高级的东西,比如
while (…) {
if ((a > b) + (b > c) >= 2 - diagExpression) {
return;
} else if (d) {
// do stuff1
}
}
虽然这变得相当难读,甚至可能更慢。
我想简化一个代码片段,其中我有一个主循环,其中放置了 2 个 if 语句。第一个 if 语句是关于测试“if (test1 or test2)
”,第二个是测试“if (test1 and test2)
”。
目前,为了区分它们,我必须在更高级别(但仍在主循环中)放置另一个 "if"(在 diagExpression boolean
上测试,见下文);这是代码:
// Main loop
while (Hit.arrayCurrent[Hit.coordCurrent[0]+k][Hit.coordCurrent[1]+l] == Hit.currentPlayer[1])
{
if (diagExpression)
{
if ((a > b) || (b > c))
return;
else if (d)
{
//do stuff1
}
}
else
{
if ((a > b) && (b > c))
return;
else if (d)
{
//do stuff1
}
}
}
我不知道如何简化此代码段并避免使用 stuff1
2 次。
如果有人能看到解决方案。
更新:
diagExpression
在主循环之前计算:
// Boolean for 2 versions
var diagExpression = false;
if (Hit.direction == 'rightbottom')
{
diagExpression = true;
shift_x = 1;
shift_y = 1;
factor_x = 1;
factor_y = 1;
limit_x = 7;
limit_y = 7;
}
else if (Hit.direction == 'left')
{
shift_x = -1;
shift_y = 0;
factor_x = -1;
factor_y = 1;
limit_x = 0;
limit_y = -1;
}
...
// Main loop
while (Hit.arrayCurrent[Hit.coordCurrent[0]+k][Hit.coordCurrent[1]+l] == Hit.currentPlayer[1])
我在我的代码中使用了不同的方向值,如果我有对角线方向,这个布尔值是真,vertical/horizontal 方向是假。
你可以这样使用:
if (diagExpression) {
if ((a > b) || (b > c))
return;
if ((a > b) && (b > c))
return;
}
if (d){
//do stuff1
}
我相信@Daniel Daranas 也是这个意思。
首先,您可以简化代码,这样 stuff1 只需编写一次:
while (…) {
if (diagExpression) {
if ((a > b) || (b > c))
return;
} else {
if ((a > b) && (b > c))
return;
}
if (d) {
// do stuff1
}
}
甚至
while (…) {
if (diagExpression ? (a > b) || (b > c) : (a > b) && (b > c)) {
return;
} else if (d) {
// do stuff1
}
}
然后你可以得到更高级的东西,比如
while (…) {
if ((a > b) + (b > c) >= 2 - diagExpression) {
return;
} else if (d) {
// do stuff1
}
}
虽然这变得相当难读,甚至可能更慢。