用编程怎么编出人机五子棋人机对战算法对战五子棋人机对战算法一定会赢的程序

五子棋程序设计报告_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
五子棋程序设计报告
阅读已结束,下载文档到电脑
想免费下载更多文档?
定制HR最喜欢的简历
下载文档到电脑,方便使用
还剩15页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢2002年3月 软件工程/管理大版内专家分月排行榜第二
2000年11月 总版技术专家分月排行榜第一2000年10月 总版技术专家分月排行榜第一
2001年2月 Web 开发大版内专家分月排行榜第一2000年11月 Web 开发大版内专家分月排行榜第一2000年10月 Web 开发大版内专家分月排行榜第一2000年11月 VC/MFC大版内专家分月排行榜第一2000年10月 VC/MFC大版内专家分月排行榜第一2000年11月 VB大版内专家分月排行榜第一2000年10月 VB大版内专家分月排行榜第一
2000年9月 VB大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。急求一个使用C语言编写的有人人对战和人机对战模式两种模式的五子棋的源代码_百度知道
急求一个使用C语言编写的有人人对战和人机对战模式两种模式的五子棋的源代码
我有更好的答案
* 15*15的棋盘 */int a,b,c,d,x; /* a b为玩家下子坐标 ,c d为电脑下子坐标 x为剩余空位置*/void start(); printf(&\t║ ._[__________]_;n&); scanf(& printf(&n&); printf(&\ printf(&)。 ║\n&t║ ;t║ ║\n&\t║ 1; printf(&quot!_______________________;); printf(&quot。 ║\n&););%d& printf(&);t║ |:;%c&n&); printf(&&#92。 ║\n&quot! ║\n&t║ ;t║ ║\n&); /\t║ 雨 月 金 星 追 黑 玉;\t║ 二 十 六 局 先 弃 二,直 指 游 星 斜 彗 星,int *i,int *j); /* 在n方向上对坐标 i j 移位 n为1-8方向 从右顺时针开始数 */\t║ | I I | ║\ getchar(); scanf(&int win(int p。 ║\n&string.h&);t║ | I 五 子 棋 I | ║\n&\t║ | I___________________I | ║\ printf(&\t║ 欢迎使用五子棋对战程序 祝您玩的愉快挑战无极限 ║\t║ | I made by 晓之蓬 I | ║\n&); printf(&);\t║ 寒 星 溪 月 疏 星 首;void draw();# include& &#47,&choice); } if(choice==1){ /* 人机模式 */ system(&cls&); printf(&欢迎使用五子棋人机对战!下子请输入坐标(如13 6)。悔棋请输入15 1 5。\n\n\n&); for(j=0;j&15;j++)for(i=0;i&15;i++) 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=a; b1=b; x--; qipan[b][a]=MAN; system(&cls&); draw(); } while(x!=0){ if(x==225) {c=7; d=7; qipan[d][c]=COM; x--; system(&cls&); draw(); } /* 电脑先下就下在7 7 */else { AI(&c,&d); qipan[d][c]=COM; x--; system(&cls&); draw(); } /* 电脑下子 */ c1=c; d1=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&); }else { x+=2; qipan[d][c]=SPA; qipan[b1][a1]=SPA;system(&cls&); draw(); } /* 悔棋 */ } printf(&电脑下在%d %d\n请输入:&,c,d); scanf(&%d%d&,&a,&b); /* 玩家下子 */ if(a==15&&b==15) { x+=2; qipan[d][c]=SPA; qipan[b1][a1]=SPA; system(&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=a; b1=b; x--; qipan[b][a]=MAN; system(&cls&); draw(); if(win(a,b)){ printf(&电脑神马的都是浮云!!!\n&);
} /* 玩家赢 */ } printf(&和局\n&);}if(choice==2){ system(&cls&);printf(&欢迎使用五子棋人人对战!下子请输入坐标(如13 6)。悔棋请输入15 15。 \n\n\n&); for(j=0;j&15;j++) for(i=0;i&15;i++) qipan[j][i]=SPA; /* 置棋盘全为空 */ draw(); while(x!=0){ printf(&1P请输入:&); scanf(&%d%d&,&a,&b); if(a==15&&b==15) { x+=2; qipan[d][c]=SPA; qipan[b1][a1]=SPA; system(&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=a; b1=b; x--; qipan[b][a]=MAN; system(&cls&); draw();printf(&1P下在%d %d。\n&,a,b); if(win(a,b)){ printf(&你真棒!!!\n&); } /* 玩家1赢 */printf(&2P请输入:&); scanf(&%d%d&,&c,&d); if(c==15&&d==15) {x+=2; qipan[b][a]=SPA; qipan[d1][c1]=SPA; system(&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=c; d1=d; x--; qipan[d][c]=COM; system(&cls&); draw();printf(&2P下在%d %d。\n&,c,d); if(win(c,d)){ printf(&你真棒!!!\n&); } /* 玩家2赢 */ }printf(&和局\n&);}}void draw() /* 画棋盘 */{ int i,j; char p[15][15][4]; for(j=0;j&15;j++) for(i=0;i&15;i++){ 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=0;i&14;i++,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=p; Q=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) } n+=4; m-=1; p=P; q=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) } n-=3; p=P; q=Q; /* 不成功则判断下一组方向 */} return 0;}void AI(int *p,int *q) /* 电脑下子 *p *q返回下子坐标 */{ int i,j,k,max=0,I,J; /* I J为下点坐标 */ for(j=0;j&15;j++)for(i=0;i&15;i++) if(qipan[j][i]==SPA){ /* 历遍棋盘,遇到空点则计算价值,取最大价值点下子。 */ k=value(i,j);
if(k&=max) { I=i; J=j; max=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, int a[2][4][4]={40,400,,6,10,600,,200,0,6,10,500,0,30,300,,8,300,,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=k1; k1=k2; k2= } /* 使编号小的为k1,大的为k2 */ K1=k1; K2=k2; /* K1 K2储存k1 k2的编号 */ Z1=k1%10; Z2=k2%10; k1/=10; k2/=10; Y1=k1%10; Y2=k2%10; k1/=10; k2/=10; X1=k1%10; X2=k2%10;
/* X Y Z分别表示 己方0对方1 活0冲1空活2空冲3 子数0-3(0表示1个子,3表示4个子) */ if(K1==-1) { if(K2&0) { k+=0; } else k+=a[X2][Y2][Z2]+5; }; /* 空棋型and其他 */ if(K1==-2) { if(K2&0) { k+=0; } else k+=a[X2][Y2][Z2]/2; }; /* 边界冲棋型and其他 */ if(K1==-3) { if(K2&0) { k+=0; } else k+=a[X2][Y2][Z2]/3; }; /* 边界空冲棋型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]; }else { k+=a[X2][Y2][Z1+Z2+1]; }} if(((K1&9&&K1&14)&&(K2&9&&K2&14))||((K1&109&&K1&114)&&(K2&109&&K2&114))){ /* 己冲己冲 对冲对冲 的棋型赋值*/ if(Z1+Z2&=2) { k+=10000; } else { k+=0; }} 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+=10000; } else { k+=a[X2][Y2][Z2]+a[X1][Y1][Z1]/4; }} else { k+=a[X1][Y1][Z1]+a[X2][Y2][Z2]; } /* 其他棋型的赋值 */ } }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+9; } while(qipan[q][p]==COM) {m++; yiwei(n,&p,&q); if(p&0||p&14||q&0||q&14) { k=m+9; } } if(qipan[q][p]==SPA) k=m-1; /* 己方活棋型 */ else k=m+9; /* 己方冲棋型 */} case MAN:{ m++; yiwei(n,&p,&q); if(p&0||p&14||q&0||q&14) { k=m+109; } while(qipan[q][p]==MAN) {m++; yiwei(n,&p,&q); if(p&0||p&14||q&0||q&14) { k=m+109; } } if(qipan[q][p]==SPA) k=m+99; /* 对方活棋型 */else k=m+109; /* 对方冲棋型 */ }case SPA:{ yiwei(n,&p,&q); if(p&0||p&14||q&0||q&14) { k=-3; } /* 边界空冲棋型 */ switch(qipan[q][p]){ case COM:{m++; yiwei(n,&p,&q); if(p&0||p&14||q&0||q&14) { k=m+29; }while(qipan[q][p]==COM) { m++; yiwei(n,&p,&q); if(p&0||p&14||q&0||q&14) { k=m+29; }} if(qipan[q][p]==SPA) k=m+19; /* 己方空活棋型 */ else k=m+29; /* 己方空冲棋型 */ } case MAN:{ m++; yiwei(n,&p,&q);if(p&0||p&14||q&0||q&14) { k=m+129; } while(qipan[q][p]==MAN) { m++; yiwei(n,&p,&q);if(p&0||p&14||q&0||q&14) { k=m+129; } } if(qipan[q][p]==SPA) k=m+119; /* 对方空活棋型 */ else k=m+129; /* 对方空冲棋型 */ } case SPA: k=-1; /* 空棋型 */ }} } }void yiwei(int n,int *i,int *j) /* 在n方向上对坐标 i j 移位 n为1-8方向 从右顺时针开始数 */{ switch(n){ case 1: *i+=1;case 2: *i+=1; *j+=1;case 3: *j+=1; case 4: *i-=1; *j+=1;case 5: *i-=1;case 6: *i-=1; *j-=1; case 7: *j-=1; case 8: *i+=1; *j-=1;}};* 画棋盘 */),白 莲 垂 俏 云 浦 岚;* 返回空点p q在n方向上的棋型 n为1-8方向 从右顺时针开始数 */void yiwei():: ____ | ║\n&\t║ ._______________________. ║&#92! ║\n&cls&); }while(k=='y'); printf(&谢谢使用;%c&还要再来一把吗; /t║ ║\n&n&); printf(&\,&choice).h&# define SPA 0# define MAN 1# define COM 2 /* 空位置设为0 ,玩家下的位置设为1 ;void AI(int *p,int *q); /* 电脑下子 p q返回下子坐标 */n&); printf(&&#92:&n&); printf(&\n&); printf(&\int value(int p,电脑下的位置设为2 *&#47。 ║\n& printf(&n&); printf(&\}void start(){ int i,j,a1,斜 月 明 月 堪 称 朋,请重新输入. ║\n&int qipan[15][15]; printf(&void main(){ ,&k);while(k!='y'&&k!='n'){ printf(&输入错误;),松 丘 新 宵 瑞 山 腥; do{ x=225;start();printf(&\t║ | ~~~~ [CD-ROM] | ║\); printf(&\t║ ║&#92,b1,c1; &#47.人机对战 2.人人对战 ║\)!=2) { printf(&输入错误;); printf(&quot,请重新输入\n&); printf(&\););\t║ .___|_______________|___. ║\t║ | _____________________ | ║\n&\t║ 黑 玉 银 月 倚 明 星;t║ ║\n&,&k); }system(&t║ ║\n& printf(&* 程序的主要控制函数 */ printf(& printf(&* 选择模式:人机或人人 */ while(choice!=1&& /* a1 b1储存玩家上手坐标 c1 d1储存电脑上手坐标 */\t║ | I I | ║\
printf(&\);int qixing(int n,int p,int q),int q); /* 判断胜利 p q为判断点坐标 */););n&); printf(&\n&); printf(&&#92,int q); /* 计算空点p q的价值 */); printf(&n&); printf(&&#92?输入y或n; /\t║ 星 月 长 峡 恒 水 流; printf(&t╔══════════════════════════════╗&#92.h&# include&\t\t\t请输入1或2:&); scanf(&quot,d1, scanf(&%d&; printf(&\t╚═══════════════════════════ ══╝\n&quot,花 残 二 月 并 白 莲:&quot!\n&quot# include&\t║ ║&#92!_____________________
你好,谢谢哈!请问有没有用键盘控制下子位置的源码呢?作业不会做,跪求。。。
采纳率:18%
为您推荐:
其他类似问题
五子棋的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。五子棋的程序用C怎么编?_百度知道
五子棋的程序用C怎么编?
跪求~~~~~~~~~急
**********************************************************//* 程序中用到的库函数所在头文件应用 #include 命令包含进来 */#include &stdio.h&#include &bios.h&#include &ctype.h&#include &conio.h&#include &dos.h&/**********************************************************//* 定义符号常量
*//*定义画棋盘所需的制表符*/#define CROSSRU
/*右上角点*/#define CROSSLU
/*左上角点*/#define CROSSLD
/*左下角点*/#define CROSSRD
/*右下角点*/#define CROSSL
/*左边*/#define CROSSR
/*右边*/#define CROSSU
/*上边*/#define CROSSD
/*下边*/#define CROSS
/*十字交叉点*//*定义棋盘左上角点在屏幕上的位置*/#define MAPXOFT
5#define MAPYOFT
2/*定义1号玩家的操作键键码*/#define PLAY1UP
0x1157/*上移--'W'*/#define PLAY1DOWN
0x1f53/*下移--'S'*/#define PLAY1LEFT
0x1e41/*左移--'A'*/#define PLAY1RIGHT
0x2044/*右移--'D'*/#define PLAY1DO
0x3920/*落子--空格键*//*定义2号玩家的操作键键码*/#define PLAY2UP
0x4800/*上移--方向键up*/#define PLAY2DOWN
0x5000/*下移--方向键down*/#define PLAY2LEFT
0x4b00/*左移--方向键left*/#define PLAY2RIGHT
0x4d00/*右移--方向键right*/#define PLAY2DO
0x1c0d/*落子--回车键Enter*//*若想在游戏中途退出, 可按 Esc 键*/#define ESCAPE
0x011b/*定义棋盘上交叉点的状态, 即该点有无棋子 *//*若有棋子, 还应能指出是哪个玩家的棋子
*/#define CHESSNULL
//没有棋子#define CHESS1
'O'//一号玩家的棋子#define CHESS2
'X'//二号玩家的棋子/*定义按键类别*/#define KEYEXIT
0/*退出键*/#define KEYFALLCHESS
1/*落子键*/#define KEYMOVECURSOR
2/*光标移动键*/#define KEYINVALID
3/*无效键*//*定义符号常量: 真, 假 --- 真为1, 假为0 */#define TRUE
1#define FALSE
0/**********************************************************//* 定义数据结构
*//*棋盘交叉点坐标的数据结构*/struct point{
int x,y;};/**********************************************************//*自定义函数原型说明
*/void Init(void);int
GetKey(void);int CheckKey(int press);int
ChangeOrder(void);int
ChessGo(int Order,struct point Cursor);void DoError(void);void DoOK(void);void DoWin(int Order);void MoveCursor(int Order,int press);void DrawCross(int x,int y);void DrawMap(void);int
JudgeWin(int Order,struct point Cursor);int
JudgeWinLine(int Order,struct point Cursor,int direction);void ShowOrderMsg(int Order);void EndGame(void);/**********************************************************//**********************************************************//* 定义全局变量
/*指示当前行棋方
*/struct point gC
/*光标在棋盘上的位置
*/char gChessBoard[19][19];/*用于记录棋盘上各点的状态*//**********************************************************//**********************************************************//*主函数*/void main(){
int bOutWhile=FALSE;/*退出循环标志*/
Init();/*初始化图象,数据*/
press=GetKey();/*获取用户的按键值*/
switch(CheckKey(press))/*判断按键类别*/
/*是退出键*/
case KEYEXIT:
clrscr();/*清屏*/
bOutWhile = TRUE;
/*是落子键*/
case KEYFALLCHESS:
if(ChessGo(gPlayOrder,gCursor)==FALSE)/*走棋*/
DoError();/*落子错误*/
DoOK();/*落子正确*/
/*如果当前行棋方赢棋*/
if(JudgeWin(gPlayOrder,gCursor)==TRUE)
DoWin(gPlayOrder);
bOutWhile = TRUE;/*退出循环标志置为真*/
/*交换行棋方*/
ChangeOrder();
/*是光标移动键*/
case KEYMOVECURSOR:
MoveCursor(gPlayOrder,press);
/*是无效键*/
case KEYINVALID:
if(bOutWhile==TRUE)
/*游戏结束*/
EndGame();}/**********************************************************//*界面初始化,数据初始化*/void Init(void){
char *Msg[]=
&Player1 key:&,
DO----space&,
&Player2 key:&,
UP----up&,
DOWN--down&,
LEFT--left&,
RIGHT-right&,
DO----ENTER&,
&exit game:&,
/*先手方为1号玩家*/
gPlayOrder = CHESS1;
/*棋盘数据清零, 即棋盘上各点开始的时候都没有棋子*/
for(i=0;i&19;i++)
for(j=0;j&19;j++)
gChessBoard[i][j]=CHESSNULL;
/*光标初始位置*/
gCursor.x=gCursor.y=0;
/*画棋盘*/
textmode(C40);
DrawMap();
/*显示操作键说明*/
textcolor(BROWN);
while(Msg[i]!=NULL)
gotoxy(25,3+i);
cputs(Msg[i]);
/*显示当前行棋方*/
ShowOrderMsg(gPlayOrder);
/*光标移至棋盘的左上角点处*/
gotoxy(gCursor.x+MAPXOFT,gCursor.y+MAPYOFT);}/*画棋盘*/void DrawMap(void){
for(i=0;i&19;i++)
for(j=0;j&19;j++)
DrawCross(i,j);}/*画棋盘上的交叉点*/void DrawCross(int x,int y){
gotoxy(x+MAPXOFT,y+MAPYOFT);
/*交叉点上是一号玩家的棋子*/
if(gChessBoard[x][y]==CHESS1)
textcolor(LIGHTBLUE);
putch(CHESS1);
/*交叉点上是二号玩家的棋子*/
if(gChessBoard[x][y]==CHESS2)
textcolor(LIGHTBLUE);
putch(CHESS2);
textcolor(GREEN);
/*左上角交叉点*/
if(x==0&&y==0)
putch(CROSSLU);
/*左下角交叉点*/
if(x==0&&y==18)
putch(CROSSLD);
/*右上角交叉点*/
if(x==18&&y==0)
putch(CROSSRU);
/*右下角交叉点*/
if(x==18&&y==18)
putch(CROSSRD);
/*左边界交叉点*/
putch(CROSSL);
/*右边界交叉点*/
putch(CROSSR);
/*上边界交叉点*/
putch(CROSSU);
/*下边界交叉点*/
putch(CROSSD);
/*棋盘中间的交叉点*/
putch(CROSS);}/*交换行棋方*/int ChangeOrder(void){
if(gPlayOrder==CHESS1)
gPlayOrder=CHESS2;
gPlayOrder=CHESS1;
return(gPlayOrder);}/*获取按键值*/int GetKey(void){
while (bioskey(1) == 0)/*如果用户没有按键,空循环*/
press=bioskey(0);
lowbyte=press&0
press=press&0xff00 + toupper(lowbyte);
return(press);}/*落子错误处理*/void DoError(void){
sound(1200);
delay(50);
nosound();}/*赢棋处理*/void DoWin(int Order){
sound(1500);delay(100);
delay(50);
sound(800); delay(100);
delay(50);
sound(1500);delay(100);
delay(50);
sound(800); delay(100);
delay(50);
nosound();
textcolor(RED+BLINK);
gotoxy(25,20);
if(Order==CHESS1)
cputs(&PLAYER1 WIN!&);
cputs(&PLAYER2 WIN!&);
gotoxy(25,21);
\\&^+^&/&);
getch();}/*走棋*/int
ChessGo(int Order,struct point Cursor){
/*判断交叉点上有无棋子*/
if(gChessBoard[Cursor.x][Cursor.y]==CHESSNULL)
/*若没有棋子, 则可以落子*/
gotoxy(Cursor.x+MAPXOFT,Cursor.y+MAPYOFT);
textcolor(LIGHTBLUE);
putch(Order);
gotoxy(Cursor.x+MAPXOFT,Cursor.y+MAPYOFT);
gChessBoard[Cursor.x][Cursor.y]=O
return TRUE;
return FALSE;}/*判断当前行棋方落子后是否赢棋*/int
JudgeWin(int Order,struct point Cursor){
for(i=0;i&4;i++)
/*判断在指定方向上是否有连续5个行棋方的棋子*/
if(JudgeWinLine(Order,Cursor,i))
return TRUE;
return FALSE;}/*判断在指定方向上是否有连续5个行棋方的棋子*/int
JudgeWinLine(int Order,struct point Cursor,int direction){
struct point pos,
const int testnum = 5;
switch(direction)
case 0:/*在水平方向*/
pos.x=Cursor.x-(testnum-1);
pos.y=Cursor.y;
case 1:/*在垂直方向*/
pos.x=Cursor.x;
pos.y=Cursor.y-(testnum-1);
case 2:/*在左下至右上的斜方向*/
pos.x=Cursor.x-(testnum-1);
pos.y=Cursor.y+(testnum-1);
dpos.y=-1;
case 3:/*在左上至右下的斜方向*/
pos.x=Cursor.x-(testnum-1);
pos.y=Cursor.y-(testnum-1);
for(i=0;i&testnum*2+1;i++)
if(pos.x&=0&&pos.x&=18&&pos.y&=0&&pos.y&=18)
if(gChessBoard[pos.x][pos.y]==Order)
if(count&=testnum)
return TRUE;
pos.x+=dpos.x;
pos.y+=dpos.y;
return FALSE;}/*移动光标*/void MoveCursor(int Order,int press){
switch(press)
case PLAY1UP:
if(Order==CHESS1&&gCursor.y&0)
gCursor.y--;
case PLAY1DOWN:
if(Order==CHESS1&&gCursor.y&18)
gCursor.y++;
case PLAY1LEFT:
if(Order==CHESS1&&gCursor.x&0)
gCursor.x--;
case PLAY1RIGHT:
if(Order==CHESS1&&gCursor.x&18)
gCursor.x++;
case PLAY2UP:
if(Order==CHESS2&&gCursor.y&0)
gCursor.y--;
case PLAY2DOWN:
if(Order==CHESS2&&gCursor.y&18)
gCursor.y++;
case PLAY2LEFT:
if(Order==CHESS2&&gCursor.x&0)
gCursor.x--;
case PLAY2RIGHT:
if(Order==CHESS2&&gCursor.x&18)
gCursor.x++;
gotoxy(gCursor.x+MAPXOFT,gCursor.y+MAPYOFT);}/*游戏结束处理*/void EndGame(void){
textmode(C80);}/*显示当前行棋方*/void ShowOrderMsg(int Order){
gotoxy(6,MAPYOFT+20);
textcolor(LIGHTRED);
if(Order==CHESS1)
cputs(&Player1 go!&);
cputs(&Player2 go!&);
gotoxy(gCursor.x+MAPXOFT,gCursor.y+MAPYOFT);}/*落子正确处理*/void DoOK(void){
sound(500);
delay(70);
sound(600);
delay(50);
sound(1000);
delay(100);
nosound();}/*检查用户的按键类别*/int CheckKey(int press){
if(press==ESCAPE)
return KEYEXIT;/*是退出键*/
( ( press==PLAY1DO && gPlayOrder==CHESS1) ||
( press==PLAY2DO && gPlayOrder==CHESS2)
return KEYFALLCHESS;/*是落子键*/
( press==PLAY1UP
|| press==PLAY1DOWN
press==PLAY1LEFT || press==PLAY1RIGHT ||
press==PLAY2UP
|| press==PLAY2DOWN
press==PLAY2LEFT || press==PLAY2RIGHT
return KEYMOVECURSOR;/*是光标移动键*/
return KEYINVALID;/*按键无效*/}
采纳率:70%
来自团队:
#47;//n&); for (i=0; i&21: &); } } }
void control() { void up();//////// j++) { if (i==focus_x && j==focus_y) { printf(&\//////// //
int main() { void startGame(); startGame(); i++) { for (j=0; j&21;//////////// #include &//////// if (input == 'w') { up(); //n&); } if (winner == 0) { if (player1 == 1) { printf(& } if (input == 'a') { left();//stdlib.h&k'= 20) { focus_x = 20; } else { focus_x++; } } void left() { if (focus_y &// void go(); input = getchar();///////&#47: &); } else { printf(&////////b[%d] &////= 0) { focus_y = 0; } else { focus_y--; } } void right() { if (focus_y &= 20) { focus_y = 20; focus_y = 10;//string.h& } printChessBoard(); printf(&\///&#47,每个操作需按Enter确认(比如上要按w再按Enter),走棋为k\ int array[21][21]; int focus_x;////// int checkGameOver(); init(); while (winner == 0) { printChessBoard();, array[i][j]); } } printf(&\////////
int player2;////// #include &//////////%-3d& focus_x = 10;pause&); } void printChessBoard() { int i,// }
void init() {//, array[i][j]); } else { printf(&//, winner);////////) { go(); } } void up() { if (focus_x &lt, for (i=0; i&21;////Player2;//// system(& } void startGame() { void init();// void down(); void left();// } } player1 = 1; player2 = 0;Player1;nPlayer%// return 0; control(); checkGameOver();= 0) { focus_x = 0; } else { focus_x--; } } void down() { if (focus_x &//// int focus_y; int player1;////// } if (input == 'd') { right(); } if (input == '//// void right();// system(&//////////////////////////// void control();/////// Construction/Destruction /// } if (input == 's') { down();/// Game.cpp: implementation of the Game class. //// } } void go() { int chessman = array[focus_x][focus_y];//// i++) { for (j=0; j&21;// /////////// void printChessBoard();// j++) { array[i][j] = 0;/ #include &stdio.h&//cls&); printf(&游戏提示;/&#47:\nwsad为上下左右!\n\n& if (chessman == 0) { if (player1 == 1) { array[focus_x][focus_y] = 1; player1 = 0; player2 = 1; } else { array[focus_x][focus_y] = 2; player1 = 1; player2 = 0; } } }
int checkGameOver() { int i, int judge(int x, int y); for (i=0; i&21; i++) { for (j=0; j&21; j++) { if (array[i][j] != 0) { if(judge(i, j) == 1) { return 1; } } } } return 0; } int judge(int x, int y) { int horizontal(int x, int y); int vertical(int x, int y); int minus_diagonal(int x, int y); int plus_diagonal(int x, int y); if (horizontal(x, y) == 1) { return 1; } if (vertical(x, y) == 1) { return 1; } if (minus_diagonal(x, y) == 1) { return 1; } if (plus_diagonal(x, y) == 1) { return 1; } return 0; } int horizontal(int x, int y) { int i, chess = 1; if (y &= 16) { for (i=1; i&5; i++) { if (array[x][y] == array[x][y+i]) { chess++; } } } if (chess &= 5) { winner = array[x][y]; return 1; } return 0; } int vertical(int x, int y) { int i, chess = 1; if (x &= 16) { for (i=1; i&5; i++) { if (array[x][y] == array[x+i][y]) { chess++; } } } if (chess &= 5) { winner = array[x][y]; return 1; } return 0; } int minus_diagonal(int x, int y) { int i, chess = 1; if (x&=16 && y&=16) { for (i=1; i&5; i++) { if (array[x][y] == array[x+i][y+i]) { chess++; } } } if (chess &= 5) { winner = array[x][y]; return 1; } return 0; } int plus_diagonal(int x, int y) { int i, chess = 1; if (x&=4 && y&=16) { for (i=1; i&5; i++) { if (array[x][y] == array[x-i][y+i]) { chess++; } } } if (chess &= 5) { winner = array[x][y]; return 1; } return 0; } 本人菜鸟一个,在VC++6.0上写出此拙劣的程序,其实不能算游戏,只是实现了五子棋的功能,有兴趣可以一起研究。麻烦采纳,谢谢!; } else { focus_y++
本回答被提问者采纳
为您推荐:
其他类似问题
您可能关注的内容
五子棋的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。

我要回帖

更多关于 java五子棋人机对战 的文章

 

随机推荐