📄 8-16.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 + -