⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 8-16.c

📁 《C程序员成长攻略》-黎陡-源代码-4282 中国水利水电出版社 程序员成长之路丛书
💻 C
字号:
#include"stdio.h"
#include"stdlib.h"
#include"dos.h"
#include"graphics.h"

unsigned char far *videomem_init_add=(char far *)0xA0000000L;
typedef struct PaletteColor
{
	unsigned char red;
	unsigned char green;
	unsigned char blue;
}PalColor,*PalColor_p;

void InitGraphMode(int mode)
{
	_AH=0x00;
	_AL=mode;
	geninterrupt(0x10);
}

void DrawPixel(int x,int y,int color)             /*画点*/
{
	videomem_init_add[(y<<8)+(y<<6)+x]=color;
}

void DrawHLine(int x1,int x2,int y,int color)     /*画水平线*/
{
	int i,x;
	y=(y<<8)+(y<<6);
	for(x=x1;x<=x2;x++)
		videomem_init_add[y+x]=color;
}

void DrawVLine(int x,int y1,int y2,int color)     /*画竖直线*/
{
	int i,y;
	for(y=y1;y<=y2;y++)
		videomem_init_add[(y<<8)+(y<<6)+x]=color;
}

void DrawRect(int x1,int y1,int x2,int y2,int color) /*画矩形框*/
{
	
	DrawHLine(x1,x2,y1,color);  /*画上下边框*/
	DrawHLine(x1,x2,y2,color);
	DrawVLine(x1,y1,y2,color);  /*画左右边框*/
	DrawVLine(x2,y1,y2,color);
}

void FillRect(int x1,int y1,int x2,int y2,int fill_color) /*填充矩形框*/
{
	int i,j;
	for(j=y1+1;j<y2;j++)
		DrawHLine(x1+1,x2-1,j,fill_color);
}

PalColor GetPalColor(int index)
{
	PalColor_p color;
	outp(0x3c6,0xff);
	outp(0x3c7,index);
	color->red=inp(0x3c9);
	color->green=inp(0x3c9);
	color->blue=inp(0x3c9);
}

void SetPalColor(int index,  PalColor_p color)
{
	outp(0x3c6,0xff);
	outp(0x3c8,index);
	outp(0x3c9,color->red);
	outp(0x3c9,color->green);
	outp(0x3c9,color->blue);
}

void DrawLamp(int index,int x,int y)
{
	PalColor color;
	color.red=24;
	color.green=color.blue=0;
	SetPalColor(index,&color);
	DrawRect(x-5,y-5,x+5,y+5,15);
	FillRect(x-5,y-5,x+5,y+5,index);
	DrawVLine(x-1,y+5,y+50,15);
	DrawVLine(x,y+5,y+50,15);
	DrawVLine(x+1,y+5,y+50,15);
}

void DrawLightning(int lx,int ly,PalColor bk_color)
{
	int i,x,y;
	x=lx;
	y=ly;
	for(i=0;i<50;i++)
	{
		SetPalColor(100+i,&bk_color);
		DrawPixel(x,y,100+i);
		DrawPixel(x-1,y,100+i);
		DrawPixel(x+1,y,100+i);
		y++;
		if((i%2)==0)
			x--;
	}
	x=lx-5;
	y=ly+10;
	for(i=10;i<60;i++)
	{
		SetPalColor(100+i,&bk_color);
		DrawPixel(x,y,100+i);
		DrawPixel(x+1,y,100+i);
		y++;
		if((i%6)==0)
			x++;
	}
	x=lx-15;
	y=ly+30;
	for(i=30;i<55;i++)
	{
		SetPalColor(100+i,&bk_color);
		DrawPixel(x,y,100+i);
		y++;
		if((i%4)==0)
			x++;
	}
	x=lx-22;
	y=ly+44;
	for(i=44;i<55;i++)
	{
		SetPalColor(100+i,&bk_color);
		DrawPixel(x,y,100+i);
		if((i%2)==0)
			y++;
		x--;
	}
	x=lx-16+6;
	y=ly+48;
	for(i=48;i<52;i++)
	{
		SetPalColor(100+i,&bk_color);
		DrawPixel(x,y,100+i);
		y++;
		x++;
	}
	x=lx-5+5;
	y=ly+30;
	for(i=30;i<35;i++)
	{
		SetPalColor(100+i,&bk_color);
		DrawPixel(x,y,100+i);
		y++;
		x++;
	}
	
}
void DrawBKGround(PalColor bk_color)
{
	int i,x,y;
	PalColor color;
	SetPalColor(0,&bk_color);
	x=50;
	y=120;
	DrawLightning(140,10,bk_color);  /*用背景色画闪电图形*/
	DrawLamp(1,x,y);
	DrawLamp(2,x+30,y-27);
	DrawLamp(3,x+55,y-46);
	DrawLamp(4,x+75,y-60);
	DrawLamp(5,x+90,y-70);
	/*以下是画街道边缘*/
	color.red=color.green=color.blue=30;
	x=70;
	y=180;
	for(y=180;y>=100;y--)
	{
		SetPalColor(6,&color);
		DrawPixel(x,y,6);
		DrawPixel(x-1,y,6);
		DrawPixel(x+1,y,6);
		DrawPixel(x-2,y,6);
		DrawPixel(x+2,y,6);
		x++;
	}
}

main()
{
	int i,j;
	PalColor lamb_color,bk_color,lightning_color;
	InitGraphMode(0x13);
	bk_color.red=bk_color.green=0;
	bk_color.blue=5;
	lightning_color.red=lightning_color.green=lightning_color.blue=63;
	DrawBKGround(bk_color);
	lamb_color.red=lamb_color.green=lamb_color.blue=0;
	while(!kbhit())
	{
		/*以下是产生最远处一盏灯的明暗变化效果*/
		while(lamb_color.red<63) 
		{
			SetPalColor(5,&lamb_color);
			/*设置第5号寄存器颜色的值,也就意味着改变第5盏灯(最远处一盏)的颜色,
			因为第i盏灯与第i号颜色寄存器已经关联了起来*/
			delay(5000);
			lamb_color.red++;
		}
		while(lamb_color.red>20)
		{
			SetPalColor(5,&lamb_color);
			delay(5000);
			lamb_color.red--;
		}
		/*以下是产生闪电效果*/
		if(random(10)==1)   /*随机产生闪电效果,使闪电的频率不是一个固定值*/
		{
			sound(30);     /*闪电开始时开启声音*/
			for(i=0;i<=60;i++)   /*快速显示闪电*/
			{
				SetPalColor(100+i,&lightning_color);
				delay(3000);
			}
			for(i=0;i<=60;i++)    /*闪电快速消失*/
			{
				SetPalColor(159-i,&bk_color);
				delay(1000);
			}
			nosound();   /*闪电结束后关闭声音*/
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -