C++ 这个switch语句可以缩短吗?

C++ 这个switch语句可以缩短吗?,c++,switch-statement,allegro,allegro5,C++,Switch Statement,Allegro,Allegro5,这个switch语句可以缩短吗?这样做合适吗?这是一件简单的事情,我不知道使用开关是否有意义 这部分代码遍历一个数组,获取颜色的亮度值(从0到大约10),并使用allegro库用这种颜色绘制一个正方形。因此,对于7和更多,它将是黑色的,对于更少的,它将是灰色的,对于1,它将是非常浅灰色的 for (int j = 0; j < 50; j++) { for (int i = 0; i < 50; i++) { int value = cells[i + j

这个switch语句可以缩短吗?这样做合适吗?这是一件简单的事情,我不知道使用开关是否有意义

这部分代码遍历一个数组,获取颜色的亮度值(从0到大约10),并使用allegro库用这种颜色绘制一个正方形。因此,对于7和更多,它将是黑色的,对于更少的,它将是灰色的,对于1,它将是非常浅灰色的

 for (int j = 0; j < 50; j++) {
    for (int i = 0; i < 50; i++) {
        int value = cells[i + j * 50];
        if(value > 0) {
            unsigned char color;
            switch (value) {
                case 1 :
                     color = 200;
                    break;
                case 2 :
                    color = 180;
                    break;
                case 3 :
                    color = 140;
                    break;
                case 4 :
                    color = 100;
                    break;
                case 5 :
                    color = 60;
                    break;
                case 6 :
                    color = 40;
                    break;
                case 7 :
                    color = 20;
                    break;
                default: color = 0;
            }
            al_draw_filled_rectangle(i * 8, 400 - (j * 8), i * 8 + 8, 400 - (j * 8 + 8),
                                     al_map_rgb(color, color, color));
        }
    }
}
for(int j=0;j<50;j++){
对于(int i=0;i<50;i++){
int值=单元格[i+j*50];
如果(值>0){
无符号字符颜色;
开关(值){
案例1:
颜色=200;
打破
案例2:
颜色=180;
打破
案例3:
颜色=140;
打破
案例4:
颜色=100;
打破
案例5:
颜色=60;
打破
案例6:
颜色=40;
打破
案例7:
颜色=20;
打破
默认值:color=0;
}
绘制填充矩形(i*8400-(j*8),i*8+8400-(j*8+8),
颜色,颜色,颜色);
}
}
}

您可以使用查找表而不是
开关
语句

static const unsigned char COLORS[] = { 0, 200, 180, 140, 100, 60, 40, 20 };

unsigned char color = 
  value >= 0 && value < sizeof COLORS / sizeof *COLORS ? COLORS[value] : 0;
static const unsigned char COLORS[]={0,200,180,140,100,60,40,20};
无符号字符颜色=
值>=0&&value
您可以使用查找表而不是
开关
语句

static const unsigned char COLORS[] = { 0, 200, 180, 140, 100, 60, 40, 20 };

unsigned char color = 
  value >= 0 && value < sizeof COLORS / sizeof *COLORS ? COLORS[value] : 0;
static const unsigned char COLORS[]={0,200,180,140,100,60,40,20};
无符号字符颜色=
值>=0&&value
它可以重写如下:

int colors[]={100,80,60,40,20};
for (int j = 0; j < 50; j++) {
    for (int i = 0; i < 50; i++) {
        int value = cells[i + j * 50];
        unsigned int color=0;
        color=colors[value];          
    }
}
int colors[]={100,80,60,40,20};
对于(int j=0;j<50;j++){
对于(int i=0;i<50;i++){
int值=单元格[i+j*50];
无符号整数颜色=0;
颜色=颜色[值];
}
}

它可以重写如下:

int colors[]={100,80,60,40,20};
for (int j = 0; j < 50; j++) {
    for (int i = 0; i < 50; i++) {
        int value = cells[i + j * 50];
        unsigned int color=0;
        color=colors[value];          
    }
}
int colors[]={100,80,60,40,20};
对于(int j=0;j<50;j++){
对于(int i=0;i<50;i++){
int值=单元格[i+j*50];
无符号整数颜色=0;
颜色=颜色[值];
}
}

这将有助于缩短开关。您只需浪费7行线来填充地图:

#include <map>
#include <iostream>
using namespace std;

int main() {
  int color;
  int value;
  cout << "Enter a color value 1-7: ";
  cin >> value;

  map<int, int> colormap;
  colormap[1] = 200;
  colormap[2] = 180;
  // etc...                                                                                                                            

  color = colormap[value];
  cout << "color = " << color << endl;

  return 0;
}
#包括
#包括
使用名称空间std;
int main(){
内色;
int值;
cout>值;
地图彩色地图;
彩色地图[1]=200;
彩色地图[2]=180;
//等等。。。
颜色=颜色映射[值];

cout这将有助于缩短切换时间。您只需浪费7行代码来填充地图:

#include <map>
#include <iostream>
using namespace std;

int main() {
  int color;
  int value;
  cout << "Enter a color value 1-7: ";
  cin >> value;

  map<int, int> colormap;
  colormap[1] = 200;
  colormap[2] = 180;
  // etc...                                                                                                                            

  color = colormap[value];
  cout << "color = " << color << endl;

  return 0;
}
#包括
#包括
使用名称空间std;
int main(){
内色;
int值;
cout>值;
地图彩色地图;
彩色地图[1]=200;
彩色地图[2]=180;
//等等。。。
颜色=颜色映射[值];


cout看起来像是
value
color
有一个非常简单的关系,可以用一个方程来表示。哦,很抱歉,这是我的错误,value=5。它们只是随机数,想法就是让颜色的数字越高,值越低。为什么不建立一个关系,这样你就可以做一个简单的数学表达式开关的ead?看起来像
value
color
有一个非常简单的关系,可以用一个方程来表示。哦,很抱歉,这是我的错误,value=5。它们只是随机数,想法就是让颜色的数字越高,值越低。为什么不建立一个关系,这样你们就可以做一个简单的数学表达式呢Session而不是开关?这很好,但我得到了一个警告:值类型const int可能不适合接收器类型unsigned char。我认为这是因为末尾的0::(unsigned char)0;”有帮助,但我猜这不是一种正确的方法,我得到了以下警告:有符号和无符号整数表达式之间的比较[-Wsign比较]value@Mateusz这可能是一个提示,
value
需要无符号。您在这里使用有符号类型有什么特殊原因吗?是的,因为value是正的颜色强度。这很好,但我得到了一个警告:值类型const int可能不适合接收器类型unsigned char、 我认为这是因为结尾处的0“:(unsigned char)0;”有帮助,但我猜这不是一种正确的方法,我得到了以下信息:警告:有符号和无符号整数表达式之间的比较[-Wsign compare]value@Mateusz这可能暗示
value
需要无符号。您在这里使用有符号类型有什么特殊原因吗?是的,因为值是一个正的颜色强度。如果值为7,则我们将退出数组索引这只是一个示例。您可以射线放大,或在查找值之前检查索引等。如果
,则需要添加一个
(或例如,调用
min
)要处理
默认值:
。如果值为7,则我们将退出数组索引这只是一个示例。您可以将数组变大,或在查找值之前检查索引等。您需要添加
if
(例如,调用
min
)要处理
默认值:
。这比开关差这比开关差