我对编程场景比较陌生。我已经尝试了几种语言,但由于支持和入门的简易性而在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*/
}
}
答案 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)
您可以使用Switch或Ternary 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
逻辑块。