五子棋范例的源程序:目录renju下的内容
程序在附件中,需要请免费下载
renju.dsw
renju.dsp
这两个是项目文件。包含整个项目的文件配置等信息
RESOURCE.H
renju.rc
这是整个工程中使用的Windows资源列表。包括置于res子目录下的图标,
位图以及光标等内容。
Renju.h
这是应用程序的主头文件。包含了通用于工程的其他头文件。以及
CRenjuApp类的声明。
renju.cpp
这是应用程序的主源程序。包含整个程序的入口点。CRenjuApp类的实现。
StdAfx.h
StdAfx.cpp
这对文件由用于将一些预编译信息纳入程序。编译后将产生stdafx.obj
define.h
这是一个包含程序中的数据表示的定义的头文件。
NewGame.h
NewGame.cpp
这一对文件定义并实现用于新游戏的设置的对话框。
renjuDlg.h
renjuDlg.cpp
这一对文件定义并实现了,五子棋的主界面。
Eveluation.h
Eveluation.cpp
这一对文件定义并实现了估值核心类。
MoveGenerator.h
MoveGenerator.cpp
这一对文件定义并实现了走法产生器。
SearchEngine.h
SearchEngine.cpp
这一对文件定义了搜索引擎接口。
HistoryHeuristic.h
HistoryHeuristic.cpp
这一对文件定义并实现历史启发类。
TranspositionTable.h
TranspositionTable.cpp
这一对文件定义并实现置换表类。
NegaScout_TT_HH.h
NegaScout_TT_HH.cpp
这一对文件定义并实现历史启发和置换表增强的NegaScout搜索引擎。
Directory of renju\res
chess.rc2//资源文件
chess.ico//图标文件
若满意请及时采纳,谢谢
1.欢乐斗地主
欢乐四人斗地主棋牌游戏
欢乐四人斗地主是一款基于四人斗地主打造的新型斗地主游戏,所有奖品皆已准备就绪,请您入场! 四人场、三人场、二人场,场场爆满! 新人福利多多,高手云集,谁敢一战? 比赛场风云再起,夺大奖力争上游,一骑当千!
欢乐斗地主是腾讯游戏研发的首款实时对战棋牌类手游。在目前棋牌手游中玩家数量跟影响力都是佼佼者。游戏主要以斗地主玩法为核心内容,由于该游戏规则简单、娱乐性较强,迅速风靡全国。
2.姚记捕鱼
姚记捕鱼手游是今年新出的一款捕鱼游戏,也是姚记棋牌系列的正版授权捕鱼游戏。这款游戏有着超精美的画质,各种鱼类花样繁多,当然最重要的还是可以多人联机捕鱼,在姚记捕鱼中,最为高端的海魔猎场,等着玩家开发!
姚记捕鱼是一款综合手机软件,以在线竞技为主要的游戏形式,游戏的玩法非常多,趣味性也非常强,画面美观,并且游戏也非常容易上手
3.波克捕鱼
捕鱼达人千炮版正式更名《波克捕鱼》,综艺天王吴宗宪倾力代言 1、 波克城市官方正版,千万渔友强力推荐! 2、 波克捕鱼下载后创新玩法,更高倍率,更多BOSS等着你! 3、 下载波克捕鱼百万惊喜大赠送,海量金币每天免费领! 4、 多样技能,丰富玩法,更有极品装备等你抢! 【游戏特色】 1、有没有发现:玩来玩去都是一个人在捕鱼,和多人一起玩的感觉不一样! 10波克捕鱼是一款掌上娱乐游戏,主要包含了斗地主,捕鱼,绝地求生等各种游戏模式,而且 *** 作规则跟游戏都特别简单,游戏整体画风感觉很放
4.三国杀
三国杀,聪明人都爱玩的烧脑社交桌游,集历史、美术、卡牌、策略等元素于一身的竞技类回合制原创经典“杀人”游戏!延续线下桌游玩法,扮演三国名将,结合“主、忠、反、内”,通过逻辑推理,扮演卧底,与队员相互配合取得终极胜利!
三国杀是一款由中国传媒大学动画学院游戏专业学生所设计,由北京游卡桌游所出版发行的一款热门的桌上游戏,该游戏以独特的身份玩法,丰富的武将技能,游戏吸引到了许多的历史文化爱好者。
5.炉石传说
《炉石传说》是暴雪娱乐开发的首款集换式卡牌游戏。魔兽世界中的九大职业悉数登场。支持多平台同场竞技,全新乱斗模式,每周新玩法,每周送卡包!
炉石传说手游是由暴雪所开发的集换式卡牌游戏,游戏的玩法非常多样化,需要合理搭配自己的卡牌来与敌人一较高下。游戏还获得了谷歌Play Awards佳多人游戏跟第二届SXSW游戏大奖年度移动游戏等大奖。
6.狼人杀
《狼人杀官方》是市面上唯一一款拥有狼人杀相关知识产权的移动应用,该团队自2009年创立狼人杀品牌以来,其研发团队躬耕该领域七年,长期致力于在华人圈推广其所推出的狼人杀游戏和文化。
是一款多人参与、以语言描述推动的游戏进展、较量口才和分析判断能力的策略类桌面游戏,游戏过程紧张刺激。在这个游戏里每一个玩家都会自己的身份跟对立的身份,玩家需要用自己的语言来分析跟推理别人的身份,是一个十分烧脑的游戏。
7.随便字牌
随便字牌是一款经典的跑胡子手机版游戏。随便字牌2017年版游戏画质精美,玩法多样,还有丰富福利活动,玩家互动有趣,惊喜不断!
随便字牌是一个非常具有挑战性的游戏,游戏中你需要跟每一个玩家斗智斗勇,仔细的观察去每一个玩家的动作,从而找出漏洞击败对方。
8.捉鸡麻将
微乐捉鸡麻将带你走进一场有着特色玩法的麻将世界了,在这里你将体会到麻将游戏的乐趣,该游戏画面精致唯美,游戏玩法独特,当地最正宗玩法,有鸡有豆,豆、 捉鸡、 金鸡、 包牌、 啥都带,感兴趣的朋友可以下载下载试试!
捉鸡麻将是一款经典棋牌手游,游戏非常容易上手,画风也比较简约,而且游戏目前使用的是国标计番规则,胡牌比较简单,游戏门槛非常低,非常适合游戏新手。
9.中国象棋
中国象棋下载就在18183游戏库,这里还为您提供中国象棋攻略和教程、视频。
象棋作为中国传统棋类游戏,历史非常悠久,目前手游上次也有着优秀的象棋游戏,比如欢乐象棋,游戏的玩法跟规则与传统象棋没有区别,充分还原了象棋原来的味道,让你可以随时随地玩一把喜欢的象棋。
10.元游五子棋
五子棋是一项拥有深厚历史文化底蕴的中国传统益智类竞技游戏,,棋局中充满着激情与智慧。元游五子棋,界面清新,音乐古典, *** 作简单,更创新的推出了自己独特的人性化辅助功能。
元游五子棋是一种著名的棋类,还是全国智力运动会竞技项目之一。游戏的规则非常简单,这个手游把五子棋完全复制成了手机游戏,让人下棋更为便捷。
# include<stdio.h># include<string.h>
# include<stdlib.h>
# define SPA 0
# define MAN 1
# define COM 2 /* 空位置设为0 ,玩家下的位置设为1 ,电脑下的位置设为2 */
int qipan[15][15]/* 15*15的棋盘 */
int a,b,c,d,x/* a b为玩家下子坐标 ,c d为电脑下子坐标 x为剩余空位置*/
void start()/* 程序的主要控制函数 */
void draw()/* 画棋盘 */
int win(int p,int q)/* 判断胜利 p q为判断点坐标 */
void AI(int *p,int *q)/* 电脑下子 p q返回下子坐标 */
int value(int p,int q)/* 计算空点p q的价值 */
int qixing(int n,int p,int q)/* 返回空点p q在n方向上的棋型 n为1-8方向 从右顺时针开始数 */
void yiwei(int n,int *i,int *j)/* 在n方向上对坐标 i j 移位 n为1-8方向 从右顺时针开始数 */
void main()
{
char k
do{
x=225
start()
printf("还要再来一把吗?输入y或n:")getchar()scanf("%c",&k)
while(k!='y'&&k!='n'){
printf("输入错误,请重新输入\n")scanf("%c",&k)}
system("cls") }while(k=='y') printf("谢谢使用!\n")
}
void start()
{
int i,j,a1,b1,c1,d1,choice/* a1 b1储存玩家上手坐标 c1 d1储存电脑上手坐标 */
char ch
printf("\t╔══════════════════════════════╗\n") printf("\t║ ║\n") printf("\t║ 欢迎使用五子棋对战程序 祝您玩的愉快挑战无极限 ║\n")printf("\t║ ║\n") printf("\t║ ._______________________. ║\n")printf("\t║ | _____________________ | ║\n") printf("\t║ | I I | ║\n") printf("\t║ | I 五 子 棋 I | ║\n") printf("\t║ | I I | ║\n") printf("\t║ | I made by 晓之蓬 I | ║\n")printf("\t║ | I___________________I | ║\n") printf("\t║ !_______________________! ║\n")printf("\t║ ._[__________]_. ║\n") printf("\t║ .___|_______________|___. ║\n") printf("\t║ |::: ____ | ║\n")printf("\t║ | ~~~~ [CD-ROM] | ║\n") printf("\t║ !_____________________! ║\n") printf("\t║ ║\n")printf("\t║ ║\n") printf("\t║ 寒 星 溪 月 疏 星 首,花 残 二 月 并 白 莲。 ║\n") printf("\t║ 雨 月 金 星 追 黑 玉,松 丘 新 宵 瑞 山 腥。 ║\n") printf("\t║ 星 月 长 峡 恒 水 流,白 莲 垂 俏 云 浦 岚。 ║\n") printf("\t║ 黑 玉 银 月 倚 明 星,斜 月 明 月 堪 称 朋。 ║\n") printf("\t║ 二 十 六 局 先 弃 二,直 指 游 星 斜 彗 星。 ║\n") printf("\t║ ║\n") printf("\t║ ║\n") printf("\t║ 1.人机对战 2.人人对战 ║\n") printf("\t║ ║\n") printf("\t╚═══════════════════════════ ══╝\n") printf("\t\t\t请输入1或2:")
scanf("%d",&choice)/* 选择模式:人机或人人 */
while(choice!=1&&choice!=2) {
printf("输入错误,请重新输入:")scanf("%d",&choice)}
if(choice==1){ /* 人机模式 */
system("cls")
printf("欢迎使用五子棋人机对战!下子请输入坐标(如13 6)。悔棋请输入15 1 5。\n\n\n")
for(j=0j<15j++)
for(i=0i<15i++)
qipan[j][i]=SPA/* 置棋盘全为空 */
draw()
printf("先下请按1,后下请按2:") scanf("%d",&i)
while(i!=1&&i!=2) { printf("输入错误,请重新输入:")scanf("%d",&i)}
if(i==1) { /* 如果玩家先手下子 */
printf("请下子:")scanf("%d%d",&a,&b)
while((a<0||a>14)||(b<0||b>14)) {
printf("坐标错误!请重新输入:")scanf("%d%d",&a,&b)}
a1=ab1=bx--qipan[b][a]=MANsystem("cls")draw()
}
while(x!=0){
if(x==225) {
c=7d=7qipan[d][c]=COMx--system("cls")draw()} /* 电脑先下就下在7 7 */
else { AI(&c,&d)qipan[d][c]=COMx--system("cls")draw()} /* 电脑下子 */
c1=cd1=d/* 储存电脑上手棋型 */
if(win(c,d)){ /* 电脑赢 */
printf("要悔棋吗?请输入y或n:")getchar()scanf("%c",&ch)
while(ch!='y'&&ch!='n') { printf("输入错误,请重新输入:")
scanf("%c",&ch)}
if(ch=='n') {
printf("下不过电脑很正常,请不要灰心!!!\n")return}
else { x+=2qipan[d][c]=SPAqipan[b1][a1]=SPA
system("cls")draw()} /* 悔棋 */
}
printf("电脑下在%d %d\n请输入:",c,d)
scanf("%d%d",&a,&b)/* 玩家下子 */
if(a==15&&b==15) {
x+=2qipan[d][c]=SPAqipan[b1][a1]=SPAsystem("cls")draw()
printf("请输入:")scanf("%d%d",&a,&b)} /* 悔棋 */
while((a<0||a>14)||(b<0||b>14)||qipan[b][a]!=SPA) {
printf("坐标错误或该位置已有子!请重新输入:")
scanf("%d%d",&a,&b)}
a1=ab1=bx--qipan[b][a]=MANsystem("cls")draw()
if(win(a,b)){ printf("电脑神马的都是浮云!!!\n")
return} /* 玩家赢 */
}
printf("和局\n")
}
if(choice==2){
system("cls")
printf("欢迎使用五子棋人人对战!下子请输入坐标(如13 6)。悔棋请输入15 15。 \n\n\n")
for(j=0j<15j++)
for(i=0i<15i++)
qipan[j][i]=SPA/* 置棋盘全为空 */
draw()
while(x!=0){
printf("1P请输入:")scanf("%d%d",&a,&b)
if(a==15&&b==15) {
x+=2qipan[d][c]=SPAqipan[b1][a1]=SPAsystem("cls")
draw()printf("1P请输入:")scanf("%d%d",&a,&b)}
while((a<0||a>14)||(b<0||b>14)||qipan[b][a]!=SPA) {
printf("坐标错误或该位置已有子!请重新输入:")
scanf("%d%d",&a,&b)}
a1=ab1=bx--qipan[b][a]=MANsystem("cls")draw()
printf("1P下在%d %d。\n",a,b)
if(win(a,b)){ printf("你真棒!!!\n")return} /* 玩家1赢 */
printf("2P请输入:")scanf("%d%d",&c,&d)
if(c==15&&d==15) {
x+=2qipan[b][a]=SPAqipan[d1][c1]=SPAsystem("cls")draw()
printf("2P请输入:")scanf("%d%d",&c,&d)}
while((c<0||c>14)||(d<0||d>14)||qipan[d][c]!=SPA) {
printf("坐标错误或该位置已有子!请重新输入:")scanf("%d%d",&c,&d)
}
c1=cd1=dx--qipan[d][c]=COMsystem("cls")draw()
printf("2P下在%d %d。\n",c,d)
if(win(c,d)){ printf("你真棒!!!\n")return} /* 玩家2赢 */
}
printf("和局\n")
}
}
void draw() /* 画棋盘 */
{
int i,j
char p[15][15][4]
for(j=0j<15j++)
for(i=0i<15i++){
if(qipan[j][i]==SPA) strcpy(p[j][i]," \0")
if(qipan[j][i]==MAN) strcpy(p[j][i],"●\0")
if(qipan[j][i]==COM) strcpy(p[j][i],"◎\0") }
printf(" 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 \n")
printf(" ┌—┬—┬—┬—┬—┬—┬—┬—┬—┬—┬—┬—┬—┬—┬—┐\n")
for(i=0,j=0i<14i++,j++){
printf(" %2d│%s│%s│%s│%s│%s│%s│%s│%s│%s│%s│%s│%s│%s│%s│%s│%d\n",j,p[i][0],p[i][1],p[i][2],p[i][3],p[i][4],p[i][5],p[i][6],p[i][7],p[i][8],p[i][9],p[i][10],p[i][11],p[i][12],p[i][13],p[i][14],j)
printf(" ├—┼—┼—┼—┼—┼—┼—┼—┼—┼—┼—┼—┼—┼—┼—┤\n")}
printf(" 14│%s│%s│%s│%s│%s│%s│%s│%s│%s│%s│%s│%s│%s│%s│%s│0\n",p[14][0],p[14][1],p[14][2],p[14][3],p[14][4],p[14][5],p[14][6],p[14][7],p[14][8],p[14][9],p[14][10],p[14][11],p[14][12],p[14][13],p[14][14])
printf(" └—┴—┴—┴—┴—┴—┴—┴—┴—┴—┴—┴—┴—┴—┴—┘\n")
printf(" 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 \n")
}
int win(int p,int q) /* 判断胜利 p q为判断点坐标,胜利返回1,否则返回0 */
{
int k,n=1,m,P,Q/* k储存判断点p q的状态COM或MAN。P Q储存判断点坐标。n为判断方向。m为个数。 */
P=pQ=q k=qipan[q][p]
while(n!=5){
m=0
while(k==qipan[q][p]){
m++ if(m==5) return 1
yiwei(n,&p,&q)if(p<0||p>14||q<0||q>14) break
}
n+=4m-=1p=Pq=Q/* 转向判断 */
while(k==qipan[q][p]){
m++
if(m==5) return 1
yiwei(n,&p,&q)if(p<0||p>14||q<0||q>14) break
}
n-=3p=Pq=Q/* 不成功则判断下一组方向 */
}
return 0
}
void AI(int *p,int *q) /* 电脑下子 *p *q返回下子坐标 */
{
int i,j,k,max=0,I,J/* I J为下点坐标 */
for(j=0j<15j++)
for(i=0i<15i++)
if(qipan[j][i]==SPA){ /* 历遍棋盘,遇到空点则计算价值,取最大价值点下子。 */
k=value(i,j) if(k>=max) { I=iJ=jmax=k}
}
*p=I*q=J
}
int value(int p,int q) /* 计算空点p q的价值 以k返回 */
{
int n=1,k=0,k1,k2,K1,K2,X1,Y1,Z1,X2,Y2,Z2,temp
int a[2][4][4]={40,400,3000,10000,6,10,600,10000,20,120,200,0,6,10,500,0,30,300,2500,5000,2,8,300,8000,26,160,0,0,4,20,300,0} /* 数组a中储存己方和对方共32种棋型的值 己方0对方1 活0冲1空活2空冲3 子数0-3(0表示1个子,3表示4个子) */
while(n!=5){
k1=qixing(n,p,q)n+=4 /* k1,k2为2个反方向的棋型编号 */
k2=qixing(n,p,q)n-=3
if(k1>k2) { temp=k1k1=k2k2=temp} /* 使编号小的为k1,大的为k2 */
K1=k1K2=k2/* K1 K2储存k1 k2的编号 */
Z1=k1%10Z2=k2%10k1/=10k2/=10Y1=k1%10Y2=k2%10k1/=10k2/=10
X1=k1%10X2=k2%10 /* X Y Z分别表示 己方0对方1 活0冲1空活2空冲3 子数0-3(0表示1个子,3表示4个子) */
if(K1==-1) {
if(K2<0) { k+=0continue} else k+=a[X2][Y2][Z2]+5continue}/* 空棋型and其他 */
if(K1==-2) { if(K2<0) { k+=0continue}
else k+=a[X2][Y2][Z2]/2continue}/* 边界冲棋型and其他 */
if(K1==-3) { if(K2<0) { k+=0continue}
else k+=a[X2][Y2][Z2]/3continue}/* 边界空冲棋型and其他 */
if(((K1>-1&&K1<4)&&((K2>-1&&K2<4)||(K2>9&&K2<14)))||((K1>99&&K1<104)&&((K2>99&&K2<104)||(K2>109&&K2<114)))){
/* 己活己活 己活己冲 对活对活 对活对冲 的棋型赋值*/
if(Z1+Z2>=2) { k+=a[X2][Y2][3]continue}
else { k+=a[X2][Y2][Z1+Z2+1]continue}
}
if(((K1>9&&K1<14)&&(K2>9&&K2<14))||((K1>109&&K1<114)&&(K2>109&&K2<114))){
/* 己冲己冲 对冲对冲 的棋型赋值*/
if(Z1+Z2>=2) { k+=10000continue}
else { k+=0continue}
}
if(((K1>-1&&K1<4)&&((K2>99&&K2<104)||(K2>109&&K2<114)))||((K1>9&&K1<14)&&((K2>99&&K2<104)||(K2>109&&K2<114)))){
/* 己活对活 己活对冲 己冲对活 己冲对冲 的棋型赋值*/
if(Z1==3||Z2==3) { k+=10000continue}
else { k+=a[X2][Y2][Z2]+a[X1][Y1][Z1]/4continue}
}
else
{ k+=a[X1][Y1][Z1]+a[X2][Y2][Z2]continue} /* 其他棋型的赋值 */
}
return k
}
int qixing(int n,int p,int q) /* 返回空点p q在n方向上的棋型号 n为1-8方向 从右顺时针开始数 */
{
int k,m=0/* 棋型号注解: 己活000-003 己冲010-013 对活100-103 对冲110-113 己空活020-023 己空冲030-033 对空活120-123 对空冲130-133 空-1 边界冲-2 边界空冲-3*/
yiwei(n,&p,&q)
if(p<0||p>14||q<0||q>14) k=-2/* 边界冲棋型 */
switch(qipan[q][p]){
case COM:{
m++yiwei(n,&p,&q)
if(p<0||p>14||q<0||q>14) { k=m+9return k}
while(qipan[q][p]==COM) {
m++yiwei(n,&p,&q)if(p<0||p>14||q<0||q>14) { k=m+9return k}
}
if(qipan[q][p]==SPA) k=m-1/* 己方活棋型 */
else k=m+9/* 己方冲棋型 */
}break
case MAN:{
m++yiwei(n,&p,&q)
if(p<0||p>14||q<0||q>14) { k=m+109return k}
while(qipan[q][p]==MAN) {
m++yiwei(n,&p,&q)if(p<0||p>14||q<0||q>14) { k=m+109return k}
}
if(qipan[q][p]==SPA) k=m+99/* 对方活棋型 */
else k=m+109/* 对方冲棋型 */
}break
case SPA:{
yiwei(n,&p,&q)
if(p<0||p>14||q<0||q>14) { k=-3return k} /* 边界空冲棋型 */
switch(qipan[q][p]){
case COM:{
m++yiwei(n,&p,&q)
if(p<0||p>14||q<0||q>14) { k=m+29return k}
while(qipan[q][p]==COM) {
m++yiwei(n,&p,&q)
if(p<0||p>14||q<0||q>14) { k=m+29return k}
}
if(qipan[q][p]==SPA) k=m+19/* 己方空活棋型 */
else k=m+29/* 己方空冲棋型 */
}break
case MAN:{
m++yiwei(n,&p,&q)
if(p<0||p>14||q<0||q>14) { k=m+129return k}
while(qipan[q][p]==MAN) {
m++yiwei(n,&p,&q)
if(p<0||p>14||q<0||q>14) { k=m+129return k}
}
if(qipan[q][p]==SPA) k=m+119/* 对方空活棋型 */
else k=m+129/* 对方空冲棋型 */
}break
case SPA: k=-1break/* 空棋型 */
}
}break
}
return k
}
void yiwei(int n,int *i,int *j) /* 在n方向上对坐标 i j 移位 n为1-8方向 从右顺时针开始数 */
{
switch(n){
case 1: *i+=1break
case 2: *i+=1*j+=1break
case 3: *j+=1break
case 4: *i-=1*j+=1break
case 5: *i-=1break
case 6: *i-=1*j-=1break
case 7: *j-=1break
case 8: *i+=1*j-=1break
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)