如何简化C编程中的多个重复if/else if语句

如何简化C编程中的多个重复if/else if语句,c,performance,if-statement,coordinates,coding-efficiency,C,Performance,If Statement,Coordinates,Coding Efficiency,我目前正在制作一个游戏,它需要很多if语句来找出用户点击的位置,并据此进行操作。它检查用户是否在指定的坐标中单击。下面的代码工作得非常好,但是我很难想出一个有效的方法来实现这一点(不仅是针对这段代码,而且是针对一般的任何代码) if((mx>78)&&(mx157)&(my116)和&(mx157)和(my153)和&(mx157)和&(my196)和(&&(mx157)和(&(my233)&&(mx157)&(my270)和(&&(mx157)和(&(my311)&&(mx157)&(my34

我目前正在制作一个游戏,它需要很多if语句来找出用户点击的位置,并据此进行操作。它检查用户是否在指定的坐标中单击。下面的代码工作得非常好,但是我很难想出一个有效的方法来实现这一点(不仅是针对这段代码,而且是针对一般的任何代码)

if((mx>78)&&(mx<113)&&(my>157)&(my<191))ifff(0,0,78,157,113,191);
如果((mx>116)和&(mx<150)和(my>157)和(my<191))ifff(1,0,116,157,150,191);
如果((mx>153)和&(mx<188)和&(my>157)和&(my<191))ifff(2,0,153,157,188,191);
如果((mx>196)和(&&(mx<230)和(&(my>157)和(&(my<191))ifff(3,0196157,230,191);
如果((mx>233)&&(mx<267)&&(my>157)&(my<191))ifff(4,0233157,267191);
如果((mx>270)和(&&(mx<303)和(&(my>157)和(&(my<191))ifff(5,0,270,157,303,191);
如果((mx>311)&&(mx<345)&&(my>157)&(my<191))ifff(6,0,311,157,345,191);
如果((mx>348)&&(mx<384)&&(my>157)&(my<191))ifff(7,0348157384191);
如果((mx>388)&(mx<421)&&(my>157)&(my<191))ifff(8,0388157,421191);
如果((mx>78)&(mx<113)&(my>194)&(my<229))ifff(0,1,78,194,113,229);
如果((mx>116)&(mx<150)&(my>194)&(my<229))ifff(1,1116194150229);
如果((mx>153)和&(mx<188)和&(my>194)和&(my<229))ifff(2,1,153,194,188,229);
如果((mx>196)和&(mx<230)和&(my>194)和&(my<229))ifff(3,1196194230229);
如果((mx>233)&&(mx<267)&&(my>194)&(my<229))ifff(4,1233194267229);
如果((mx>270)&&(mx<303)&&(my>194)&(my<229))ifff(5,127194303229);
如果((mx>311)&&(mx<345)&&(my>194)&(my<229))ifff(6,13111944345229);
如果((mx>348)&(mx<384)&&(my>194)&(my<229))ifff(7,1348194384229);
如果((mx>388)&(mx<421)&&(my>194)&(my<229))ifff(8,1388194421229);
如果((mx>78)和&(mx<113)和&(my>231)和&(my<266))ifff(0,2,78,231,113,266);
如果((mx>116)和(&&(mx<150)和(&(my>231)和(&(my<266))ifff(1,2,116,231,150,266);
如果((mx>153)&&(mx<188)&&(my>231)&(my<266))ifff(2,215323188266);
如果((mx>196)和(&&(mx<230)和(&(my>231)和(&(my<266))ifff(3,21964231230266);
如果((mx>233)&&(mx<267)&&(my>231)&(my<266))ifff(4,223231267266);
如果((mx>270)和(&&(mx<303)和(&(my>231)和(&(my<266))ifff(5,270231303266);
如果((mx>311)和(&&(mx<345)和(&(my>231)和(&(my<266))ifff(6,231231345266);
如果((mx>348)&&(mx<384)&&(my>231)&(my<266))ifff(7,2348231384266);
如果((mx>388)&(mx<421)&&(my>231)&(my<266))ifff(8,2388,231,421,266);
如果((mx>78)和&(mx<113)和&(my>231)和&(my<266))ifff(0,3,78,231,113,266);
如果((mx>116)和&(mx<150)和&(my>231)和&(my<266))ifff(1,3,116,231,150,266);
如果((mx>153)和(&&(mx<188)和(&(my>231)和(&(my<266))ifff(2,3,153,231,188,266);
如果((mx>196)和(&&(mx<230)和(&(my>231)和(&(my<266))ifff(3,3,196,231,230,266);
如果((mx>233)&&(mx<267)&&(my>231)&(my<266))ifff(4,3,233,231,267,266);
如果((mx>270)和(&&(mx<303)和(&(my>231)和(&(my<266))ifff(5,3270231303266);
如果((mx>311)和(&&(mx<345)和(&&(my>231)和(&(my<266))ifff(6,3,311,231,345,266);
如果((mx>348)&&(mx<384)&&(my>231)&(my<266))ifff(7,3348231384266);
如果((mx>388)&(mx<421)&&(my>231)&(my<266))ifff(8,3388231421266);

为此,有如下数据结构:,请参阅Cormen的一章或麻省理工学院算法课程中有关此数据结构的一些讲座。

基本思想是找到一种方法,以某种数据结构表示代码中每行/块中的数据,然后创建这些数据结构的数组并在其上循环

最简单的方法是创建一个数组,该数组将保存有关这些条件的数据

比如说,

[78, 113, 157, 191]   # represents first if statement
然后,您可以创建一个包含9个这样的数组的数组,它将表示您在上面每个部分中的9个条件

然后,您可以创建一个由四个这样的数组组成的数组,其中每个成员最终将表示代码中的每个部分

最后,您只需遍历所有这些,如:

for (i=0; i<4; i++)
    for (j=0; j<9; j++)
        if (mx > my_map[i][j][0]) && (mx < my_map[i][j][1]) ...
            ifff(j, i, my_map[i][j][0], ....

for(i=0;i似乎是您的区间集合中的某种结构。
((mx>78)和&(mx<113))
被多次使用……然后您可以在代码中反映该结构,如:

if ((mx > 78) && (mx < 113)
    if (condition on my)
    else if (condition on my)
    ...
else if (condition on mx)
    if (condition on my)
    else if (condition on my)
    ...
if((mx>78)和&(mx<113)
如果(我的条件)
否则如果(我的条件)
...
否则如果(mx上的条件)
如果(我的条件)
否则如果(我的条件)
...
当然,这会破坏阅读的规律性,但一切都有代价。你甚至可以分解更多(想法是测试任何条件一次):

if(mx>78)
如果(mx<113)
如果(我的第一个条件)
如果(我的第二个条件)
...

正如我在一篇评论中所指出的,您的第四块
else if
语句出现了复制粘贴问题。它具有相同的y范围(
my>231和&my<266
)因此,它永远不会有任何用处,因为如果范围匹配,第三个块将优先,如果不匹配,它只是浪费时间重复一系列将失败的测试

但是,您有一个相当清晰的结构,它可以通过两个表、一个查找函数和对
ifff()
函数的一次调用来更好地表示,如下所示:

struct Range
{
    int lo;
    int hi;
    int key;
};

static const struct Range x_range[] =
{
    {  78, 113, 0 },
    { 116, 150, 1 },
    { 153, 188, 2 },
    { 196, 230, 3 },
    { 233, 267, 4 },
    { 270, 303, 5 },
    { 311, 345, 6 },
    { 348, 384, 7 },
    { 388, 421, 8 },
};
enum { NUM_X_RANGE = sizeof(x_range) / sizeof(x_range[0]) };

static const struct Range y_range[] =
{
    { 157, 191, 0 },
    { 194, 229, 1 },
    { 231, 266, 2 },
    { 268, 299, 3 },    /* Guessed range */
};
enum { NUM_Y_RANGE = sizeof(y_range) / sizeof(y_range[0]) };

static inline int range_lookup(int val, const struct Range *range, int num_ranges)
{
    for (int i = 0; i < num_ranges; i++)
    {
        if (val > range[i].lo && val < range[i].hi)
            return i;
    }
    return -1;
}

extern void ifff_range(int mx, int my);
extern void ifff(int xkey, int ykey, int xlo, int ylo, int xhi, int yhi);

void ifff_range(int mx, int my)
{
    int xr = range_lookup(mx, x_range, NUM_X_RANGE);
    int yr = range_lookup(my, y_range, NUM_Y_RANGE);
    if (xr != -1 && yr != -1)
        ifff(x_range[xr].key, y_range[yr].key,
             x_range[xr].lo,  y_range[yr].lo,
             x_range[xr].hi,  y_range[yr].hi);
}
struct范围
{
内卢;
int hi;
int键;
};
静态常量结构范围x_范围[]=
{
{  78, 113, 0 }
    if (mx > 78)
        if (mx < 113)
            if (first condition on my)
               if (second condition on my)
    ...
struct Range
{
    int lo;
    int hi;
    int key;
};

static const struct Range x_range[] =
{
    {  78, 113, 0 },
    { 116, 150, 1 },
    { 153, 188, 2 },
    { 196, 230, 3 },
    { 233, 267, 4 },
    { 270, 303, 5 },
    { 311, 345, 6 },
    { 348, 384, 7 },
    { 388, 421, 8 },
};
enum { NUM_X_RANGE = sizeof(x_range) / sizeof(x_range[0]) };

static const struct Range y_range[] =
{
    { 157, 191, 0 },
    { 194, 229, 1 },
    { 231, 266, 2 },
    { 268, 299, 3 },    /* Guessed range */
};
enum { NUM_Y_RANGE = sizeof(y_range) / sizeof(y_range[0]) };

static inline int range_lookup(int val, const struct Range *range, int num_ranges)
{
    for (int i = 0; i < num_ranges; i++)
    {
        if (val > range[i].lo && val < range[i].hi)
            return i;
    }
    return -1;
}

extern void ifff_range(int mx, int my);
extern void ifff(int xkey, int ykey, int xlo, int ylo, int xhi, int yhi);

void ifff_range(int mx, int my)
{
    int xr = range_lookup(mx, x_range, NUM_X_RANGE);
    int yr = range_lookup(my, y_range, NUM_Y_RANGE);
    if (xr != -1 && yr != -1)
        ifff(x_range[xr].key, y_range[yr].key,
             x_range[xr].lo,  y_range[yr].lo,
             x_range[xr].hi,  y_range[yr].hi);
}