在控制台窗口中输出颜色方阵

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在控制台窗口中输出颜色方阵相关的知识,希望对你有一定的参考价值。

设计一个能够在控制台窗口中输出彩带的程序,要求实现的功能包括:根据用户的输入选择来输出规则颜色阵列和随机颜色阵列两种阵列形式
2. 问题详细描述
设计一个在控制台输出彩带的程序,要求首先提示用户选择颜色阵列的类型(规则颜色、随机颜色或退出),然后根据用户的输入,输出相应的阵列。然后再次要求用户选择阵列类型或退出程序。
要求编写多个函数分别实现上述功能,而后在main函数中进行调用。
3. 问题的解决方案:
根据问题的描述,可以按照程序要求的功能采用结构化的设计思想。
首先输出颜色阵列的过程是个循环过程,当用户的输入满足循环的退出条件时结束程序的运行(在示例程序中,循环的退出条件是用户输入了0和1之外的数值)。
在用户输入了相应的选择后,在屏幕上输出阵列。因为控制台只支持16种颜色,所以输出的阵列应该是16*16的阵列。对于规则的颜色阵列,各行前景色颜色不同,各列背景色不同,每个阵列元素输出的字符均是大写的‘Z’。而对于随机阵列来说16*16的阵列中的每个元素的前景色、背景色和输出字符都是随机的。
四、主要技术问题的描述
根据三的分析,主要问题在于:
1. 控制台的基本概念
控制台(Console)是一个基于字符界面的交互平台。Windows 2000里面自带的控制台同样也是一个基于字符界面的交互平台。我们本学期实验所编写的程序都是基于控制台的C++程序。
在默认设置下,Windows 2000的控制台能够显示25行80列的字符,我们可以把控制台看作是一个有25行80列的一个矩阵,每个矩阵的元素能够显示一个标准的ASCII字符(汉字需要两个元素来显示)。
2. 控制台的颜色控制
控制台中的每个元素可以使用独立的前景色和背景色。在Windows 2000的控制台中可以使用的颜色有16种,见下图:

上图中的颜色编码自左至右依次是0至15,0为黑色,15为白色。前景色和背景色都只有这16种颜色。
3. 控制台颜色的控制时机
因为控制台不能更改已经输出字符的颜色设置,所以要想更改输出的字符的颜色设置,必须在输出之前更改控制台的颜色配置。
要改变控制台的颜色设置需要调用两个Windows操作系统的API函数。GetStdHandle函数用来获得当前控制台的句柄,用SetConsoleTextAttribute函数来改变选中控制台的颜色控制。这两个函数的声明存在于<windows.h>文件中。可以将这两个调用封装到SetColor函数中:

例如:如果需要改变当前的控制台输出颜色为白底红字,则可以书写如下代码:

这段代码就可以输出白底红字的“Hello World”字符串了。
4. cout的缓冲区刷新
cout对象默认情况下并不会将用户的输出送到控制台,而是暂时存在输出缓冲区里面,而控制台的颜色控制只在向控制台输出的时候才生效。所以只有强制刷新输出缓冲区的时候颜色设置才会生效。例如我们要输出两个字符A,第一个是白底红字,第二个是红底白字,那么下面的代码:

输出的将是两个红底白字的字符“A”。因为虽然输出第一个“A”之前把控制台设置为白底红字,但是此时并没有把第一个“A”输出到控制台,而只是存放于输出缓冲区里面。然后控制台的颜色被设置为红底白字,然后输出“A”。最终程序结束的时候自动强制刷新控制台,把输出缓冲区里面的两个字符“A”都发送给控制台,因为此时的控制台颜色是红底白字,所以两个“A”都被显示为红底白字。
为了强制刷新控制台,可以使用endl和flush两个操作符,endl表示先换行然后强制刷新,flush表示直接强制刷新而不换行,所以上面的代码只要在每个cout语句的最后加上“<< flush”就可以把输出两个不同颜色配置的字符“A”了(参看下面的代码)。

5. 随机数的产生
随机数的产生可以使用rand函数,该函数的具体使用方法请查阅MSDN。
大家帮忙啊~~~

参考技术A #include "stdafx.h"
#include "iostream.h"
#include "windows.h"
#include "conio.h"
#include "time.h"
#include "stdlib.h"
int SetColor(WORD Forg, WORD Back)

Forg=(Forg&0x0f)+((Back<<4)&0xf0);
HANDLE hOutput=GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hOutput,Forg);
return Forg;

int Regulation()

int i,j;
for(i=0;i<16;i++)

for(j=0;j<16;j++)

SetColor(i,j);
cout<<"Z"<<flush;

cout<<endl;

cout<<endl<<endl<<endl;
return 0;


int Random()

int i,j;
char c;
for(i=0;i<16;i++)

for(j=0;j<16;j++)

SetColor(rand()%16,rand()%16);//产生随机色
c=rand()%26+'A';
cout<<c<<flush;

cout<<endl;

