五子棋程序设计说明书Word格式文档下载.docx
《五子棋程序设计说明书Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《五子棋程序设计说明书Word格式文档下载.docx(19页珍藏版)》请在冰豆网上搜索。
用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)输出结果界面
流程图
开始
玩家选择棋子
输出棋盘界面
O方先输入棋子坐标
刷新棋盘界面
3设计的基本过程
charb[40][40];
voidshow(),再接下来的双for是为塑形:
限定行间距为10<
i<
16,再限定列间距为10<
j<
16或25<
31,用判断语句来塑造图形“双眼”;
当i=21时,限定6<
=j<
=25,当i=22,23,24,25,26,27时同理,用判断语句来塑造“嘴”,最后用双for语句来输出图形。
4设计结果
玩家获胜显示界面截图
5总结与结论
1课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程.回顾起此次课程程序设计,至今我仍感慨颇多,从选题到定稿,从理论到实践,在整整两星期的日子里,学到很多很多的的东西,不仅巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,才能真正提高自己的实际动手能力和独立思考的能力。
在设计的过程中难免会遇到过各种各样的问题,同时在设计的过程中也发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,通过这次课程设计之后,把以前所学过的知识重新温故。
2这次课程设计顺利完成了,在设计中遇到了很多编程问题,最后在赵宇老师的辛勤指导下,终于游逆而解。
同时,在赵宇老师的身上我学得到很多实用的知识,我表示感谢!
同时,对给过我帮助的所有同学和各位指导老师再次表示忠心的感谢!
附录
负责人
设计内容
Viodjudge()函数的设计及程序的调试
Voidmove()函数的设计及课程设计说明书的排版制作
Intplaying()函数的设计及程序的调试
Voidshowcheckerboard()函数设计及相关操作
Voidshow()函数的设计及程序的调试
程序源代码:
#include<
>
chara[65][65];
voidshow()//输出获胜图像//
{
inti=0,j=0;
//i为横坐标变量,j为纵坐标变量//
for(i=0;
40;
i++)//对图像数组赋初值//
for(j=0;
j++)
{b[i][j]=46;
}
i++)//对图像数组特定点赋值//
for(j=0;
{
if(i>
10&
&
16)
{if(j>
16||j>
25&
31)
b[i][j]='
O'
;
else
{
if(i==21)
{if(j>
=6&
=35)
b[i][j]='
else
{
if(i==22)
{if(j>
=7&
=34)
b[i][j]='
else
{
if(i==23)
{if(j>
=8&
=33)
b[i][j]='
else
{
if(i==24)
{if(j>
=9&
=31)
b[i][j]='
{
if(i==25)
{if(j>
=10&
=30)
b[i][j]='
else
{
if(i==26)
{if(j>
=12&
=28)
b[i][j]='
else
{
if(i==27)
{if(j>
=14&
=26)
b[i][j]='
else
{
if(i==28)
{if(j>
=17&
=23)
b[i][j]='
}
}
}
}
}
}
}
}
}
for(i=0;
i++)//输出图像数组//
for(j=0;
printf("
%c"
b[i][j]);
printf("
\n"
);
}
voidmove(int*x,int*y)/*移动棋子的方向*///x为上一步棋子横坐标,y为上一步棋子纵坐标//
charb[40];
//为记录棋子将要移动的步伐//
inti,z,flag=1;
//z为某一步的中间变量,flag为标志变量//
gets(b);
//输入要移动的步伐//
i++)
{
z=b[i];
//把b【】的某一步传递给z//
switch(z)//判断移动棋子方向//
case119:
*x=*x-1;
break;
//w键控制棋子上移//
case97:
*y=*y-1;
//a键控制棋子左移//
case115:
*x=*x+1;
//s键控制棋子下移//
case100:
*y=*y+1;
//d键控制棋子右移//
case111:
flag=0;
//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]='
//首坐标的棋盘位置画棋子//
showcheckerboard(m,n);
//输出更新后的棋盘//
2000;
i++)//改变玩家//
if(flag==1)
flag=0;
flag=1;
for(k=0;
k<
k++)//玩家落子并判断下的棋子是否过界或此处是否有子//
{
if(flag==1)
{printf("
O方下棋\n"
m++;
@方下棋\n"
n++;
move(p1,p2);
if(x>
=1&
x<
=64&
y>
y<
=64)
{
if(a[x][y]==46)break;
else
{if(flag==1)m--;
elsen--;
printf("
此处有子,请继续移子"
continue;
else{if(flag==1)m--;
printf("
此处过界,请继续移子"
if(flag==1)//在a[][]的特定位置更新字符//
a[x][y]='
else
@'
showcheckerboard(m,n);
//更新棋盘//
l=judge(x,y);
//记录谁赢变量//
if(l==1)returnflag;
voidshowcheckerboard(intx,inty)/*画出棋盘*///x,y分别为o方下棋步数,@方下棋步数//
inti,j,w=0;
//i,j为横纵坐标变量//
================================================================================================================\n"
0方累计下棋步数:
%d@方累计下棋步数:
%d\n"
x,y);
65;
i++)//输出横纵坐标//
%2d"
i);
printf("
for(i=1;
if(j==0)
w+=1;
printf("
w);
%2c"
a[i][j]);
intjudge(intx,inty)/*判断各方向五子是否连成一线*///x,y分别为横纵坐标//
{
inti,b,c,d,e,z=1;
//z为标志变量,记录每个方向连棋个数//
for(i=1;
5;
i++)//垂直向下数//
if(a[x][y+i]==a[x][y])
z+=1;
if(z==5)
{return
(1);
elsebreak;
i++)//垂直向上数//
if(a[x][y-i]==a[x][y])
e=z;
z=1;
i++)//水平向右数//
if(a[x+i][y]==a[x][y])
i++)//水平向左数//
if(a[x-i][y]==a[x][y])
b=z;
for(i=1;
i++)//向左下方数//
if(a[x-i][y+i]==a[x][y])
i++)//向右上方数//
if(a[x+i][y-i]==a[x][y])
c=z;
i++)//向左上方数//
if(a[x-i][y-i]==a[x][y])
i++)//向右下方数//
if(a[x+i][y+i]==a[x][y])
d=z;
if(e!
=5&
b!
c!
d!
=5)//判断某个方向五子连棋//
return(0);
voidmain()
intx,y,flag,m=0,n=0,p=0;
//flag为哪方下棋的判断变量,m,n为分别记录双方的步数//
w为上移动,a为左移动,s为下移动,d为右移动,o确定落棋子\n"
=================================================================================================================\n"
玩家1选择棋子:
选0方输入1,选@方输入2\n"
scanf("
%d"
p);
for(x=1;
x++)//棋盘数组初始化//
for(y=1;
y++)
a[x][y]=46;
showcheckerboard(m,n);
//输出棋盘//
flag=playing();
//下棋//
show();
//输出获胜图形//
if(flag==1)//判断哪方获胜//
O方获胜"
else
@方获胜"