注册 登录
编程论坛 C图形专区

用neo写的中国象棋社0.0.5,120%原创,提供代码

卧龙孔明 发布于 2006-10-13 19:55, 6050 次点击

先在这下吧: [attach]12634[/attach]


CHINESE CHESS 0.05 BY S.K
中国象棋社0.05

本版本加强了计算机人工智能的智力,是业余棋手很好的对手。
本版本为0.05正式版本,本版本核心源代码全部为S.K(孙锴)一人编写,无任何抄袭,受到国家知识产权法保护,S.K拥有全部版权。本版本源代码全部开放,任何人在不用于商业用途、非赢利前提下,可以任意使用全部或部分,也可以任意修改、散发。但使用必须注明 S.K的版权,否则将受到法律制裁。

本软件图形化库使用了NEO SDK
在此向NEO SDK开发者董凯致谢!

开发日志请参见 开发日志.H
文件说明请参见 文件说明.TXT

我的论坛:http://sunkai.b.lunqun.com/
欢迎与我讨论编程问题!

SK-CHINA 2006-2007 S.K

/*=====================================================================================

注:凡标注 * 者,均只在完全软件包中附带

---------------------------------------------------------------------------------------
MAIN.EXE-----------------CHESS主程序
Logo.skc-----------------CHESS的LOGO(BMP格式,可用任何绘图或图象处理\浏览软件打开及修改)
CHESS.skc----------------棋盘图片(BMP格式,可用任何绘图或图象处理\浏览软件打开及修改)
CHESSM.skc---------------右边的面板(BMP格式,可用任何绘图或图象处理\浏览软件打开及修改)
---------------------------------------------------------------------------------------
*MAIN.C------------------软件源代码,在TC2.0+NEO下编译通过
*ICCS类开局库转换程序1.c-开局库转换软件部分1源代码,用于扩充开局库
*ICCS类开局库转换程序2.c-开局库转换软件部分2源代码,用于扩充开局库
---------------------------------------------------------------------------------------
ChessK.skc---------------红框(BMP格式,可用任何绘图或图象处理\浏览软件打开及修改)
---------------------------------------------------------------------------------------
ChessLos.skc-------------胜利图片(BMP格式,可用任何绘图或图象处理\浏览软件打开及修改)
ChessWin.skc-------------失败图片(BMP格式,可用任何绘图或图象处理\浏览软件打开及修改)
---------------------------------------------------------------------------------------
POINT/2/3.skc------------鼠标指针的ICO,可通过软件修改
---------------------------------------------------------------------------------------
CHESS.ICO----------------软件图标
---------------------------------------------------------------------------------------
Open.skc-----------------开局库文件,可通过文本编辑器修改,扩充
---------------------------------------------------------------------------------------
Chess.ini----------------软件配置文件,可通过文本编辑软件更改设置
---------------------------------------------------------------------------------------
HZK16--------------------点阵字库文件(用来显示文字)
---------------------------------------------------------------------------------------
ChessBJ.skc
ChessBK.skc
ChessBM.skc
ChessBP.skc
ChessBS.skc
ChessBX.skc
ChessBZ.skc
以上为黑(蓝)方棋子图片(BMP格式,可用任何绘图或图象处理\浏览软件打开及修改)
---------------------------------------------------------------------------------------
ChessRJ.skc
ChessRK.skc
ChessRM.skc
ChessRP.skc
ChessRS.skc
ChessRX.skc
ChessRZ.skc
以上为红方棋子图片(BMP格式,可用任何绘图或图象处理\浏览软件打开及修改)
---------------------------------------------------------------------------------------
DATA.TXT-----------------棋局记录(每次下棋后生成)
======================================================================================*/
/*=====================================================================
Date: Success:
2006.7.24 Finish Startchess(*) Writechess()
2006.7.25 Finish Movechess-case 0-7(),8(*)
2006.7.26 Finish Movechess-case 8-11(*)
2006.7.27 Finish Movechess-case 12(***),13(**)
2006.7.28 Finish Movechess-case 14(***)
2006.7.29 Finish All of Movechess(*****) Do some note()
2006.7.30 Start Pcmovechess()
2006.7.31 Finish Pcmovechess-Open-case 1(*) Do Pcmovechess outline()
2006.8.1 Do graphics(***)
2006.8.2 Rewrite Pcmovechess-Open-case 1(***)
2006.8.3 Rewrite All of Pcmovechess-Open(****)
2006.8.4 Can use Mouse(**),Add Some Rules of Movechess(*)
2006.8.11 Finish Pcmoveandeat-case 1(**),other of Pcmoveandeat(**)
2006.8.12 Finish Pcmoveandeat-case 2(**),3-7(**),Pcmovevalue1/2(*)
FINISH CHESS 0.0.1
2006.8.13 Finish All of Pcmoveandeat
2006.8.13 Have Simple Artificial Intelligence
FINISH CHESS 0.0.2
2006.8.14 Add Some Functions
2006.8.15 Make the Artificial Intelligence cleverer
FINISH CHESS 0.0.3
2006.8.16 Finish Pccanbenursed,Improve the Artificial Intelligence
2006.8.17 Improve the Artificial Intelligence
FINISH CHESS 0.0.4
2006.8.18-26 Rewrite All the Code,Begin to use Alpha-Beta Search
2006.8.27-9.10 Finish A-B Search,Rewrite Openbook Code and Open.skc
FINISH CHESS 0.0.5
=======================================================================*/