cout<<endl<<endl<<endl;
return 0;


int main(int argc, char* argv[])

char Sel=1;
srand((DWORD) time(NULL));//以当前时间为种子初始化随机函数
while(Sel!=3)

cout<<"1.规则颜色"<<endl<<"2.随机颜色"<<endl<<"3.退出"<<endl;//输出菜单
Sel=getch()-'0';//得到用户输入
system("cls");//清屏
switch(Sel)

case 1:
Regulation();
break;
case 2:
Random();
break;
case 3:
break;

SetColor(7,0);//恢复到原始状态

return 0;
本回答被提问者采纳
参考技术B 控制台输出颜色方阵

#include <windows.h>
#include <stdio.h>
#include <conio.h>

#define getrandom( min, max ) ((rand() % (int)(((max)+1) - (min))) + (min))

void Init(void);
void gotoxy(int x, int y);
void regularcolor(void);
void randomcolor(void);
void Cls(HANDLE hConsole);

HANDLE hOut;
int forecolor[16];
int backcolor[16];

int main(void)

int i;
int a;

for (i = 0; i < 16; i++)

forecolor[i] = i;
backcolor[i] = i << 4;

hOut = GetStdHandle(STD_OUTPUT_HANDLE);

Init();
while(1)

a = getch();
if (a == 48)

Cls(hOut);
regularcolor();
getch();

else if (a == 49)

Cls(hOut);
randomcolor();
getch();

else

Cls(hOut);
break;

Cls(hOut);
Init();


CloseHandle(hOut);
return 0;

//---------------------------------------------------------------------------

void gotoxy(int x, int y)

COORD pos = x, y;
SetConsoleCursorPosition(hOut, pos);


void regularcolor(void)

int i, j, x, y;
int l = 8, t = 5;
for (y = 0; y < 16; y++)

gotoxy(l - 3, y + t);
SetConsoleTextAttribute(hOut, forecolor[15]|backcolor[0]);
printf("%d", y);
for (x = 0; x < 16; x++)

gotoxy(x * 4 + l, y + t);
SetConsoleTextAttribute(hOut, forecolor[y]|backcolor[x]);
printf("ZZZ");
if (y == 15)

gotoxy(x * 4 + l, 17 + t);
SetConsoleTextAttribute(hOut, forecolor[15]|backcolor[0]);
printf("%d", x);





void randomcolor(void)

int i, j, x, y;
int l = 8, t = 5;
char s[4] = "012";
rand();
for (y = 0; y < 16; y++)

for (x = 0; x < 16; x++)

s[0] = getrandom(32, 127);
s[1] = getrandom(32, 127);
s[2] = getrandom(32, 127);
gotoxy(x * 4 + l, y + t);
SetConsoleTextAttribute(hOut, forecolor[getrandom(0, 15)]|backcolor[getrandom(0, 15)]);
printf("%c", s[0]);
gotoxy(x * 4 + l + 1, y + t);
SetConsoleTextAttribute(hOut, forecolor[getrandom(0, 15)]|backcolor[getrandom(0, 15)]);
printf("%c", s[1]);
gotoxy(x * 4 + l + 2, y + t);
SetConsoleTextAttribute(hOut, forecolor[getrandom(0, 15)]|backcolor[getrandom(0, 15)]);
printf("%c", s[2]);




void Cls(HANDLE hConsole)

COORD coordScreen = 0, 0;

BOOL bSuccess;
DWORD cCharsWritten;
CONSOLE_SCREEN_BUFFER_INFO csbi;
DWORD dwConSize;

SetConsoleTextAttribute(hOut, 0x0f|0);
bSuccess = GetConsoleScreenBufferInfo(hConsole, &csbi);
dwConSize = csbi.dwSize.X * csbi.dwSize.Y;

bSuccess = FillConsoleOutputCharacter(hConsole, (TCHAR) ' ', dwConSize, coordScreen, &cCharsWritten);
bSuccess = GetConsoleScreenBufferInfo(hConsole, &csbi);
bSuccess = FillConsoleOutputAttribute(hConsole, csbi.wAttributes, dwConSize, coordScreen, &cCharsWritten);
bSuccess = SetConsoleCursorPosition(hConsole, coordScreen);


void Init(void)

gotoxy(30, 10);
printf("0. Regular Color Array");
gotoxy(30, 11);
printf("1. Random Color Array");
gotoxy(30, 12);
printf("2. Quit");
参考技术C 我觉得我会,而且还有点意思。
只是没有装vc
周末给你答案好不好?

64924930
参考技术D 太难了,不会。

以上是关于在控制台窗口中输出颜色方阵的主要内容,如果未能解决你的问题,请参考以下文章

vs调试控制台显示内容设置

C++控制台输出不同颜色的字的问题

JAVA日志信息在命令行输出带颜色的字符串是怎么实现的

python_控制台输出带颜色的文字方法

C#控制台程序怎么实现输出彩色字体?

如何改变控制台输出文本的颜色