在图案上闪烁元素

时间:2018-10-05 08:23:45

标签: c++

在考试中遇到了有关C ++中元素闪烁的问题

问题是 “在C ++中打印一个星形图案,并且图案奇数行中偶数位置上的每个星星都必须闪烁”

我已经有了“星型”的代码,也可以在所需位置上标识“元素”,但是我不知道如何使它们闪烁。

#include<iostream>

using std::cin;
using std::cout;
using std::endl;

void oddline(int* i)
{
     for(int j=0;j<=i;j++)
     {

     if(j%2==0)
     {   cout<<"*";     }

     else{

     cout<<"*";//These are the positions which are required to blink.

}
}


int main()
{

  for(int i=0;i<10;i++)
{  
    if(i%2==0)
    oddline(&i);

    else
    for(int j=0;j<=i;j++)
{      cout<<"*";

}
      cout<<endl;
}

}

}

有什么办法让它们闪烁?

1 个答案:

答案 0 :(得分:1)

您需要指定正在打印星星的每一行的屏幕坐标。使用计时器清除并重新打印行以获得所需的闪烁效果。

包括windows.h并使用SetConsoleCursorPosition()设置文本的x-y坐标。这仅适用于Windows平台。

在VC ++中尝试这样的事情:

#include<chrono>
#include<thread>
#include<iostream>
#include <windows.h>

void gotoxy(int x, int y)
{
    COORD coordinate;
    coordinate.X = x;
    coordinate.Y = y;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coordinate);
}

void oddline(int i, bool clear)
{
    for (int j = 0; j <= i; j++)
    {
        if (j % 2 == 0) {
            std::cout << "*";
        }
        else {
            std::cout << (clear? " ": "X");
        }
    }
}

void printStars(bool clear = false)
{
    gotoxy(0, 5);
    for (int i = 0; i < 10; i++){
        if (i % 2 == 0) {
            oddline(i,clear);
        }
        else
            for (int j = 0; j <= i; j++)
            {
                std::cout << "*";

            }
        std::cout << std::endl;
    }
}

int main()
{
    int count = 0;
    while (count < 50)
    {
        printStars();    // redraw all stars  ( draw only target starts for perf)
        std::this_thread::sleep_for(std::chrono::milliseconds(300));
        printStars(true); // erase target stars
        std::this_thread::sleep_for(std::chrono::milliseconds(300));
        count ++;
    }
    return 0;
}

已编辑

为避免线程和计时(仅适用于新手),将sleep_for行替换为delay():

void delay()
{
   int m = 1000; //adjust
   int n = 3200; //adjust
   for(int i=0;i<m;i++)
   {
      for(int j=0;j<n;j++)
      {
         // do nothing
      }
   }
}