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