主题:[讨论]会用PASCAL编游戏的进
dongbili
[专家分:30] 发布于 2006-07-19 21:56:00
我一直想编一些游戏,但苦于以下问题无法解决:
1、不会显示图象,比如贪吃蛇,保存在数组里的信息不知怎样在屏幕上显示出来;
2、不会卡时,比如贪吃蛇,蛇的移动速度就需要卡时;
自己也看过TP的帮助,但里面的样例常常无法通过编译。希望有经验的提供一些这方面的资料(最好全面系统一点)。谢谢!
回复列表 (共17个回复)
沙发
贺天行宝 [专家分:2300] 发布于 2006-07-20 09:12:00
我不会变游戏的,对不起
卡时,用delay行吗??uses crt;
那个贪吃蛇,你不如用'*'阿,'.'阿之类表示阿,其实crt里面有很多画图指令的,但似乎只能在tp里使用
希望谁能给出画图的指令详细使用方法
板凳
绿步甲 [专家分:1610] 发布于 2006-07-21 18:59:00
Turbo Pascal图形编程教程
Pascal是一款有很强图形功能的开发工具,它可以编制各种图形窗口,并且听说还支持鼠标.但是时过境迁,
在vb,vc一统天下的今天,关于Pascal图形操作的书已经像古董一样难于寻找了,我现在将Tp 7.0的Help文件
中的一些有关图形操作的过程与函数整理了一下,并自己写了一些例子,加入了一些自己的看法,便得到了这篇
教程.其中如有错误,望各位不吝赐教。阅读之前希望大家做好准备,比如:找一些食品放在跟前,因为你可能
因为钻研一个函数而耗费大量的时间,还有你可能因为初始化无法完成而大动肝火。
第一章 使用Pascal进行图形操作前的准备
在 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以上的机器具都不同程度存在这种问题!
第三章 基本几何图形的绘制
画直线:
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过程
3 楼
绿步甲 [专家分:1610] 发布于 2006-07-21 19:00:00
功能:画一个以(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观看帮助文档。
更多实例在 www.cpascal.com 的自编程序中。
4 楼
tianyuan001 [专家分:6740] 发布于 2006-07-21 22:10:00
走向 Delphi 吧
TP 编的 游戏 已经没什么商业价值了.
5 楼
dongbili [专家分:30] 发布于 2006-07-22 15:21:00
终于找到了卡时的资料
http://www.mydrs.org/program/list.asp?id=459
如何实现卡时?
卡时是一种让程序在运行了指定长度的时间以后可以自动终止运行并输出结果的技术,其基本原理通常是在程序启动时获取启动时间,然后在程序重复执行的地方获取当前时间,通过计算时间差判断程序已经运行了多久,当程序已运行的时间达到或接近指定的时间后立即输出已知的最优结果并且中断程序。卡时技术通常用在使用穷举或搜索的程序中。
在Turbo Pascal中,可以通过访问MemL[Seg0040:$006C]来获取当前时间,它返回的是当日零时到现在所经过的时间,单位约为55毫秒(约1/18.2秒)。下面是一个使用卡时技术的样例程序:
{$N+}
var
StartTime: Longint;
I, J: Extended;
begin
StartTime := MemL[Seg0040:$006C];
I := 0;
J := 0;
repeat
if I * I - 1234567 * I + 777 < J * J - 1234567 * J + 777 then J := I;
I := I + 1;
until MemL[Seg0040:$006c] - StartTime >= 500 div 55;
Writeln('x^2 - 1234567x + 777 has a minimum result when x = ', J: 0: 0);
end.
上面的程序在运行0.5秒以后将自动输出结果并结束运行。注意,该程序如果跨越零时运行,将无法自动结束程序。如果你希望你的程序在跨越零时运行时仍然可以自动结束,请自行优化你的程序。
在Free Pascal中,很难像Turbo Pascal一样直接访问内存(除非你使用DOS模式编译),通常只能通过调用系统函数来获取当前时间,但在比赛中一般是不允许程序调用系统函数的,因此很难实现卡时。
6 楼
dongbili [专家分:30] 发布于 2006-07-22 15:25:00
还有声音的资料
http://www.mydrs.org/program/list.asp?id=20
在PASCAL语言中,SOUND的语法为SOUND(FREQNER),参数FE-QUENCY频率,单位为赫兹。过程DELAY的语法为:DELAY(DURATION),参数是以毫秒为单位表示延时时间。过程NOSOUND用来关闭扬声器。
我们可以用PASCAL来编制一个模拟电话铃声的小程序,十分有趣,也很逼真。程序如下:
program sm(input,output);
uses crt;
procedure m(f:integer;d:real);
begin
sound(f);
delay(trunc(200*d))
end;
var i:integer;
begin
for i:=1 to 15 do
begin
m(650,10);
m(520,10);
nosound
end;
end.
7 楼
dongbili [专家分:30] 发布于 2006-07-22 15:29:00
[quote]走向 Delphi 吧
TP 编的 游戏 已经没什么商业价值了.[/quote]
谢谢你的建议,但我发此帖是为了更了解PASCAL,不在于商业开发。
8 楼
幽游の白玉 [专家分:140] 发布于 2006-07-24 20:39:00
晕啊 看了楼上的 我完全对生活失去信心了
9 楼
dongbili [专家分:30] 发布于 2006-07-24 21:38:00
[quote]晕啊 看了楼上的 我完全对生活失去信心了
[/quote]
为什么?
10 楼
7free [专家分:10] 发布于 2006-07-30 10:16:00
晕~太难了
我来回复