Turbo C 提供了非常丰富的图形函数,所有图形函数的原型均在graphics. h 中,本节主要介绍图形模式的初始化、独立图形程序的建立、基本图形功能、图形窗口以及图形模式下的文本输出等函数。另外,使用图形函数时要确保有显示器图形驱动程序*BGI,同时将集成开发环境Options/Linker中的Graphics lib选为on,只有这样才能保证正确使用图形函数。图形模式的初始化不同的显示器适配器有不同的图形分辨率。即是同一显示器适配器,在不同模式下也有不同分辨率。因此,在屏幕作图之前,必须根据显示器适配器种类将显示器设置成为某种图形模式,在未设置图形模式之前,微机系统默认屏幕为文本模式(80列,25行字符模式),此时所有图形函数均不能工作。设置屏幕为图形模式,可用下列图形初始化函数:
void far initgraph(int far *gdriver, int far *gmode,char *path);
其中gdriver和gmode分别表示图形驱动器和模式,path是指图形驱动程序所在的目录路径。有关图形驱动器、图形模式的符号常数及对应的分辨率见下表。
图形驱动程序由Turbo C出版商提供,文件扩展名为.BGI。 根据不同的图形适配器有不同的图形驱动程序。例如对于EGA、 VGA 图形适配器就调用驱动程序EGAVGA.BGI。
图形驱动器、模式的符号常数及数值
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
图形驱动器(gdriver) 图形模式(gmode)
───────────────────── 色调 分辨率
符号常数 数值 符号常数 数值
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
CGA 1 CGAC0 0 C0 320*200
CGAC1 1 C1 320*200
CGAC2 2 C2 320*200
CGAC3 3 C3 320*200
CGAHI 4 2色 640*200
──────────────────────────────
MCGA 2 MCGAC0 0 C0 320*200
MCGAC1 1 C1 320*200
MCGAC2 2 C2 320*200
MCGAC3 3 C3 320*200
MCGAMED 4 2色 640*200
MCGAHI 5 2色 640*480
──────────────────────────────
EGA 3 EGALO 0 16色 640*200
EGAHI 1 16色 640*350
──────────────────────────────
EGA64 4 EGA64LO 0 16色 640*200
EGA64HI 1 4色 640*350
──────────────────────────────
EGAMON 5 EGAMONHI 0 2色 640*350
──────────────────────────────
IBM8514 6 IBM8514LO 0 256色 640*480
IBM8514HI 1 256色 1024*768
──────────────────────────────
HERC 7 HERCMONOHI 0 2色 720*348
──────────────────────────────
ATT400 8 ATT400C0 0 C0 320*200
ATT400C1 1 C1 320*200
ATT400C2 2 C2 320*200
ATT400C3 3 C3 320*200
ATT400MED 4 2色 320*200
ATT400HI 5 2色 320*200
──────────────────────────────
VGA 9 VGALO 0 16色 640*200
VGAMED 1 16色 640*350
VGAHI 2 16色 640*480
──────────────────────────────
PC3270 10 PC3270HI 0 2色 720*350
──────────────────────────────
DETECT 0 用于硬件测试
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
使用图形初始化函数设置VGA高分辨率图形模式#include
int main()
{
int gdriver, gmode;
gdriver=VGA;
gmode=VGAHI;
initgraph(&gdriver, &gmode, "c:\\caic\\bgi");
bar3d(100, 100, 300, 250, 50, 1); /*画一长方体*/
getch();
closegraph();
return 0;
}
有时编程者并不知道所用的图形显示器适配器种类,或者需要将编写的程序用于不同图形驱动器,Turbo C 提供了一个自动检测显示器硬件的函数,其调用格式为: void far detectgraph(int *gdriver, *gmode); 其中gdriver和gmode的意义与上面相同。 自动进行硬件测试后进行图形初始化#include
int main()
{
int gdriver, gmode;
detectgraph(&gdriver, &gmode); /*自动测试硬件*/
printf("the graphics driver is %d, mode is %d\n",
gdriver,gmode); /*输出测试结果*/
getch();
initgraph(&gdriver, &gmode, "c:\\caic\\bgi");
/* 根据测试结果初始化图形*/
bar3d(10, 10, 130, 250, 20, 1);
getch();
closegraph();
return 0;
}
上例程序中先对图形显示器自动检测,然后再用图形初始化函数进行初始化设置,但Turbo C提供了一种更简单的方法, 即用driver=DETECT 语句后再跟initgraph()函数就行了。采用这种方法后,上例可改为:
#include
int main()
{
int gdriver=DETECT, gmode;
initgraph(&gdriver, &gmode, "c:\\caic\\bgi");
bar3d(50, 50, 150, 30, 50, 1);
getch();
closegraph();
return 0;
}
另外,Turbo C 提供了退出图形状态的函数closegraph(),其调用格式为: void far closegraph(void); 调用该函数后可退出图形状态而进入文本方式( Turbo C 默认方式),并释放用于保存图形驱动程序和字体的系统内存。
C程序实例 1.功能:求三个整数的平均值。程序如下:
#include <stdio.h> /*载入头文件stdio.h*/
int main() /*主函数main*/
{
int a,b,c,d; /*定义a,b,c,d为整型变量*/
a=105;
b=75;
c=85;
d=(a+b+c)/3;
printf("d=%d\n",d); /*显示"d=某数"并换行,某数是d的值*/
getchar(); /*等待用户,按任意键退出*/
return 0;
}
2.功能:由键盘输入多边形的边数,求其内角和。程序如下:
#include <stdio.h>
void main()
{
/*辨别多边形是否成立,不成立重新执行do-while语句间的命令*/
do
{
int x;
printf("n=");
scanf("%d",&x); /*由键盘输入x的值*/
printf("%d\n",(x-2)*180); /*显示内角和,公式为(x-2)*180*/
/*辨别多边形是否成立,不成立显示“Error”,成立显示“Right”*/
if (x<=2)
printf("Error\n");
else
printf("Right\n");
}
while (x<=2); /*do-while语句*/
getchar();
return 0;
}
3.功能:由键盘输入两个数,显示器上显示较大数。程序如下:
#include <stdio.h>
int big(int,int); /*创建整型变量函数big*/
void main()
{
int x,y;
scanf("%d,%d",&x,&y);
printf("big is %d\n",big(x,y));
/*输出big函数的值,因为main函数与用户自定义函数big无关系,所以printf后的输出项表是big(x,y),而不是big(n1,n2)*/
getchar();
return 0;
}
int big(int n1,int n2) /*用户自定义函数big*/
{
if (n1>n2)
return n1; /*返回n1值*/
else
return n2; /*返回n2值*/
}
4.功能:由键盘输入一个等腰三角形的层数,画一个这样的三角形。程序如下:
#include <stdio.h>
void main()
{
int i,j,n;
printf("n:");
scanf("%d",&n);
for (i=1;i<=n;i++) /*循环n次,每次输出一行*/
{
for (j=1;j<=n-i;j++) /*输出该行前面的空格*/
printf(" ");
for (j=1;j<=2*i-1;j++) /*输出该行中的星号*/
printf("*");
printf("\n");
}
getchar();
return 0;
}
注释:不能输入太多的行数,如10000。
5.功能:由键盘输入一个最大值,求2到这个最大值中的所有质数(素数)。程序如下:
#include <stdio.h>
#include <math.h> /*数学文件*/
void main()
{
int n,m,flag,i,j,num=1;
printf("n:");
scanf("%d",&n);
printf("2~%d:\n",n);
for (i=2;i<=n;i++) /*循环查找质数*/
{
flag=1;
m=(int)sqrt(i);
for (j=2;j<=m;j++)
if (i%j==0) /*条件为真时表示不是质数,退出for循环*/
{
flag=0;
break;
}
if (flag==1) /*条件为真时表示i是质数*/
{
printf("%4d",i);
if (num++%10==0) /*每行最多输出10个数*/
printf("\n");
}
}
printf("\n");
getchar();
return 0;
}
6.功能:显示保护屏幕。程序如下:
#include <stdlib.h> /*综合库*/
#include <graphics.h> /*绘图库*/
int main()
{
int gdriver=DETECT; /*定义图象驱动器为DETECT*/
int gmode=DETECT; /*定义图象模式为DETECT*/
long n; /*定义长型变量n*/
initgraph(&gdriver,&gmode,"E:\TC\bgi");
/*进入图象状态(警告:""之间的是图象驱动器的路径,建议网友们设置为空,即只有"",或设为编程系统的路径,例路径是C:\TC,那么就是输入C:\TC\bgi)*/
sleep(1); /*暂停一秒,以保证无误差进入图象状态*/
for (n=1;n<=40000000;n++) /*画40000000个圆*/
{
setcolor(rand()); /*作图颜色随机*/
circle(random(639),random(639),25); /*画圆,位置随机,半径为25*/
}
getchar();
return 0;
}
7.迷宫程序
/*进入tc运行游戏,按上下左右键控制,任何时候按ESC键退出*/
#include <stdio.h>
#include <conio.h>
#include <dos.h>
#include <graphics.h>
#define LEFT 120
#define TOP 40
#define RIGHT 520
#define BOTTOM 440
#define SMALL 20
int b[20][20]; /*用来保存地图信息*/
b[20][20]={{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,1,1,1,1},
{1,0,1,0,0,1,0,0,1,0,1,0,1,1,0,1,0,0,0,1},
{1,0,1,0,1,1,0,1,1,0,1,0,1,0,0,1,0,1,0,1},
{1,0,0,0,0,1,0,0,1,0,0,0,1,0,1,1,0,1,0,1},
{1,1,1,0,1,1,1,0,1,1,1,1,0,0,1,0,0,1,0,1},
{1,1,0,0,1,1,0,0,1,0,0,1,0,1,1,0,1,0,0,1},
{1,0,0,1,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,1},
{1,0,1,1,0,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1},
{1,0,1,0,0,1,1,0,0,1,0,0,1,1,0,0,1,0,1,1},
{1,0,0,0,1,1,0,1,0,0,0,1,1,0,1,0,1,0,0,1},
{1,0,1,1,1,0,0,1,1,1,0,1,1,0,1,0,1,1,0,1},
{1,0,0,1,0,0,1,0,1,0,0,1,0,0,0,0,1,0,0,1},
{1,1,0,1,1,0,1,0,0,1,0,1,1,1,0,1,1,0,1,1},
{1,0,0,0,1,0,1,1,0,1,0,1,0,0,0,1,0,0,0,1},
{1,0,1,0,1,0,0,0,0,1,0,0,0,1,1,0,0,1,0,1},
{1,0,1,0,1,0,1,1,0,0,1,0,1,1,0,0,1,1,0,1},
{1,0,1,1,0,0,0,0,1,0,1,1,0,0,1,0,0,0,1,1},
{1,0,0,0,0,1,0,1,1,0,0,0,0,1,1,0,1,0,0,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}};
void drawcake(int x,int y) /*划方块*/
{
setfillstyle(SOLID_FILL,BLUE);
bar(LEFT+1+x*SMALL,TOP+1+y*SMALL,RIGHT-1-19*SMALL+x*SMALL,BOTTOM-1-19*SMALL+y*SMALL);
}
void draw(int x,int y) /*划小方块*/
{
setfillstyle(SOLID_FILL,RED);
bar(LEFT+5+x*SMALL,TOP+5+y*SMALL,RIGHT-5-19*SMALL+x*SMALL,BOTTOM-5-19*SMALL+y*SMALL);
}
void undraw(int x,int y) /*擦去小方块*/
{
setfillstyle(SOLID_FILL,BLACK);
bar(LEFT+5+x*SMALL,TOP+5+y*SMALL,RIGHT-5-19*SMALL+x*SMALL,BOTTOM-5-19*SMALL+y*SMALL);
}
main()
{
int gr=DETECT,gm,k=0,i,j,x=1,y=1,ch;
float f;
initgraph(&gr,&gm,"");
cleardevice();
setbkcolor(0);
for(i=0;i<20;i++)
for(j=0;j<20;j++)
if(b[j]==1)drawcake(j,i);
draw(x,y);
do{
ch=bioskey(0);
switch(ch)
{
case 19200: /*按向左键*/
if(b[y][x-1]==0)
{
undraw(x,y);
b[y][x]=0;
x--;
draw(x,y);
b[y][x]=2;
break;
}
case 19712: /*按向右键*/
if(b[y][x+1]==0)
{
undraw(x,y);
b[y][x]=0;
x++;
draw(x,y);
b[y][x]=2;
break;
}
case 18432: /*按向上键*/
if(b[y-1][x]==0)
{
undraw(x,y);
b[y][x]=0;
y--;
draw(x,y);
b[y][x]=2;
break;
}
case 20480: /*按向下键*/
if(b[y+1][x]==0)
{
undraw(x,y);
b[y][x]=0;
y++;
draw(x,y);
b[y][x]=2;
break;
}
}
if(b[18][18]==2)ch=283;
}while(ch!=283);
if(b[18][18]==2)printf(" 恭贺你成功地走出了迷宫!");
getch();
}