切换到宽版
  • 8067阅读
  • 5回复

『推荐』 Pascal进行图形操作前的准备(虽然与竞赛无关,但也值得一看) [复制链接]

上一主题 下一主题
离线gelanjie
 
只看楼主 倒序阅读 0 发表于: 2005-11-17
  
  在 Turbo Pascal 中有一个 CRT 单元及一个 GRAPH 单元,简单的说 crt 单元是为了实现

字符的显示与处理,另外的那个称为 GRAPH 单元是专门用来处理图形的。我们看到的有关图形的

程序往往都要用到。所以若是要在 Turbo Pascal 中实现图形操作,就必须要调用 CRT 单元及

GRAPH 单元。那么怎么样来调用 CRT 及 GRAPH 单元呢?现在线来介绍一下单元调用语句:USES
USES的语法:
USES 单元表识符,……,单元表识符;
说明:
扩展名为*.TPW是Windows下的单元文件,*.TPU是DOS下的单元文件。
位置:变量说明var之前。

讲到这里,我还是要顺便提一下什么是单元?是这样的:我们在编程序的时候,要用到 procedure

或者 function ,中文名称一个是过程另一个是函数。做不同的程序时,往往要用到一些相同的过程

或者相同的函数。如果统统放到程序中,程序会硕大无比,比例与调试与编译,并且在过去

"惜kb如金"的年代里,这样的程序也很浪费。于是,简单的讲,人们把它们做成"包"--我

们称之为单元。一来,免去很多重复的痛苦,大家共享代码也很简单,另外,很多不愿意让别人看

到源程序的人也很乐于如此----这只是我的杜撰。生产 pascal 语言的公司也提供一些做好的

单元,放在安装盘上方便实用。 crt ,graph 即使如此,还有 dos ,system 等等。


图形模式的初始化及退出



Pascal图形模式的初始化及退出
1.初始化

Pascal的图形操作在使用之前必须先进行初始化。如果说你编写图形程序中出现问题,是有八九十卡

在这里了。 这也是非常令我头疼的问题。 用过程 initgraph(GraphDriver,GraphMode,PathToDriver)

其中 GraphDriver , GraphMode 为整形变量, PathToDriver为字符串变量, GraphDriver为图形驱动器,

GraphMode为图形模式 , PathToDriver指定的路径名中建筑图形驱动程序(以.BGI为后缀)。initgraph使

用方法见下例:

program t001 (input,output);

uses crt,graph;

var

gd:gm:integer; {定义GraphDriver,GraphMode变量}

begin

gd:=detect;

initgraph(gd,gm,''); {调用initgraph过程,PathToDriver缺省则表示在当前目录中寻找

《-------这个很重要,一般也可以写成 initgraph(gd,gm,'c:\tp\bgi'); 当然

如果你是如此安装的话。}

bar(100,100,200,200); {画一个以(100,100),(200,200)为顶点的矩形,这是一个标准过程,

你在后面还会看到一个名为bar3d的东东,那个是画立体矩形的}

delay(1000); {将此图形保留一秒,10000就是10秒,依此类推}

end.

2.退出

Closegraph过程
功能:退出图形模式.

在图形模式下如果使用 write 等等文本输出可能会出问题---比如无法看到等等。好像还可能引

起显示上的问题,反正养成一个好习惯也没什么不好的。这里有一个技巧,当你发现无论如何调整都无

法显示图形时,你可以调用自带的例子,用来测试,看看是否是程序本身的问题。

注意,这里有一个不属于图形的,但是非常容易遇到的问题。前面我们说过,在图形编程使用 graph 单

元的时候,我们也常常会使用crt单元,这就有一个问题:crt 单元在主频高的机器上无法正常运行。会出

现 200 号错误!!!请下载补丁,在我们的网站上就有。还有一种情况,就是出了问题没有提示!表现是

运行程序什么反应也没有。如果你出现这种情况,首先检查程序,如果没有问题,非常有可能使这种情况,

也请下载补丁!据报告奔腾180以上的机器具都不同程度存在这种问题!

基本几何图形的绘制
http://www.mydrs.org ; 2001-12-11 大榕树