[此贴子已经被作者于2006-10-15 17:39:49编辑过]

31 回复
#2
卧龙孔明2006-10-13 20:00
我是 http://sunkai.b.lunqun.com/ 论坛的管理员,欢迎大家到那里去讨论编程问题!

我目前是个初中生,相当热爱计算机技术,现在14岁,已是计算机2级并准备明年考3级,我曾经获得全国中小学计算机作品大赛一等奖,初来,希望大家多多支持,这个作品是在暑假时无意间心血来潮的作品,有较高的智商与棋力,以后还会改进.
#3
jig2006-10-13 20:48
不错不错,UP
#4
cdmalcl2006-10-13 20:50

佩服


只是挖墙脚的行为不是很好

#5
C语言学习者2006-10-13 23:28
真正人工智能是具有学习能力,目前只是程序啊!
#6
jig2006-10-14 09:54
对于楼住的作品和年龄楼住算是很不错的的啦,不过不知道楼住学习成绩好不,现在一个善意的意见,如果学习成绩不理想可要加油啊,以后考个好大学你的爱好可以发挥到及至如若不然你会很遗憾的。
#7
一笔苍穹2006-10-14 12:19

做的很好,关键是初中就有这样的水平,了不得!
我初中时只会一些BASIC,呵呵。

棋力不错,速度也满快,能给我来一份源代码么?我的邮箱是:
ckerhome@yahoo.com.cn

另,游戏中鼠标判断按键不够灵敏是我的责任:没能及时提供精确的单击检测功能。上午我修改了NEO,你可以去我的网盘下载最新的内测版:http://dongkai.ys168.com/
在这个版本中,你可以用类似 if (get_click_info() == MOUSE_L_UP) 这样的语句来判定鼠标是否有左键单击动作。这个功能本来在2.1.90正式版中就有,只是当时精度不够(执行过示例EX24的朋友可能发现了)

to cdmalcl:
LZ在他的坛子里也宣传了我们的论坛,不算太挖墙脚吧

to C语言学习者:
你讲的是广义的AI,游戏AI一般指比如寻路、有限状态机、遗传这种简单实际一些的。参云风的《游戏之旅-我的编程感悟》。

to jig:
说的没错,这也是一种现状中的无奈了……

#8
C语言学习者2006-10-14 12:25
希望一笔苍穹介绍一下参云风的《游戏之旅-我的编程感悟》,使我有所了解。
#9
一笔苍穹2006-10-14 12:37

