C如何减少if语句

时间:2015-06-06 20:38:50

标签: c

我对编程场景比较陌生。我已经尝试了几种语言,但由于支持和入门的简易性而在C上开始使用。我目前正在尝试编写一个简单的基于文本的征服类游戏。  有了这个,有大量的地方或领土可供选择攻击,什么不是。我给每个地区一个数字ID 1-50,这是我的问题所在。我能想到测试用户输入的ID的唯一方法是编写50个if语句,这些语句非常繁琐且烦人。有更简单的方法吗?

  AttackTrue(){
int AmountOfTroops;
int TerrToAttack;
//List of territories with their id 
// example: int California = 1;
    printf("You have %d troops\n"); 
    printf("Enter the number of troops you want to use.");
            scanf(" %d",&AmountOfInfantry);
            printf("Enter the ID of the territory you want to attack.\n");
            scanf(" %d",&TerrToAttack);
            /*HERE IS WHERE ALL THE IF STATEMENTS WOULD GO*/
            }

}

5 个答案:

答案 0 :(得分:1)

你可以像JerryGoyal建议的那样使用switch case。 另一个方法是使用指向函数的指针数组:

void* (*funcLUT[50])(void*);

创建一个初始化函数来填充数组(最好将DoNothing()函数作为默认值)并根据ID调用函数:

retValue = funcLUT[ID](data);

希望我帮助

答案 1 :(得分:0)

使用switch个案而不是if else

  scanf("%d",&a);    
    switch ( a ) {
    case 1:
      /* Code */
      break;
    case 2:
      /* Code */
      break;
.
.
.
    default:
      /* Code */
      break;
    }

答案 2 :(得分:0)

您可以使用SwitchTernary Operator。它是针对具体实现的用途。您将获得Switch超过if-else

的良好运行时性能案例

答案 3 :(得分:0)

您正在学习如何编程。主要问题不是来自语言本身,而是来自工程师您的系统。让我向你求助你,你没有问正确的问题。

您现在所拥有的是对您的问题的理解不足。不建议以某种方式强制代码“更好”"适合那种可怜的人。试着重新思考这个问题。

例如,如何将您的地区视为网格。具体来说,是一个二维网格。然后继续用细胞填充该网格。

typedef struct Cell {void (*cellBehaviour)(struct Cell *);} Cell;
typedef struct Grid {Cell *cells;} Grid;

从这里开始,您可以为每个单元格添加不同的行为(或者它们可以具有默认行为,它取决于您)。行为用函数表示,所以你可以这样做。

void cellBehaviourDefault(struct Cell *cell);

为每个单元格分配一些行为功能,然后你就不需要任何,只要你有一个单元格做某事,就把它称之为“s”。行为功能。

cell.cellBehaviour(cell);

希望有所帮助。

答案 4 :(得分:0)

正如我在评论中提到的那样,您可以构建您的territories来模拟以下内容:

struct territory
{
    // territory code...

};

由于您提到您有50 territories,因此可以通过创建territories数组并简单地调用具有相应territory作为参数的函数来很好地解决这个问题。这样,就不需要使用if / else语句的长链。这是一个例子:

void attack(struct territory* to_attack)
{
    // attack the territory
}

int main()
{
    const int num_territories = 50;
    struct territory territories[num_territories];   
    int territory_id;

    // code logic, call the following in a loop perhaps, based on user input:
    scanf("%i",&territory_id);
    attack(&territories[territory_id]);
}

我通过指针传递territory,以便您在attack函数中对其所做的任何更改实际上都会在整个游戏中得到反映。如果任何地区需要特殊处理或应受到不同的攻击,territory结构中的简单标志应足以让您在attack函数中实现此更改。而且,如果您将领土增加到50以上,则只需更改一个变量(num_territories),而不是添加新的if/else逻辑块。