画直线:
1.Line过程
描述:procedure Line(x1, y1, x2, y2: Integer);两点确定一直线.够简单吧!
2.Lineto过程
描述:procedure LineTo(X, Y: Integer);从当前点项目标点(x,y)作直线.
画圆:
1.Circle过程
功能:以(X,Y)为圆心、Radius为半画一圆。
描述:procedure Circle(X,Y:Integer;Radius:Word);
示例:Circle(100,100,200) {画一个以(100,100)为圆心,200为半径的圆}
画椭圆:
1. Ellipse过程
功能:画一个以(X,Y)为中心,XRadius和YRadius为半轴,StAngle和EndAngle为始角和终角的椭圆弧。
描述:procedure Ellipse(X,Y:Integer;StAngle,EndAngle:Word;XRadius,YRadius:Word);
说明:角度沿逆时针方向,单位是度。0度指向东。
画圆弧:
1.Arc过程
功能: 画一个以(X,Y)为中心,Radius为半径,StAngle和EndAngle为始角和终角 的圆弧。
描述: procedure Arc(X,Y : Integer; StAngle,EndAngle,Radius:Word);
说明: 角度沿逆时针方向,单位是度。0度指向东。
示例: Arc(100,100,0,90,50) {画出第一卦限1/4圆,半径50,圆心(100,100)}
画矩形:
1.Bar过程
功能:画一个以(x1,y1),(x2,y2)为两个对角顶点的矩形。
描述:procedure Bar(x1,y1,x2,y2:integer);
示例:Bar(100,100,200,200) {画一个以(100,100),(200,200)为对角顶点的矩形}
2.Bar3d过程
功能:画一个长方体.
描述:procedure Bar3d(x1,y1,x2,y2:integer,depth:word,top:boolean); {x1,x2,y1,y2同上,为长方体的厚度 ,top为是否画出顶面.}
线形,颜色,及填充设置
线形设置:
1.setlinestyle过程
功能:设置线形,及线宽.
描述:procedure SetLineStyle(LineStyle: Word; Pattern: Word; Thickness: Word);
说明:linestyle(线形)一共有三种.代号0,1,2;线形如下图:

Thichness(线宽)有两种.代号1,3.1为普通线.3为宽线.

2.GetLineSettings过程
功能:返回当前设置的线型设置信息.
描述:procedure GetLineSettings(var LineInfo: LineSettingsType);{参见LineSettingsType类型}
3.LineSettingsType类型
描述: LineSettingsType = record
    LineStyle : Word; {线形}
    Pattern : Word; {模式}
    Thickness : Word; {线宽}
   end;
此类型记录了一种线形的信息.
线形,颜色及线形设置
颜色设置:
在pascal中共有16种颜色可以使用.
1.setcolor过程
描述: procedure SetColor(Color: Word);
设置线的颜色.颜色代码如上图.
2.GetColor函数
功能:返回最后一次作图时的颜色值
描述:function GetColor:word
示例:color:=GetColor; {color:word}
3.GetMaxColor函数
功能:返回系统可用的最大颜色数.
描述:num:=GetMaxColor; {将最大颜色数存到num变量中}
填充设置:
1.SetFillStyle过程
功能 设置填充模式和颜色。
描述 procedure SetFillStyle(Pattern:Word;Color:Word);
说明 设置用于Bar,Bar3D的填充模式和颜色。可生系列填充模式。缺省模式是实心点,缺省模式
是实心点,缺省颜色是调色板中最大颜色序号值。如果传递给SetFillStyle的输入参数无效,
GraphResult将返回值grError,且当前填充参数不改变。
2.FillSettingsType 类型
描述:FillSettingsType=record
Pattern:word;
Color :word;
end;
此类型记录了一种填充模式的信息.
这些知识都很简单,更多的可以在编辑环境中按下f1观看帮助文档
离线archimedes