这本书技术含量不算高,但读起来比较轻松有趣,可以看作是云风个人的成长历程,我有电子版,可惜有30M+,发不上来,邮箱也有20M附件的限制。
楼上可以到网上找找看。

#10
C语言学习者2006-10-14 12:47
一笔苍穹,可以发给我吗?我邮箱是wihf_id@yahoo.com.cn,麻烦一下
#11
一笔苍穹2006-10-14 12:59

yahoo邮箱有20M附件的限制,我这边的速度也不好,你可以到网上找找

#12
一笔苍穹2006-10-14 14:23
哦,原来里面有源码,先没注意到~~
#13
jig2006-10-14 16:39
楼主直接去云风的网站上DOWN吧

http://www.codingnow.com/2000/index.html

对了,楼主,其智能算发是你原创的,还是看书借鉴过来的?若算法也是你个人原创的那楼主是前途无量啊

[此贴子已经被作者于2006-10-14 19:44:18编辑过]

#14
卧龙孔明2006-10-14 19:50
哈哈,谢谢大家的鼓励与支持,真的很感谢,10.21我要去参加noip(全国信息技术奥赛),最近较忙,还有就是偶的成绩并非你们大家想象中的那样,我是我们学校的级部第一.有关于人工智能这里要说,我对人工智能 并非 很了解,最近看一些英文的文章让我眼花缭乱,只学会了刚Alpha-Beta 静态搜索 期望窗口 等一基本的,而且在0.0.5中只用了A-B搜索,在0.0.6中我已实现了期望窗口,待我奥赛完后,有时间的话我将静态搜索加上后发到网上,我最近大都在 大榕树 (一个全国中学生奥赛的论坛 www.mydrs.org),在申请斑竹中,帐号是 我爱C,另外大家也可到我的论坛去找我.
#15
jig2006-10-14 19:52
董啊,碰到个比你天分还高的,哈哈哈哈
#16
卧龙孔明2006-10-14 19:54

附:新代码部分一(首发):
/*===================================================================================*/

/*判断 BLACKorRED 方的棋子是否能走到chess[x][y],返回可以移动到的个数*/

/*BLACKorRED=0 则是黑方,BLACKorRED=1则是红方*/

