当前位置:文档之家› 五子棋程序设计说明书

五子棋程序设计说明书

中北大学程序设计课程设计说明书学生姓名:学号:学院:信息与通信工程学院专业:光电信息工程题目:五子棋指导教师:职称:2012 年 01月 06 日(纪念我已经逝去的大学生活)院:信息与通信工程学院专业:光电信息工程学生姓名:学号:课程设计题目:五子棋起迄日期:2011年12月 24日~2012年1月6日课程设计地点: 111420指导教师:系主任:下达任务书日期: 2011 年12 月25日课程设计任务书课程设计任务书目录1、课程设计的背景及意义 (06)2、设计的基本原理 (06)3、设计的基本过程 (08)4、设计的结果 (10)5、总结和结论 (11)1.设计背景及意义我们的五子棋程序是在Visual C++ 环境下运行的。

Visual C++Microsoft Visual C++(简称Visual C++、MSVC、VC++或VC)微软公司的C++开发工具,具有集成开发环境,可提供编辑C语言,C++以及C++/CLI等编程语言。

VC++整合了便利的除错工具,特别是整合了微软视窗程式设计(Windows API)、三维动画DirectX API,Microsoft .NET框架。

目前最新的版本是Microsoft Visual C++ 2010。

Visual C++ 集成了,于1998发行。

发行至今一直被广泛地用于大大小小的项目开发。

五子棋是一种两人对弈的纯策略型棋类游戏,是起源于中国古代的传统黑白棋种之一。

我们通过对《C语言》以及对《大学计算机基础》的初步学习后,本学期末进行了课程程序设计,设计课题为“五子棋”。

我们小组由6人组成,通过分工与合作并在赵老师的耐心指导下共同完成了此程序设计。

2.设计的基本原理问题描述连珠(五子棋)是有两个人在一盘棋上进行对抗的竞技运动。

在对局开始时,先由用户选择哪方先开局,先开局一方将一枚棋子落在一点上,然后由另一方在对方棋周围的交叉点上落子,如此轮流落子,直到某一方首先在棋盘的直线、横线或斜线上形成连续的五子则该方就算获胜。

此时,算法结束。

需求分析(1)输出棋盘界面(2)要求玩家选择棋子(3)玩家轮流下棋(4)判断键盘输入哪个键按规则执行操作(5)判断谁先落棋(6)判断赢家(7)输出结果界面流程图3设计的基本过程char b[40][40];void show() ,再接下来的双for是为塑形:限定行间距为10<i<16,再限定列间距为10<j<16或25<j<31,用判断语句来塑造图形“双眼”;当i=21时,限定6<=j<=25,当i=22,23,24,25,26,27时同理,用判断语句来塑造“嘴”,最后用双for语句来输出图形。

4设计结果玩家获胜显示界面截图5总结与结论1课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程.回顾起此次课程程序设计,至今我仍感慨颇多,从选题到定稿,从理论到实践,在整整两星期的日子里,学到很多很多的的东西,不仅巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。

通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,才能真正提高自己的实际动手能力和独立思考的能力。

在设计的过程中难免会遇到过各种各样的问题,同时在设计的过程中也发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,通过这次课程设计之后,把以前所学过的知识重新温故。

2这次课程设计顺利完成了,在设计中遇到了很多编程问题,最后在赵宇老师的辛勤指导下,终于游逆而解。

同时,在赵宇老师的身上我学得到很多实用的知识,我表示感谢!同时,对给过我帮助的所有同学和各位指导老师再次表示忠心的感谢!附录程序源代码:#include<>#include<>char 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;elseflag=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';elsea[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("@方获胜");}。

相关主题