下载

2下载券

加入VIP
  • 专属下载特权
  • 现金文档折扣购买
  • VIP免费专区
  • 千万文档免费下载

上传资料

关闭

关闭

关闭

封号提示

内容

首页 五子棋

五子棋.doc

五子棋

YY-冰葑世纪
2012-06-16 0人阅读 举报 0 0 暂无简介

简介:本文档为《五子棋doc》,可适用于人文社科领域

计算机高级语言编程训练设计报告(学年第一学期)题目:五子棋班级:设计人员:学号:联系电话:指导教师:刘利群日期:小组其他成员:班级学号姓名联系电话电子电子电子评阅意见:成绩:日期:评阅教师:一、设计的功能模块有个模块:界面模块和主控模块。画图模块和判断输赢模块。电脑下子模块和计算下子价值模块。棋型模块和移位模块。二、题目描述五子棋是有两个人在一盘棋上进行对抗的竞技运动。在对局开始时先由用户选择哪方先开局先开局一方将一枚棋子落在一点上然后由另一方在对方棋周围的交叉点上落子如此轮流落子直到某一方首先在棋盘的直线、横线或斜线上形成连续的五子则该方就算获胜。本程序是采用C语言编写的可在WINDOWS系统下运行的娱乐游戏软件该程序面向广大棋类游戏的爱好者能够提供方便实现基本智能控制的游戏环境。本程序可以实现人人对战以及人机对战用户可以根据需要自行选择人机对战中电脑这方具有一定智能具备对奕能力。人人对战中双方棋手采用键盘输入坐标控制。游戏开始后选择模式可进入相应界面界面显示*的棋盘本游戏默认白棋先手五子连珠者胜,人机对战中程序会提示电脑当前下棋的位置结束时会显示对战双方胜负情况。三:核心算法五子棋流程图如图()所示:图()具体算法:()程序预处理程序预处理部分包括加载头文件、定义全局变量和定义数据结构并对它们进行初始化工作。具体加载的头文件代码如下:#include<stdioh>#include<stringh>*于字符数组的函数定义的头文件*#include<stdlibh>*standardlibrary标准库头文件*()界面模块和主控模块该模块主要用于界面初始化处理游戏运行过程中所输入的指令。主要函数是:voidmain()voidstart()核心算法如下:voidmain(){charkdo{x=*棋盘总格子数*start()printf("还要再来一盘吗输入y或n:")getchar()scanf("c",k)while(k!='y'k!='n'){printf("输入错误,请重新输入n")scanf("c",k)}system("cls")*调用系统DOS的cls命令,清屏。*}while(k=='y')printf("谢谢使用!n")}主函数通过不停的调用外部函数来实现算法的运行。其中start()函数主要是通过调用其他函数来现在棋子的运行。例如:else{AI(c,d)qipandc=COMxsystem("cls")draw()}*电脑下子*四、使用(操作)说明、运行的初始界面如图()所示。图()输入则进行人机对战功能如图()所示。图()输入则进行人人对战功能(图与图相似)五、开发文档、包含文件文件名称功能描述五子棋简易的五子棋对战程序可现实人机人人对战。、函数说明函数名称功能描述参数说明(类型、用处)main()主函数程序的入口函数start()游戏开始函数程序的主要控制函数、程序文件说明文件名称功能描述五子棋.C主函数所在源文件、源代码#include<stdioh>#include<stringh>*字符数组的函数定义的头文件*#include<stdlibh>*standardlibrary标准库头文件*#defineSPA#defineMAN#defineCOM*空位置设为玩家下的位置设为电脑下的位置设为*intqipan**的棋盘*inta,b,c,d,x*ab为玩家下子坐标cd为电脑下子坐标x为剩余空位置*voidstart()*程序的主要控制函数*voiddraw()*画棋盘*intwin(intp,intq)*判断胜利pq为判断点坐标*voidAI(int*p,int*q)*电脑下子pq返回下子坐标*intvalue(intp,intq)*计算空点pq的价值*intqixing(intn,intp,intq)*返回空点pq在n方向上的棋型n为方向从右顺时针开始数*voidyiwei(intn,int*i,int*j)*在n方向上对坐标ij移位n为方向从右顺时针开始数*****************主函数****************************设计者:**************voidmain(){charkdo{x=*棋盘总格子数*start()printf("还要再来一盘吗输入y或n:")getchar()scanf("c",k)while(k!='y'k!='n'){printf("输入错误,请重新输入n")scanf("c",k)}system("cls")*调用系统DOS的cls命令,清屏。*}while(k=='y')printf("谢谢使用!n")}*****************开始******************************设计者:***************voidstart(){inti,j,a,b,c,d,choice*ab储存玩家上手坐标cd储存电脑上手坐标*charchprintf("t╔**************************************************************╗n")printf("t║║n")printf("t║欢迎使用五子棋对战程序║n")printf("t║▄︻┻═┳一一┳═┻︻▄║n")printf("t║║n")printf("t║||║n")printf("t║|II|║n")printf("t║|I五子棋I|║n")printf("t║|I对战平台I|║n")printf("t║|II|║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║悔棋请输入║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("tttt请输入或:")*t是制表位一般占个字节*scanf("d",choice)*选择模式:人机或人人*while(choice!=choice!=){printf("输入错误请重新输入:")scanf("d",choice)}if(choice==)*人机模式*{system("cls")*调用系统DOS的cls命令,清屏。*printf("欢迎使用五子棋人机对战!下子请输入坐标(如)悔棋请输入。n")for(j=j<j)for(i=i<i)qipanji=SPA*置棋盘全为空*draw()printf("先下请按后下请按")*选择下棋的先后*scanf("d",i)while(i!=i!=){printf("输入错误请重新输入:")scanf("d",i)}if(i==)*玩家先手下子*{printf("请下子:")scanf("dd",a,b)while((a<||a>)||(b<||b>))*判断输入的坐标当a<或者a>,b<或者b>为坐标输入错误*{printf("坐标错误!请重新输入:")scanf("dd",a,b)}a=ab=bx*棋盘格子数相应减少一个*qipanba=MAN*玩家下的位置*system("cls")*调用系统DOS的cls命令,清屏。*draw()*调用画棋盘函数*}while(x!=){if(x==){c=d=qipandc=COM*玩家下的位置*xsystem("cls")draw()}*电脑先下就下在*else{AI(c,d)qipandc=COMxsystem("cls")draw()}*电脑下子*c=cd=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")printf("你输了!!!n")printf("下不过电脑很正常请不要灰心!!!n")printf("*******************************n")return}else{x=qipandc=SPAqipanba=SPAsystem("cls")draw()}*悔棋*}printf("电脑下在ddn请输入:",c,d)scanf("dd",a,b)*玩家下子*if(a==b==){x=qipandc=SPAqipanba=SPAsystem("cls")draw()printf("请输入:")scanf("dd",a,b)}*悔棋*while((a<||a>)||(b<||b>)||qipanba!=SPA)*判断输入坐标是否错误*{printf("坐标错误或该位置已有子!请重新输入:")scanf("dd",a,b)}a=ab=bxqipanba=MANsystem("cls")draw()if(win(a,b))*调用win函数*{printf("*******************************n")printf("你赢了!!!n")printf("请不要骄傲继续努力!!!n")printf("*******************************n")return}*玩家赢*}printf("和局n")}if(choice==)*选择人人对战*{system("cls")printf("欢迎使用五子棋人人对战!下子请输入坐标(如)悔棋请输入。n")for(j=j<j)for(i=i<i)qipanji=SPA*置棋盘全为空*draw()while(x!=){printf("P请输入:")scanf("dd",a,b)if(a==b==)*悔棋*{x=qipandc=SPAqipanba=SPAsystem("cls")draw()printf("P请输入:")scanf("dd",a,b)}while((a<||a>)||(b<||b>)||qipanba!=SPA){printf("坐标错误或该位置已有子!请重新输入:")scanf("dd",a,b)}a=ab=bxqipanba=MANsystem("cls")draw()printf("P下在dd。n",a,b)if(win(a,b))*调用win函数*{printf("你真棒!!!n")return}*玩家赢*printf("P请输入:")scanf("dd",c,d)if(c==d==)*悔棋*{x=qipanba=SPAqipandc=SPAsystem("cls")draw()printf("P请输入:")scanf("dd",c,d)}while((c<||c>)||(d<||d>)||qipandc!=SPA){printf("坐标错误或该位置已有子!请重新输入:")scanf("dd",c,d)}c=cd=dxqipandc=COMsystem("cls")draw()printf("P下在dd。n",c,d)if(win(c,d)){printf("你真棒!!!n")return}*玩家赢*}printf("和局n")}}***************画棋盘*****************************设计者:***************voiddraw(){inti,jcharpfor(j=j<j)for(i=i<i){if(qipanji==SPA)strcpy(pji,"")if(qipanji==MAN)strcpy(pji,"●")if(qipanji==COM)strcpy(pji,"○")}printf("n")printf("┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐n")for(i=,j=i<i,j){printf("d│s│s│s│s│s│s│s│s│s│s│s│s│s│s│s│dn",j,pi,pi,pi,pi,pi,pi,pi,pi,pi,pi,pi,pi,pi,pi,pi,j)printf("├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤n")}printf("│s│s│s│s│s│s│s│s│s│s│s│s│s│s│s│n",p,p,p,p,p,p,p,p,p,p,p,p,p,p,p)printf("└─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘n")printf("n")}***************判断输赢***************************设计者:***************intwin(intp,intq)*判断胜利pq为判断点坐标胜利返回否则返回*{intk,n=,m,P,Q*k储存判断点pq的状态COM或MAN。PQ储存判断点坐标。n为判断方向。m为个数。*P=pQ=qk=qipanqpwhile(n!=){m=while(k==qipanqp){mif(m==)returnyiwei(n,p,q)if(p<||p>||q<||q>)break}n=m=p=Pq=Q*转向判断*while(k==qipanqp){mif(m==)returnyiwei(n,p,q)if(p<||p>||q<||q>)break}n=p=Pq=Q*不成功则判断下一组方向*}return}****************电脑下子**************************设计者:**************voidAI(int*p,int*q)*电脑下子*p*q返回下子坐标*{inti,j,k,max=,I,J*IJ为下点坐标*for(j=j<j)for(i=i<i)if(qipanji==SPA){*历遍棋盘遇到空点则计算价值取最大价值点下子。*k=value(i,j)if(k>=max){I=iJ=jmax=k}}*p=I*q=J}***********计算下子的价值************************设计者:**********intvalue(intp,intq)*计算空点pq的价值以k返回*{intn=,k=,k,k,K,K,X,Y,Z,X,Y,Z,tempinta={,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,}*数组a中储存己方和对方共种棋型的值己方对方活冲空活空冲子数(表示个子表示个子)*while(n!=){k=qixing(n,p,q)n=*k,k为个反方向的棋型编号*k=qixing(n,p,q)n=if(k>k){temp=kk=kk=temp}*使编号小的为k,大的为k*K=kK=k*KK储存kk的编号*Z=kZ=kk=k=Y=kY=kk=k=X=kX=k*XYZ分别表示己方对方活冲空活空冲子数(表示个子表示个子)*if(K==){if(K<){k=continue}elsek=aXYZcontinue}*空棋型and其他*if(K==){if(K<){k=continue}elsek=aXYZcontinue}*边界冲棋型and其他*if(K==){if(K<){k=continue}elsek=aXYZcontinue}*边界空冲棋型and其他*if(((K>K<)((K>K<)||(K>K<)))||((K>K<)((K>K<)||(K>K<)))){*己活己活己活己冲对活对活对活对冲的棋型赋值*if(ZZ>=){k=aXYcontinue}else{k=aXYZZcontinue}}if(((K>K<)(K>K<))||((K>K<)(K>K<))){*己冲己冲对冲对冲的棋型赋值*if(ZZ>=){k=continue}else{k=continue}}if(((K>K<)((K>K<)||(K>K<)))||((K>K<)((K>K<)||(K>K<)))){*己活对活己活对冲己冲对活己冲对冲的棋型赋值*if(Z==||Z==){k=continue}else{k=aXYZaXYZcontinue}}else{k=aXYZaXYZcontinue}*其他棋型的赋值*}returnk}*****************棋型******************************设计者:***************intqixing(intn,intp,intq)*返回空点pq在n方向上的棋型号n为方向从右顺时针开始数*{intk,m=*棋型号注解:己活己冲对活对冲己空活己空冲对空活对空冲空边界冲边界空冲*yiwei(n,p,q)if(p<||p>||q<||q>)k=*边界冲棋型*switch(qipanqp){caseCOM:{myiwei(n,p,q)if(p<||p>||q<||q>){k=mreturnk}while(qipanqp==COM){myiwei(n,p,q)if(p<||p>||q<||q>){k=mreturnk}}if(qipanqp==SPA)k=m*己方活棋型*elsek=m*己方冲棋型*}breakcaseMAN:{myiwei(n,p,q)if(p<||p>||q<||q>){k=mreturnk}while(qipanqp==MAN){myiwei(n,p,q)if(p<||p>||q<||q>){k=mreturnk}}if(qipanqp==SPA)k=m*对方活棋型*elsek=m*对方冲棋型*}breakcaseSPA:{yiwei(n,p,q)if(p<||p>||q<||q>){k=returnk}*边界空冲棋型*switch(qipanqp){caseCOM:{myiwei(n,p,q)if(p<||p>||q<||q>){k=mreturnk}while(qipanqp==COM){myiwei(n,p,q)if(p<||p>||q<||q>){k=mreturnk}}if(qipanqp==SPA)k=m*己方空活棋型*elsek=m*己方空冲棋型*}breakcaseMAN:{myiwei(n,p,q)if(p<||p>||q<||q>){k=mreturnk}while(qipanqp==MAN){myiwei(n,p,q)if(p<||p>||q<||q>){k=mreturnk}}if(qipanqp==SPA)k=m*对方空活棋型*elsek=m*对方空冲棋型*}breakcaseSPA:k=break*空棋型*}}break}returnk}*****************移位******************************设计者:***************voidyiwei(intn,int*i,int*j)*在n方向上对坐标ij移位n为方向从右顺时针开始数*{switch(n){case:*i=breakcase:*i=*j=breakcase:*j=breakcase:*i=*j=breakcase:*i=breakcase:*i=*j=breakcase:*j=breakcase:*i=*j=break}}七、设计的优点八、存在的问题及改进、存在的问题:没有用到图形函数界面不够漂亮。悔棋部分做得不是很严谨存在些许BUG,不过问题不大。没有用到鼠标输入使操作起来很不方便。、改进的设想:通过使用图形函数改善界面算法部分还得认真的去设计使程序更加完美。还可以用到调用鼠标的函数改善操作。九、心得体会我们进行了为期一周的C语言课程设计。通过这次课程设计我们拓宽了知识面锻炼了能力综合素质得到较大提高。本次课程设计使我们对从五子棋设计的基本过程的设计方法、步骤、思路、有一定的了解与认识。在课程设计过程中我们基本能按照规定的程序进行先针对五子棋的设计收集、调查有关资料其间同组成员之间进行几次方案的讨论、修改再讨论、再修改最后定案。设计方案确定后再用c语言实现了可视化的五子棋算法。整个过程周密有序对我们按时高质完成课程设计非常有利!程序设计达到了专业学习的预期目的。课程设计之后我们普遍感到不仅实际动手能力有所提高更重要的是进一步激发了我们对专业知识的兴趣并能够结合实际存在的问题在专业领域内进行更深入的学习。对我们电子专业的本科生来说实际能力的培养至关重要而这种实际能力的培养单靠课堂教学是远远不够的必须从课堂走向实践。通过课程设计让我们找出自身状况与实际需要的差距并在以后的学习期间及时补充相关知识为求职与正式工作做好充分的知识、能力准备从而缩短从校园走向社会的心理转型期。

用户评价(0)

关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

文档小程序码

使用微信“扫一扫”扫码寻找文档

1

打开微信

2

扫描小程序码

3

发布寻找信息

4

等待寻找结果

我知道了
评分:

/21

五子棋

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利