五子棋程序设计说明书.docx

上传人:b****7 文档编号:9036712 上传时间:2023-02-02 格式:DOCX 页数:19 大小:43.13KB
下载 相关 举报
五子棋程序设计说明书.docx_第1页
第1页 / 共19页
五子棋程序设计说明书.docx_第2页
第2页 / 共19页
五子棋程序设计说明书.docx_第3页
第3页 / 共19页
五子棋程序设计说明书.docx_第4页
第4页 / 共19页
五子棋程序设计说明书.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

五子棋程序设计说明书.docx

《五子棋程序设计说明书.docx》由会员分享,可在线阅读,更多相关《五子棋程序设计说明书.docx(19页珍藏版)》请在冰豆网上搜索。

五子棋程序设计说明书.docx

五子棋程序设计说明书

中北大学

程序设计

课程设计说明书

 

学生姓名:

学号:

学院:

信息与通信工程学院

专业:

光电信息工程

题目:

五子棋

 

指导教师:

职称:

 

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)输出结果界面

流程图

 

开始

玩家选择棋子

输出棋盘界面

O方先输入棋子坐标

刷新棋盘界面

 

 

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("@方获胜");

 

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1