int canmoveto(char x,char y,char BLACKorRED) {

int i,t[4]; /*临时数据*/
char pd=0; /*临时判断比较*/

char canmoveall=0; /*可移动到的个数*/

if(chess[x][y]>7)
pd=1;
if(BLACKorRED==pd && chess[x][y]==chessnum[BLACKorRED][4])
return 0;

/* t 数组预先计算,提高执行效率*/
t[0]=x+1;
t[1]=x-1;
t[2]=y+1;
t[3]=y-1;

if(BLACKorRED) {
/*帅*/
if(x>6 && x<10 && y>2 && y<6) {
if(x!=9)
if(chess[t[0]][y]==chessnum[BLACKorRED][4])
canmoveall++;
if(x!=7)
if(chess[t[1]][y]==chessnum[BLACKorRED][4])
canmoveall++;
if(y!=3)
if(chess[x][t[3]]==chessnum[BLACKorRED][4])
canmoveall++;
if(y!=5)
if(chess[x][t[2]]==chessnum[BLACKorRED][4])
canmoveall++;
}
/*仕*/
if(((x==7 || x==9) && ( y==3 || y==5)) || (x==8 && y==4) ) {
if(x==8 && y==4) {
if(chess[t[0]][t[2]]==chessnum[BLACKorRED][3] || chess[t[0]][t[3]]==chessnum[BLACKorRED][3] || chess[t[1]][t[2]]==chessnum[BLACKorRED][3] || chess[t[1]][t[3]]==chessnum[BLACKorRED][3] )
canmoveall++;
}
else
if(chess[8][4]==chessnum[BLACKorRED][3])
canmoveall++;
}
/*相*/
if((y==0 || y==4) && x==7) {
if(chess[t[0]][t[2]]==0) {
if(chess[x+2][y+2]==chessnum[BLACKorRED][2])
canmoveall++;
}
if(chess[t[1]][t[2]]==0) {
if(chess[x-2][y+2]==chessnum[BLACKorRED][2])
canmoveall++;
}
}
if((y==4 || y==8) && x==7) {
if(chess[t[1]][t[3]]==0) {
if(chess[x-2][y-2]==chessnum[BLACKorRED][2])
canmoveall++;
}
if(chess[t[0]][t[3]]==0) {
if(chess[x+2][y-2]==chessnum[BLACKorRED][2])
canmoveall++;
}
}
if((y==2 || y==6) && x==5) {
if(chess[t[0]][t[2]]==0) {
if(chess[x+2][y+2]==chessnum[BLACKorRED][2])
canmoveall++;
}
if(chess[t[0]][t[3]]==0) {
if(chess[x+2][y-2]==chessnum[BLACKorRED][2])
canmoveall++;
}
}
if((y==4 || y==8) && x==9) {
if(chess[t[1]][t[3]]==0) {
if(chess[x-2][y-2]==chessnum[BLACKorRED][2])
canmoveall++;
}
if(chess[t[1]][t[2]]==0) {
if(chess[x-2][y+2]==chessnum[BLACKorRED][2])
canmoveall++;
}
}
/*兵*/
if(chess[t[0]][y]==chessnum[BLACKorRED][6])
canmoveall++;
if(x<5 && y!=0)
if(chess[x][t[3]]==chessnum[BLACKorRED][6])
canmoveall++;
if(x<5 && y!=8)
if(chess[x][t[2]]==chessnum[BLACKorRED][6])
canmoveall++;
}
else {
/*将*/
if(x>-1 && x<3 && y>2 && y<6) {
if(x!=2)
if(chess[t[0]][y]==chessnum[BLACKorRED][4])
canmoveall++;
if(x!=0)
if(chess[t[1]][y]==chessnum[BLACKorRED][4])
canmoveall++;
if(y!=3)
if(chess[x][t[3]]==chessnum[BLACKorRED][4])
canmoveall++;
if(y!=5)
if(chess[x][t[2]]==chessnum[BLACKorRED][4])
canmoveall++;
}
/*士*/
if(((x==0 || x==2) && ( y==3 || y==5)) || (x==1 && y==4) ) {
if(x==1 && y==4) {
if(chess[t[0]][t[2]]==chessnum[BLACKorRED][3] || chess[t[0]][t[3]]==chessnum[BLACKorRED][3] || chess[t[1]][t[2]]==chessnum[BLACKorRED][3] || chess[t[1]][t[3]]==chessnum[BLACKorRED][3] )
canmoveall++;
}
else
if(chess[1][4]==chessnum[BLACKorRED][3])
canmoveall++;
}
/*象*/
if((y==0 || y==4) && x==2) {
if(chess[t[0]][t[2]]==0) {
if(chess[x+2][y+2]==chessnum[BLACKorRED][2])
canmoveall++;
}
if(chess[t[1]][t[2]]==0) {
if(chess[x-2][y+2]==chessnum[BLACKorRED][2])
canmoveall++;
}
}
if((y==4 || y==8) && x==2) {
if(chess[t[1]][t[3]]==0) {
if(chess[x-2][y-2]==chessnum[BLACKorRED][2])
canmoveall++;
}
if(chess[t[0]][t[3]]==0) {
if(chess[x+2][y-2]==chessnum[BLACKorRED][2])
canmoveall++;
}
}
if((y==2 || y==6) && x==0) {
if(chess[t[0]][t[2]]==0) {
if(chess[x+2][y+2]==chessnum[BLACKorRED][2])
canmoveall++;
}
if(chess[t[0]][t[3]]==0) {
if(chess[x+2][y-2]==chessnum[BLACKorRED][2])
canmoveall++;
}
}
if((y==4 || y==8) && x==4) {
if(chess[t[1]][t[3]]==0) {
if(chess[x-2][y-2]==chessnum[BLACKorRED][2])
canmoveall++;
}
if(chess[t[1]][t[2]]==0) {
if(chess[x-2][y+2]==chessnum[BLACKorRED][2])
canmoveall++;
}
}
/*卒*/
if(chess[t[1]][y]==chessnum[BLACKorRED][6])
canmoveall++;
if(x>4 && y!=0)
if(chess[x][t[3]]==chessnum[BLACKorRED][6])
canmoveall++;
if(x>4 && y!=8)
if(chess[x][t[2]]==chessnum[BLACKorRED][6])
canmoveall++;
}

/*俥\車/砲\炮*/
for(pd=0,i=t[0];i<10;i++) {
if(chess[i][y]==0)
continue;
if(!pd && chess[i][y]==chessnum[BLACKorRED][0])
canmoveall++;
else
if(pd==1 && chess[i][y]==chessnum[BLACKorRED][5])
canmoveall++;
else
pd++;
if(pd>1)
break;
continue;
}
for(pd=0,i=t[1];i>-1;i--) {
if(chess[i][y]==0)
continue;
if(!pd && chess[i][y]==chessnum[BLACKorRED][0])
canmoveall++;
else
if(pd==1 && chess[i][y]==chessnum[BLACKorRED][5])
canmoveall++;
else
pd++;
if(pd>1)
break;
continue;
}
for(pd=0,i=t[2];i<9 ;i++) {
if(chess[x][i]==0)
continue;
if(!pd && chess[x][i]==chessnum[BLACKorRED][0])
canmoveall++;
else
if(pd==1 && chess[x][i]==chessnum[BLACKorRED][5])
canmoveall++;
else
pd++;
if(pd>1)
break;
continue;
}
for(pd=0,i=t[3];i>-1;i--) {
if(chess[x][i]==0)
continue;
if(!pd && chess[x][i]==chessnum[BLACKorRED][0])
canmoveall++;
else
if(pd==1 && chess[x][i]==chessnum[BLACKorRED][5])
canmoveall++;
else
pd++;
if(pd>1)
break;
continue;
}
/*傌\馬*/
if(x>1 && y<8)
if(chess[t[1]][t[2]]==0)
if(chess[x-2][t[2]]==chessnum[BLACKorRED][1])
canmoveall++;
if(x>0 && y<7)
if(chess[t[1]][t[2]]==0)
if(chess[t[1]][y+2]==chessnum[BLACKorRED][1])
canmoveall++;
if(x>1 && y>0)
if(chess[t[1]][t[3]]==0)
if(chess[x-2][t[3]]==chessnum[BLACKorRED][1])
canmoveall++;
if(x>0 && y>1)
if(chess[t[1]][t[3]]==0)
if(chess[t[1]][y-2]==chessnum[BLACKorRED][1])
canmoveall++;
if(x<8 && y<8)
if(chess[t[0]][t[2]]==0)
if(chess[x+2][t[2]]==chessnum[BLACKorRED][1])
canmoveall++;
if(x<9 && y<7)
if(chess[t[0]][t[2]]==0)
if(chess[t[0]][y+2]==chessnum[BLACKorRED][1])
canmoveall++;
if(x<8 && y>0)
if(chess[t[0]][t[3]]==0)
if(chess[x+2][t[3]]==chessnum[BLACKorRED][1])
canmoveall++;
if(x<9 && y>1)
if(chess[t[0]][t[3]]==0)
if(chess[t[0]][y-2]==chessnum[BLACKorRED][1])
canmoveall++;

return canmoveall;
}

