五子棋程序设计说明书.docx
《五子棋程序设计说明书.docx》由会员分享,可在线阅读,更多相关《五子棋程序设计说明书.docx(20页珍藏版)》请在冰豆网上搜索。
五子棋程序设计说明书
五子棋程序设计说明书
中北大学
程序设计
课程设计说明书
学生姓名:
学号:
学院:
信息与通信工程学院
专业:
光电信息工程
题目:
五子棋
指导教师:
职称:
2012年01月06日
(纪念我已经逝去的大学生活)
院:
信息与通信工程学院
专业:
光电信息工程
学生姓名:
学号:
课程设计题目:
五子棋
起迄日期:
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或MicrosoftVisualC++环境调试通过。
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、课程设计的背景及意义……………....06
2、设计的基本原理………………………06
3、设计的基本过程………………………08
4、设计的结果……………………………10
5、总结和结论…………………………….11
1.设计背景及意义
我们的五子棋程序是在VisualC++环境下运行的。
VisualC++
MicrosoftVisualC++(简称VisualC++、MSVC、VC++或VC)微软公司的C++开发工具,具有集成开发环境,可提供编辑C语言,C++以及C++/CLI等编程语言。
VC++整合了便利的除错工具,特别是整合了微软视窗程式设计(WindowsAPI)、三维动画DirectXAPI,Microsoft.NET框架。
目前最新的版本是MicrosoftVisualC++2010。
VisualC++集成了,于1998发行。
发行至今一直被广泛地用于大大小小的项目开发。
五子棋是一种两人对弈的纯策略型棋类游戏,是起源于中国古代的传统黑白棋种之一。
我们通过对《C语言》以及对《大学计算机基础》的初步学习后,本学期末进行了课程程序设计,设计课题为“五子棋”。
我们小组由6人组成,通过分工与合作并在赵老师的耐心指导下共同完成了此程序设计。
2.设计的基本原理
问题描述
连珠(五子棋)是有两个人在一盘棋上进行对抗的竞技运动。
在对局开始时,先由用户选择哪方先开局,先开局一方将一枚棋子落在一点上,然后由另一方在对方棋周围的交叉点上落子,如此轮流落子,直到某一方首先在棋盘的直线、横线或斜线上形成连续的五子则该方就算获胜。
此时,算法结束。
需求分析
(1)输出棋盘界面
(2)要求玩家选择棋子
(3)玩家轮流下棋
(4)判断键盘输入哪个键按规则执行操作
(5)判断谁先落棋
(6)判断赢家
(7)输出结果界面
流程图
3设计的基本过程
charb[40][40];
voidshow(),再接下来的双for是为塑形:
限定行间距为10
4设计结果
玩家获胜显示界面截图
5总结与结论
1课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程.回顾起此次课程程序设计,至今我仍感慨颇多,从选题到定稿,从理论到实践,在整整两星期的日子里,学到很多很多的的东西,不仅巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,才能真正提高自己的实际动手能力和独立思考的能力。
在设计的过程中难免会遇到过各种各样的问题,同时在设计的过程中也发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,通过这次课程设计之后,把以前所学过的知识重新温故。
2这次课程设计顺利完成了,在设计中遇到了很多编程问题,最后在赵宇老师的辛勤指导下,终于游逆而解。
同时,在赵宇老师的身上我学得到很多实用的知识,我表示感谢!
同时,对给过我帮助的所有同学和各位指导老师再次表示忠心的感谢!
附录
负责人
设计内容
Viodjudge()函数的设计及程序的调试
Viodjudge()函数的设计及程序的调试
Voidmove()函数的设计及课程设计说明书的排版制作
Intplaying()函数的设计及程序的调试
Voidshowcheckerboard()函数设计及相关操作
Voidshow()函数的设计及程序的调试
程序源代码:
#include<>
#include<>
chara[65][65];
charb[40][40];
voidshow()//输出获胜图像//
{
inti=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");
}
}
voidmove(int*x,int*y)/*移动棋子的方向*///x为上一步棋子横坐标,y为上一步棋子纵坐标//
{
charb[40];//为记录棋子将要移动的步伐//
inti,z,flag=1;//z为某一步的中间变量,flag为标志变量//
gets(b);//输入要移动的步伐//
for(i=0;i<40;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);
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--;elsen--;
printf("此处有子,请继续移子");
continue;
}
}
else{if(flag==1)m--;elsen--;printf("此处过界,请继续移子");}
}
if(flag==1)//在a[][]的特定位置更新字符//
a[x][y]='O';
else
a[x][y]='@';
showcheckerboard(m,n);//更新棋盘//
l=judge(x,y);//记录谁赢变量//
if(l==1)returnflag;
}
}
voidshowcheckerboard(intx,inty)/*画出棋盘*///x,y分别为o方下棋步数,@方下棋步数//
{
inti,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");
}
}
intjudge(intx,inty)/*判断各方向五子是否连成一线*///x,y分别为横纵坐标//
{
inti,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;}
}
elsebreak;
}
for(i=1;i<5;i++)//垂直向上数//
{
if(a[x][y-i]==a[x][y])
{
z+=1;
if(z==5)
{return
(1);break;}
}
elsebreak;
}
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;}
}
elsebreak;
}
for(i=1;i<5;i++)//水平向左数//
{
if(a[x-i][y]==a[x][y])
{
z+=1;
if(z==5)
{return
(1);break;}
}
elsebreak;
}
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;}
}
elsebreak;
}
for(i=1;i<5;i++)//向右上方数//
{
if(a[x+i][y-i]==a[x][y])
{
z+=1;
if(z==5)
{return
(1);break;}
}
elsebreak;
}
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;}
}
elsebreak;
}
for(i=1;i<5;i++)//向右下方数//
{
if(a[x+i][y+i]==a[x][y])
{
z+=1;
if(z==5)
{return
(1);break;}
}
elsebreak;
}
d=z;
if(e!
=5&&b!
=5&&c!
=5&&d!
=5)//判断某个方向五子连棋//
{
return(0);
}
}
voidmain()
{
intx,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方获胜");
else
printf("@方获胜");
}