1. 程式人生 > >c語言控制檯 之 彈幕實現

c語言控制檯 之 彈幕實現

彈幕從從控制檯的右端到控制檯的左端,位置範圍右端要能顯示字串,左端要>=0

結構體儲存每個訊息的內容 移動速度 顏色 和初始位置(初始位置不能變,用於下次還原)

#include<stdio.h>
#include<windows.h>
#include<string.h>
struct node
{
	char text[10][300];//內容 
	int speed[10];//移動的速度 
	int color[10];//字串顏色 
	int in[10]; //每個字串的初始位置 
};
struct node DM ={{"111","222","333","444","555","666","777","888","999","10000"},
{4,5,7,8,9,10,11,12,4,5},
{4,5,7,8,9,10,11,12,4,5}
};
//出現位置 

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

/*隱藏游標*/
void show_cursor(int hide)
{
	CONSOLE_CURSOR_INFO cciCursor;
	HANDLE hout;

	hout = GetStdHandle(STD_OUTPUT_HANDLE);
	if(GetConsoleCursorInfo(hout, &cciCursor))
	{
        cciCursor.bVisible = hide;
        SetConsoleCursorInfo(hout, &cciCursor);
    }
}

/*設定顏色*/
void set_color(int color)
{
	
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), color);
}

main()
{
	int i,a[10],b[10],x=9;
	show_cursor(0);//隱藏游標
	//求每個字串長度,用於開始出現的地址 
	for (i=0;i<10;i++)
	{
		DM.in[i] = 80-strlen(DM.text[i]);
	 }
	for (i=0;i<10;i++)
	 b[i]=DM.in[i]; 
	while (1)
	{
		for (i=0; i<10; i++)
		{
			b[i]<0 ? b[i]=DM.in[i] : b[i]=b[i]-DM.speed[i];
			gotoxy(b[i],i);//讓字串從右到左移動,b[i]是自減的 
			set_color(DM.color[i]);
			printf("%s\n",DM.text[i]);
		}
		system("cls");
		Sleep(120);
	}
}