只看该作者 1 发表于: 2005-11-19
直接看Turbo Pascal Help就行了
离线xpycc
只看该作者 2 发表于: 2005-12-03
Turbo Pascal编的贪吃蛇,要打CRT补丁才能玩

  1. program tan;
  2. uses crt,graph;
  3. var
  4. s,gd,gm,g,p1,p2,i,j,e,x,y:integer;
  5. ss:array[1..5459]of record a1,a2,a3:integer;end;
  6. ch:char;ok:integer;
  7. procedure food(var x,y:integer);
  8. begin
  9. repeat
  10. x:= random(640); until x>1;
  11. repeat
  12. y:= random(480);until y>1;
  13. end;
  14. procedure fen (s:integer);
  15. var q1,q2,q3,q4,q5:integer;
  16. begin
  17. q1:=0;q2:=s;q4:=1;repeat
  18. q2:=q2 div 10;
  19. q1:=q1+1;
  20. until q2=0;
  21. for q3:=1 to q1-1 do
  22. begin
  23. q4:=q4*10;
  24. end;
  25. for q5:=1 to q1 do
  26. begin setcolor(7);
  27. case s div q4 of
  28. 1:outtext('1');
  29. 2:outtext('2');
  30. 3:outtext('3');
  31. 4:outtext('4');
  32. 5:outtext('5');
  33. 6:outtext('6');
  34. 7:outtext('7');
  35. 8:outtext('8');
  36. 9:outtext('9');
  37. 0:outtext('0');end;
  38. s:=s mod q4;q4:=q4 div 10;
  39. end;end;
  40. procedure run(i,j:integer;var g:integer);
  41. var p,q,r:integer;
  42. begin
  43. for p:=1 to 5459 do
  44. with ss[p] do
  45. if a1=0
  46. then begin a1:=g;a2:=i;a3:=j;break;end;
  47. g:=g+1;
  48. if ok=2
  49. then begin
  50. for p:=1 to 5459 do begin
  51. with ss[p] do begin
  52. if a1<>0
  53. then begin q:=a1;r:=p;end;end;break;end;
  54. for p:=1 to 5459 do
  55. with ss[p] do
  56. if (a1<>0)and(a1<q)
  57. then begin q:=a1;r:=p;end;
  58. with ss[r] do begin
  59. a1:=0;a2:=0;a3:=0;end;
  60. end; end;
  61. procedure where(e:integer;var p1,p2:integer);
  62. begin
  63. case e of
  64. 77:begin p1:=16;p2:=0;end;
  65. 75:begin p1:=-16;p2:=0;end;
  66. 72:begin p1:=0;p2:=-16;end;
  67. 80:begin p1:=0;p2:=16;end;end;end;
  68. procedure pic;
  69. var o:integer;
  70. begin
  71. for o:=1 to 5459 do
  72. with ss[o] do begin
  73. if a1<>0
  74. then begin setcolor(7);circle(a2,a3,8);
  75. end;end;end;
  76. procedure eat(e:integer);
  77. begin
  78. case e of
  79. 77:begin
  80. if (((x-i)<=6)and ((abs(y-j)<=11))) then begin ok:=1;run(i,j,g);food(x,y);s:=s+3 end;end;
  81. 75:begin
  82. if (((i-x)<=6)and ((abs(y-j)<=11))) then begin ok:=1;run(i,j,g);food(x,y);s:=s+3 end;end;
  83. 72:begin
  84. if(((j-y)<=6)and ((abs(x-i)<=11))) then begin ok:=1;run(i,j,g);food(x,y);s:=s+3 end;end;
  85. 80:begin
  86. if (((y-j)<=6)and ((abs(x-i)<11))) then begin ok:=1;run(i,j,g);food(x,y);s:=s+3 end;end;end;
  87. end;
  88. procedure head (e,i,j:integer);
  89. begin setcolor(5);
  90. case e of
  91. 72:begin
  92. circle(i-2,j-2,1);
  93. circle(i+2,j-2,1);
  94. line(i,j-8,i,j-17);line(i,j-17,i-3,j-20);line(i,j-17,i+3,j-20);end;
  95. 80:begin
  96. circle(i-2,j+2,1);
  97. circle(i+2,j+2,1);
  98. line(i,j+8,i,j+17);line(i,j+17,i-3,j+20);line(i,j+17,i+3,j+20);end;
  99. 75:begin
  100. circle(i-2,j-2,1);
  101. circle(i-2,j+2,1);
  102. line(i-8,j,i-17,j);line(i-17,j,i-20,j-3);line(i-17,j,i-20,j+3);end;
  103. 77 :begin
  104. circle(i+2,j-2,1);
  105. circle(i+2,j+2,1);
  106. line(i+8,j,i+17,j);line(i+17,j,i+20,j-3);line(i+17,j,i+20,j+3);
  107. end;end;end;
  108. procedure over (e,i,j:integer);
  109. var b1:integer;
  110. begin
  111. for b1:=1 to 5459 do
  112. with ss[b1] do
  113. if (a1<>0)and(a1<>(g-1))and(a2=i)and(a3=j)
  114. then begin ClearDevice;outtextxy(300,240,'game over');delay(2000);ch:=#27;end;
  115. if(i>640)or(i<+0)or(j<0)or(j>480)
  116. then begin
  117. ClearDevice;outtextxy(300,240,'game over');delay(2000);ch:=#27;end;
  118. end;
  119. begin randomize;
  120. gd:=detect;
  121. initgraph(gd,gm,' ');for i:=1 to 5459 do
  122. begin with ss[i] do begin
  123. a1:=0;a2:=0;a3:=0;end;end;
  124. i:=20;j:=20;p1:=16;p2:=0;g:=1;e:=77;
  125. ok:=0;ch:=#255;food(x,y);s:=0;
  126. run(i,j,g);pic;
  127. repeat
  128. i:=i+p1;j:=j+p2;ok:=2;fen(s);
  129. if keypressed
  130. then begin
  131. ch:=readkey;
  132. if ch=#0 then
  133. begin
  134. ch:=readkey;e:=ord(ch);where(e,p1,p2);end;end;
  135. run(i,j,g);pic;delay(50);
  136. over(e,i,j);eat(e);setcolor(3);circle(x,y,4);head(e,i,j);delay(50);
  137. ClearDevice;
  138. until ch=#27;
  139. end.
离线archimedes

只看该作者 3 发表于: 2005-12-06
贪吃蛇说BGI Error: Graphics not initialized(uses InitGraph)
不是有InitGraph语句吗?
离线xpycc
只看该作者 4 发表于: 2005-12-10
那是你的硬件不支持,我的能玩的~~~~~~~~~~~~
离线archimedes

只看该作者 5 发表于: 2005-12-12
我的不知怎么的又可以了~
快速回复
限100 字节
 
上一个 下一个