小枫客栈

淡泊以明志,宁静以致远!

« C语言的新标准(99)怎样学习C语言 »

C语言图形编程

  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();
 

 

  }

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

日历

最新评论及回复

最近发表

Copyright © 2006 - 2010 Xiaofeng. All Rights Reserved.
豫ICP备07012919号