/*===================================================================================*/

#17
卧龙孔明2006-10-14 19:55

附:新代码二(首发):
/*空着剪裁
wherecanmoveto(!BLACKorRED,depth-R);

v=-Ponder_AlphaBeta(-beta,-beta+1,depth-1-R,BLACKorRED);
if (v>=beta)
return beta;
默认关闭,使用时去掉注释*/

#18
卧龙孔明2006-10-15 17:58
将下载放改到了站内
#19
RockCarry2006-10-15 20:56

能够运用人工智能中的一些知识,比如最基本的知识表示技术、搜索技术、博弈问题、博弈树的搜索,以及最关键的Alpha-Beta剪枝技术,来解决一个比较复杂的象棋博弈问题已经非常难得。能开心的做自己喜欢的事情真是幸福。
人工智能在大学的计算机专业中是一门必修课程,在初中就能有所理解真是难得,另外一门课程是机器学习,讨论的问题相对的更加深入,有兴趣可以看看。
真是佩服。

#20
ljhzz2006-10-15 22:08
卧龙孔明
你QQ号码是..
加我.
教下我啊..
我C语言差
#21
卧龙孔明2006-10-16 12:55
RE ljhzz:674456991.
#22
abco2006-10-16 13:43
太强了,初中生啊

我以前电脑都没摸过
#23
卧龙孔明2006-10-27 20:23

