在C Fast中打印字符串或数组的字符

时间:2019-06-29 17:46:13

标签: c arrays printf character

我正在编码一个游戏控制台,我将游戏地图保存在字符数组中,我需要在CMD中将它们打印成彩色(具有不同的颜色),因此我编写了print_map函数在这里,我用printf打印,SetConsoleTextAttribute使它们变成彩色螺母,这太慢了。我需要快速打印这些地图字符,所以请帮助我快速,彩色地打印它们。 / p>

void print_mapp(){
  clear();//clear screen
  int width,height,i,x,y;
  HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);

  width = map_width;
  height = map_height;
  SetConsoleTextAttribute(hConsole,background_color);

  x=4;
  y=2;

  for(i=0;i<width*(height+1);i++){
    SetPosition(x,y);// set cursor to (x,y)
    if(map[i] == ' '){
        SetConsoleTextAttribute(hConsole,background_color);
        printf("%c",map[i]);
    }
    else if(map[i] == wall){
        SetConsoleTextAttribute(hConsole,wall_color);
        printf("%c",map[i]);
    }
    else if(map[i] == solidblock){
        SetConsoleTextAttribute(hConsole,solidblock_color);
        printf("%c",map[i]);

    }
    else if(map[i] == moveblock){
        SetConsoleTextAttribute(hConsole,moveblock_color);
        printf("%c",map[i]);

    }
    else if(map[i] == deathblock){
        SetConsoleTextAttribute(hConsole,death_blk_color);
        printf("%c",map[i]);

    }
    else if(map[i] == character){
        SetConsoleTextAttribute(hConsole,character_color);
        printf("%c",map[i]);

    }
    else if(map[i] == rpoint){
        SetConsoleTextAttribute(hConsole,rpoint_color);
        printf("%c",map[i]);

    }
    else if(map[i] == target){
        SetConsoleTextAttribute(hConsole,target_color);
        printf("%c",map[i]);

    }
    else if(map[i] == object){
        SetConsoleTextAttribute(hConsole,object_color);
        printf("%c",map[i]);

    }
    else if(map[i] == opp){
        SetConsoleTextAttribute(hConsole,opp_color);
        printf("%c",map[i]);

    }

    else if(map[i] == bullet){
        SetConsoleTextAttribute(hConsole,bullet_color);
        printf("%c",map[i]);

    }
    else if(map[i] == '\n'){
      SetConsoleTextAttribute(hConsole,background_color);
      printf("%c",map[i]);
      x = 3;
      y++;
    }
    else{
      SetConsoleTextAttribute(hConsole,wall_color);
      printf("%c",map[i]);

    }

    x++;
  }

}```

1 个答案:

答案 0 :(得分:0)

我猜想每次对SetPosition()SetConsoleTextAttribute()的调用都会导致stdout被刷新。这样一来,您每打印char就会刷新一次。

因此,您应该尝试仅在position或character属性不同于您期望的属性时调用它们。

使用fputc()而不是printf("%c", ..)可能也会提供理论上的加速,但在实际中还不够重要。但是有些人(包括我在内)认为代码看起来更干净了……

因此,这是一个建议的改进:

void
set_attrib(HANDLE h, WORD attr, WORD *old_attr)
{
  if (attr != *old_attr)
    {
      SetConsoleTextAttribute(h, attr);
      *old_attr = attr;
    }
}

void print_mapp()
{
  clear();//clear screen
  int width,height,i,x,y;
  HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);

  width = map_width;
  height = map_height;

  WORD old_attr;

  SetConsoleTextAttribute(hConsole,background_color);
  old_attr = background_color;

  x=4;
  y=2;

  SetPosition(x,y);// set cursor to (x,y)


  for(i=0;i<width*(height+1);i++)
    {
      if(map[i] == ' '){
        set_attr(hConsole, background_color, &old_attr);
        fputc(map[i], stdout);
      }
      else if(map[i] == wall){
        set_attr(hConsole, wall_color, &old_attr);
        fputc(map[i], stdout);
      }
      ....  
      else if(map[i] == '\n'){
        set_attr(hConsole, background_color, &old_attr);
        fputc(map[i], stdout);
        x = 3;
        y++;
        SetPosition(x+1,y);// set cursor to (x,y)

      }
      else{
        set_attr(hConsole, wall_color, &old_attr);
        fputc(map[i], stdout);
      }

    x++;
  }

}

其他提速建议:

  1. 您可以打印ansi颜色代码,而不用调用SetConsoleTextAttribute()
  2. 您可以限制自己只打印那些在上次调用print_mmap()之后更改过的行

一些清理建议(对速度没有明显影响)

  1. fputc()移动到ifif else之外
  2. 相反,map[i]中有可打印的字符,只是enums描述了游戏对象,并在单独的查找数组中查找了可打印的字符和属性。