中北大学程序设计课程设计说明书学生姓名:学号:10051041学院:信息与通信工程学院专业:光电信息工程题目:五子棋指导教师:职称:2012年01月06日(纪念我已经逝去的大学生活)..Word格式院:信息与通信工程学院专业:光电信息工程学生姓名:学号:10051041课程设计题目:五子棋起迄日期:2011年12月24日~2012年1月6日课程设计地点:111420指导教师:系主任:下达任务书日期:2011年12月25日课程设计任务书1.设计目的:1熟悉C语言程序设计的原理与方法;2掌握C语言开发环境下程序的具体设计;3掌握利用C语言分析解决具体问题。2.设计内容和要求:..Word格式设计内容:用C语言设计一个五子棋游戏程序,允许游戏者自由选择棋子颜色,实现人人对战和人机对战,利用时间函数设置实现落子倒计时功能程序应该具有以下基本功能:1.显示欢迎界面。2.玩家棋子可选,棋盘范围足够。3.落子时间倒计时。设计要求:1.不同的功能使用不同的函数实现(模块化),对每个函数的功能和调用接口要注释清楚。对程序其它部分也进行必要的注释。3.对系统进行功能模块分析、画出总流程图和各模块流程图。4.用户界面要求使用方便、简洁明了、美观大方、格式统一。5.所有程序需在Win-Tc或MicrosoftVisualC++6.0环境调试通过。3.设计工作任务及工作量的要求〔包括课程设计计算说明书(论文)、图纸、实物样品等〕:1)课程设计说明书一份;2)电子文档(说明书、设计程序)一份课程设计任务书4.主要参考文献:..Word格式谭浩强《c程序设计》北京大学出版社5.设计成果形式及要求:1)课程说明书打印,并装订;2)必要的程序流程图和程序附录。6.工作计划及进度:2011年12月24日~2011年12月26日下达设计任务书,学生熟悉设计内容;2011年12月27日~2011年12月29日查阅参考资料,确定基本设计方案;2011年12月29日~2012年01月04日C语言进行程序设计;2012年01月05日~2012年01月06日完成设计报告;2012年01月06日答辩;系主任审查意见:签字:年月日..Word格式目录1、课程设计的背景及意义……………....062、设计的基本原理………………………063、设计的基本过程………………………084、设计的结果……………………………105、总结和结论…………………………….11..Word格式1.设计背景及意义我们的五子棋程序是在VisualC++6.0环境下运行的。VisualC++6.0MicrosoftVisualC++(简称VisualC++、MSVC、VC++或VC)微软公司的C++开发工具,具有集成开发环境,可提供编辑C语言,C++以及C++/CLI等编程语言。VC++整合了便利的除错工具,特别是整合了微软视窗程式设计(WindowsAPI)、三维动画DirectXAPI,Microsoft.NET框架。目前最新的版本是MicrosoftVisualC++2010。VisualC++6.0集成了MFC6.0,于1998发行。发行至今一直被广泛地用于大大小小的项目开发。五子棋是一种两人对弈的纯策略型棋类游戏,是起源于中国古代的传统黑白棋种之一。我们通过对《C语言》以及对《大学计算机基础》的初步学习后,本学期末进行了课程程序设计,设计课题为“五子棋”。我们小组由6人组成,通过分工与合作并在赵老师的耐心指导下共同完成了此程序设计。2.设计的基本原理2.1问题描述连珠(五子棋)是有两个人在一盘棋上进行对抗的竞技运动。在对局开始时,先由用户选择哪方先开局,先开局一方将一枚棋子落在一点上,然后由另一方在对方棋周围的交叉点上落子,如此轮流落子,直到某一方首先在棋盘的直线、横线..Word格式或斜线上形成连续的五子则该方就算获胜。此时,算法结束。2.2需求分析(1)输出棋盘界面(2)要求玩家选择棋子(3)玩家轮流下棋(4)判断键盘输入哪个键按规则执行操作(5)判断谁先落棋(6)判断赢家(7)输出结果界面2.3流程图开始玩家选择棋子输出棋盘界面O方先输入棋子坐标刷新棋盘界面..Word格式3设计的基本过程charb[40][40];玩家移动棋子转换玩家判断棋子是否出界判断是否重子输出胜利界面刷新棋盘界面结束判断是否赢棋NNNYYY..Word格式voidshow()//输出获胜图像//{inti=0,j=0;//i为横坐标变量,j为纵坐标变量//for(i=0;i40;i++)//对图像数组赋初值//for(j=0;j40;j++){b[i][j]=46;}for(i=0;i40;i++)//对图像数组特定点赋值//for(j=0;j40;j++){if(i10&&i16){if(j10&&j16||j25&&j31)b[i][j]='O';}else{if(i==21){if(j=6&&j=35)b[i][j]='O';}else{if(i==22){if(j=7&&j=34)b[i][j]='O';}else{if(i==23){if(j=8&&j=33)b[i][j]='O';}else{if(i==24){if(j=9&&j=31)b[i][j]='O';}else{if(i==25){if(j=10&&j=30)b[i][j]='O';}else{if(i==26){if(j=12&&j=28)b[i][j]='O';}else..Word格式{if(i==27){if(j=14&&j=26)b[i][j]='O';}else{if(i==28){if(j=17&&j=23)b[i][j]='O';}}}}}}}}}}for(i=0;i40;i++)//输出图像数组//{for(j=0;j40;j++)printf(%c,b[i][j]);printf(\n);}}详细说明:Show函数的目的是输出获胜界面,调用全局变量b[][](目的是为图像分配存储空间),i为横坐标变量,j为纵坐标变量,接下来的两个for是把b[][]初始化为“.”,再接下来的双for是为塑形:限定行间距为10i16,再限定列间距为10j16或25j31,用判断语句来塑造图形“双眼”;当i=21时,限定6=j=25,当i=22,23,24,25,26,27时同理,用判断语句来塑造“嘴”,最后用双for语句来输出图形。4设计结果玩家获胜显示界面截图..Word格式5总结与结论1课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程.回顾起此次课程程序设计,至今我仍感慨颇多,从选题到定稿,从理论到实践,在整整两星期的日子里,学到很多很多的的东西,不仅巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,才能真正提高自己的实际动手能力和独立思考的能力。在设计的过程中难免会遇到过各种各样的问题,同时在设计的过程中也发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,通过这次课程设计之后,把以前所学过的知识重新温故。这次课程设计顺利完成了,在设计中遇到了很多编程问题,最后在赵宇老师的辛勤指导下,终于游逆而解。同时,在赵宇老师的身上我学得到很多实用的知识,我表示感谢!同时,对给过我帮助的所有同学和各位指导老师再次表示忠心的感谢!附录负责人设计内容Viodjudge()函数的设计及程序的调试..Word格式Viodjudge()函数的设计及程序的调试Voidmove()函数的设计及课程设计说明书的排版制作Intplaying()函数的设计及程序的调试Voidshowcheckerboard()函数设计及相关操作Voidshow()函数的设计及程序的调试程序源代码:#includestdio.h#includestring.hchara[65][65];charb[40][40];voidshow()//输出获胜图像//{inti=0,j=0;//i为横坐标变量,j为纵坐标变量//for(i=0;i40;i++)//对图像数组赋初值//for(j=0;j40;j++){b[i][j]=46;}for(i=0;i40;i++)//对图像数组特定点赋值//for(j=0;j40;j++){if(i10&&i16){if(j10&&j16||j25&&j31)b[i][j]='O';}else..Word格式{if(i==21){if(j=6&&j=35)b[i][j]='O';}else{if(i==22){if(j=7&&j=34)b[i][j]='O';}else{if(i==23){if(j=8&&j=33)b[i][j]='O';}else{if(i==24){if(j=9&&j=31)b[i][j]='O';}else{if(i==25){if(j=10&&j=30)b[i][j]='O';}else{if(i==26){if(j=12&&j=28)b[i][j]='O';}else{if(i==27){if(j=14&&j=26)b[i][j]='O';}else{if(i==28){if(j=17&&j=23)b[i][j]='O';}}}}}}..Word格式}}}}for(i=0;i40;i++)//输出图像数组//{for(j=0;j40;j++)printf(%c,b[i][j]);printf(\n);}}voidmove(int*x,int*y)/*移动棋子的方向*///x为上一步棋子横坐标,y为上一步棋子纵坐标//{charb[40];//为记录棋子将要移动的步伐//inti,z,flag=1;//z为某一步的中间变量,flag为标志变量//gets(b);//输入要移动的步伐//for(i=0;i40;i++){z=b[i];//把b【】的某一步传递给z//switch(z)//判断移动棋子方向//{case119:*x=*x-1;break;//w键控制棋子上移//case97:*y=*y-1;break;//a键控制棋子左移//case115:*x=*x+1;break;//s键控制棋子下移//case100:*y=*y+1;break;//d键控制棋子右移//case111:flag=0;break;//o键确定落子//}if(flag==0)break;//判断某步是否移动完成//}}intplaying()/*开始下棋*/{intflag=1,i=0,x=0,y=0,k,l,n=0,m=1;//flag为记录哪方下棋的标志变量,x,y为a[][]的横纵坐标,m,n分别记录o方,@方的积累步数//int*p1=&x,*p2=&y;intjudge(intx,inty);//本函数所用子函数的声明//voidmove(int*p1,int*p2);voidshowcheckerboard(intx,inty);..Word格式printf(O方先输入首子坐标:);scanf(%d%d,&x,&y);//输入首坐标//a[x][y]='O';//首坐标的棋盘位置画棋子//showcheckerboard(m,n);//输出更新后的棋盘//for(i=0;i2000;i++)//改变玩家//{if(flag==1)flag=0;elseflag=1;for(k=0;k2000;k++)//玩家落子并判断下的棋子是否过界或此处是否有子//{if(flag==1){printf(O方下棋\n);m++;}else{printf(@方下棋\n);n++;}move(p1,p2);if(x=1&&x=64&&y=1&&y=64){if