改进的库转换,只用一个程序

最近好忙呀~~~~~~

/*SK-CHINA 2006-2007*/
/*开局库转换程序0.0.1 ICCS类开局库转换程序*/
#include "stdio.h"

main() {
char w;
char a,b,c,d;
FILE *openc,*openb;
printf("SK-CHINA 2006-2007 S.K\n开局库转换程序 0.0.1\n本程序用于将ICCS类开局库转换为CHESS 0.0.5可读取的类型\n\n输入ICCS类文件:open.skc\n转换后将在open.skc覆盖输出,请注意备份文件!\n按任意键开始转换\n");
getch();
openc=fopen("open.skc","r");
openb=fopen("open.txt","w");
while((w=getc(openc))!=EOF) {
switch(w) {
case '9': putc('0',openb); break;
case '8': putc('1',openb); break;
case '7': putc('2',openb); break;
case '6': putc('3',openb); break;
case '5': putc('4',openb); break;
case '4': putc('5',openb); break;
case '3': putc('6',openb); break;
case '2': putc('7',openb); break;
case '1': putc('8',openb); break;
case '0': putc('9',openb); break;

case 'A': putc('0',openb); break;
case 'B': putc('1',openb); break;
case 'C': putc('2',openb); break;
case 'D': putc('3',openb); break;
case 'E': putc('4',openb); break;
case 'F': putc('5',openb); break;
case 'G': putc('6',openb); break;
case 'H': putc('7',openb); break;
case 'I': putc('8',openb); break;

default: putc(w,openb);
}
}
fclose(openc);
fclose(openb);

openc=fopen("open.txt","r");
openb=fopen("open.skc","w");
while((a=getc(openc))!=EOF) {
if(a==' ') { putc(' ',openb); continue; }
if(a==10) { putc(10,openb); continue; }
b=getc(openc); c=getc(openc); d=getc(openc);
putc(b,openb);
putc(a,openb);
putc(d,openb);
putc(c,openb);
}
fclose(openc);
fclose(openb);
printf("\n\n\n完成!");
}

#24
hbsoft20082007-07-10 15:55

你们的结合啊
SK
强啊
人外有人,
天外有天。

[此贴子已经被作者于2007-7-10 15:59:39编辑过]

#25
anlogo2007-07-23 14:58
孔明兄,太崇拜你了~~~


怎么不能下载了啊?
#26
岳C2007-07-23 18:56
提示: 作者被禁止或删除 内容自动屏蔽,只有管理员可见
#27
bill2bccn2007-07-25 10:35

卧龙孔明 经天伟地之奇人也!

#28
ph535432007-08-02 21:50
  崇拜!!!
#29
luo1232007-08-10 19:31

谢谢了,下了

#30
luo1232007-08-10 19:33

Lz 我也要一份。提示出错,不能下载
lsxshaoxin@163.com

[此贴子已经被作者于2007-8-10 19:38:19编辑过]

#31
vfdff2007-08-18 10:06
回复:(卧龙孔明)我是 http://sunkai.b.lunqun.com/...

哇,没有看出,还这么年轻的
将来必有所为呀 !!佩服,佩服
另外提示下,你的代码下载不了了,好像丢失了

1