电脑围棋,用delphi与用BCB写,执行效率相差多少?(50分)

  • 主题发起人 主题发起人 whyh
  • 开始时间 开始时间
W

whyh

Unregistered / Unconfirmed
GUEST, unregistred user!
我用delphi写了个棋谱保存与打谱程序,现在准备增加人机对弈功能,陈志行等专家们
强烈推荐用C++写,说执行效率高,另外还说:联机对弈通讯协议是用VC开发的dll
文件,那么,delphi能够调用这样的dll所包含的函数吗?
 
1)C++的效率要比Delphi高一些,但差的不是很多
(有说法是Delphi的效率平均是C++的70%,但我没有验证过)
2)如果是常规的DLL没有问题,但如果是MFC的扩展DLL
(导出的不是函数而是C++的类),则Delphi无法调用。
 
小生觉得算法才是主要的
看编写者个人是不是臭棋娄子(比如我,哈)
 
非常谢谢两位的回答!
以下是从异军的网站拷贝的关于怎样在VC中进行联机对弈的方法。请clyin看看delphi能否
通过调用CGFCOM.DLL中的函数实现人机对弈?需要看CGF软件包,约0.22M,到
http://cn.geocities.com/wy_whyh/


三 在你的C++程序中调用标准围棋通讯协议

下载的CGF软件包中有不少C++的源程序,可以仔细地看一下。如看了以后觉得有点头晕
的话,那么请看以下的“快刀斩乱麻”:
1 开发环境使用VC++6.0, 或者完全兼容的C++编译器。(其实异军一直喜欢使用BORLAND
公司的C/C++编译器,据烂柯说他也极喜用现在新版的C++BUILD,而且烂柯的对弈程序
也可联机对弈。)
2 打开动态连接库CGFCOM.DLL。如果开发一个大型复杂的程序,使用DLL来辅助程序的开
发,可以把程序划分为若干个定义清晰的子系统,真是一个不错的方法。装载库用
hLib=LoadLibrary("cgfcom"),卸载库用FreeLibrary(hLib)。
3 使用其中的五个函数:
(1) 初始化通讯口BOOL initcom(int portnum);
选择COM1/com2口,形式为initcom(1) / initcom(2);
波特率是2400,数据位是8,停止位是1 ,没有奇偶校验。
(2)新局BOOL newgame(int color);
执黑形式为newgame(1),执白形式为newgame(2);
! 注意必须是白方先发出新局的信号,而后黑方再发信号。
(3)传送一招BOOL sendxy(int x, int y)

X与Y的范围为1-19,如果占右上星位即sendxy(16,4);
sendxy(0,0)代表弃权一手,即PASS。其它数据为非法。
黑方先传送,双方分别弃权一手后,对局终止。
(4)接受一招BOOL receivexy(int* px, int* py);
因二台电脑速度可能存在差异,应将该函数在一定时间内重复运行。
(5)关闭通讯口BOOL closecom(void);
找出某个DLL函数可用GetProcAddress(hLib,"initcom")。

 
没有问题,可以调用。
有显示和隐式两种方法。
显示:
和上面的C++代码一样,用LoadLibrary和GetProcAddress函数
并要做如下定义:
type
TNewGameFunc = function(color: integer):boolean;
TSendXYFunc = function(x:integer;y:integer):boolean;
......
var
NewGameFunc: TNewGameFunc;
SendXYFunc: TSendXYFunc;
hlib: integer;

调用代码如下:
.....
hlib := LoadLibrary('cgfcom.dll');
if hlib <> 0 then
begin
@NewGameFunc := GetProcAddress(hlib, pchar('newgame'));
....
NewGameFunc(1);
...
end;
FreeLibrary(hlib);

隐式:
在单元里作如下声明:
function NewGame:boolean
external 'cgfcom.dll'
function SenXY:boolean
external 'cgfcom.dll'
......
然后直接调用这些函数即可。
 
多人接受答案了。
 
再次谢谢clyin,
 

Similar threads

后退
顶部