2013-2014学年秋季学期《Windows程序设计》课程设计报告学院:计算机与信息学院序号:56姓名:周春雷学号:2012112302指导教师:王安慧完成时间2014年05月29日目录一、课程设计的目的...............................................................1二、课程设计的内容及要求...................................................1三、关键技术及相关原理介绍...............................................1四、系统的总体设计...............................................................2五、设计思路及关键问题的解决方法...................................3六、设计模块分类...................................................................41.输入模块...........................................................................42.输出模块...........................................................................63.判断模块...........................................................................7①判断输赢模块.............................................................7②判断命令模块...........................................................11七、运行结果截屏.................................................................13一、课程设计的目的通过所学的知识和技术,在老师的帮助下以及自己查询资料,完成对五子棋游戏的编程实现,使程序支持人人战,并且可以完成判断输赢,悔棋,从新开始等基本功能。本次课程设计的课题简单,且娱乐性强。在完成课题的过程中可以很好的复习学过的知识和技术,并且在完成设计编程后,可以很大程度上提高自信心和好学心,同时在做的过程中遇到难题能主动查阅资料、寻求帮助,对团队协作以及对网络资源的有效利用有了更深的体会。二、课程设计的内容及要求课程设计的内容:本次设计将提供一个“五子棋”的游戏程序,可完成的功能有“人与人对战”、悔棋、开始新游戏。课程设计的要求:使用QT软件开发,语言使用C++。三、关键技术及相关原理介绍本系统主要分为输入模块、输出模块和判断模块这三大块。各模块依据所属功能的不同来划分。输入模块主要实现用户对数据的输入,输出模块则是完成对用户输入到系统的数据在棋盘上的显示,而判断模块这是系统的主要模块,完成对用户输赢的判断和对用户悔棋和从新开始等操作命令的响应。本次采用了QT进行程序设计,对于图形界面有较好的处理方法和环境。四、系统的总体设计图1:系统功能模块图图1是系统的总体模块图,依据系统的不同功能包含3个大的模块:输入模块,判断模块和输出模块。各个模块的具体代码实现和功能描述在后面将详细的解释。这里只是对系统功能实现有一个初步的了解。系统输出模块判断模块输入模块判断命令模块判断输赢模块是否悔棋是否从新开始是否退出五、设计思路及关键问题的解决方法设计过程说明:图2:系统流程图图2给出了整个系统的流程图,简单直观的使系统一目了然。下面开始分析整个系统的流程。首先只能进行“人人对战”,有玩家自己决定谁先手,然后输入棋子位置后系统以“标签”的形式将棋子显示在棋盘上。在下棋后系统会开始判断用户是否有“五子相连”(遵守五子棋的游戏规则),如果有五个棋子相连说明用户获胜,这时候系统会提示“你获胜了!”。主要靠判断模块判断是否有获胜的,当然在判断后可以悔棋,系统会自动回到前一步。开始结束显示棋盘棋手下棋判断五子是否相连赢了悔棋NONOYES六、设计模块分类基本分为:输入模块、输出模块、判断模块1.输入模块将用户输入的数据记录,并输入给程序。本系统采用的是鼠标事件输入,用户用鼠标点击棋盘上的格子,系统将记录并在棋盘上显示。部分代码:voidMainWindow::mousePressEvent(QMouseEvent*e){intm,l=1,n;x=e-pos().rx();x=(x/50)*50;y=e-pos().ry();y=(y/50)*50;if(color[y/50][x/50]==1||color[y/50][x/50]==2);//判断是否已有标签else{label[j][j1]=newQLabel(this);if((j1+temp)%2==0){label[j][j1]-setGeometry(x,y,50,50);label[j][j1]-setStyleSheet(background-color:black;border-radius:25px);color[y/50][x/50]=1;if(win==0)label[j][j1]-show();if(j1==9){j++;}}else{label[j][j1]-setGeometry(x,y,50,50);label[j][j1]-setStyleSheet(background-color:gray;border-radius:25px);color[y/50][x/50]=2;if(win==0)label[j][j1]-show();if(j1==9){j++;}}k=check(color[j][j1],y/50,x/50);if(k==1){player=newQMediaPlayer();player-setMedia(QUrl::fromLocalFile(/E:/qt_data/music/劲乐团-卡农.mp3));player-play();QMessageBox::warning(this,tr(haha),tr(你获胜啦!),QMessageBox::Yes);win=1;}if(j1==9)j1=0;elsej1++;}}2.输出模块主要是棋盘函数以及棋子的显示,这里棋子用“标签”显示。图3:棋盘及棋子如图3所示,使用QT做成的界面,棋子落于棋盘的网格中而不是棋盘网格线的交叉点上。棋盘的部分代码:voidMainWindow::paintEvent(QPaintEvent*e)//棋盘函数{QPainterpainter(this);painter.setPen(Qt::black);for(i=0;i=10;i++){painter.drawLine(0,50*i,500,50*i);}for(i=0;i=10;i++){painter.drawLine(50*i,0,50*i,500);}}3.判断模块判断模块分为判断命令模块和判断输赢模块。①判断输赢模块判断输赢模块是整个程序的核心部分,它的主要功能是实现对五子棋的输赢的判断。图4:判断输赢模块流程图开始结束下棋四个方向判断是否有五颗棋子在一条线上切换用户YES赢水平竖直斜向上斜向下YESYESYESNONONONO判断输赢模块的具体工作原理由图4可以清晰直观的看到。为了完成判断输赢模块的编码实现,首先要了解五子棋输赢的规则。五子棋需要满足五颗棋子在水平、竖直、斜向上或斜向下这四个方向上任意一个方向上有相同五个棋子出现就判断为赢。所以编码时也要依次判断这四个方向是否有五颗棋子满足要求,如果有则判断赢,如果没有这切换用户继续下棋。然后下棋后继续判断这时候是否有五颗棋子满足要求,然后这样循环。首先当用户开始下棋后系统就开始判断是否存在五颗棋子连在一条线上,系统先从水平方向判断,如果水平方向有五颗棋子连成一条线就显示获胜,如果水平方向上没有就开始竖直方向上的判断;竖直方向有五颗棋子连成一条线就显示获胜,如果竖直方向上没有就开始斜向上方向上的判断;斜向上方向有五颗棋子连成一条线就显示获胜,如果斜向上方向上没有就开始斜向下方向上的判断;斜向下方向有五颗棋子连成一条线就显示获胜,如果斜向下方向上没有就切换用户下棋。然后开始新开始对用户输赢的判断,这就是整个系统的判断输赢模块的流程了。判断输赢模块的部分代码:intMainWindow::check(intn,intm,intp)//判断是否五子相连{l=1;intk=m,k1=p;for(inti=0;i10-p;i++)/*横向右判断是否五子相连*/{if(color[k][p]==color[k][++k1]){l++;if(l==5)return1;}elsebreak;}k1=p;for(i=p-1;i=0;i--)/*横向左判断是否五子相连*/{if(color[k][p]==color[k][--k1]){l++;if(l==5)return1;}elsebreak;}k=m;k1=p;l=1;for(i=0;i10-m;i++)/*竖向上判断是否五子相连*/{if(color[k][p]==color[++k][k1]){l++;if(l==5)return1;}elsebreak;}k=m;k1=p;for(i=m-1;i=0;i--)/*竖向下判断是否五子相连*/{if(color[k][p]==color[--k][k1]){l++;if(l==5)return1;}elsebreak;}k=m;k1=p;l=1;if(m=9-p)t=m;elset=9-p;for(i=0;it;i++)/*135度向上判断是否五子相连*/{if(color[m][p]==color[--k][++k1]){l++;if(l==5)return1;}elsebreak;}k=m;k1=p;if(p=9-m)t=p;elset=9-m;for(i=t-1;i=0;i--)/*135度向下判断是否五子相连*/{if(color[m][p]==color[++k][--k1]){l++;if(l==5)return1;}elsebreak;}k=m;k1=p;l=1;if(mp)t=m;elset=p;for(i=0;it;i++)/*45度向上判断是否五子相连*/{if(color[m][p]==color[--k][--k1]){l++;if(l==5)return1;}elsebreak;}k=m;k1=p;if(pm)t=9-m;elset=9-p;for(i=t-1;i=0;i--)/*45度向上判断是否五子相连*/{if(color[m][p]==color[++k][++k1]){l++;if(l==5)return1;}elsebreak;}if(l!=5)return0;}②判断命令模块主要是判断退出、从新开始、悔棋。是对系统功能的一个拓展和优化,有利于用户更方便舒适的操作系统,加强五子棋游戏的娱乐性。这一部分的流程图如下:图5:判断命令模块流程图如图5给出了系统判断命令模块的流程图。如图知道当用户下棋后,系统首先会判断用户是否需要从新开始游戏,如果需要系统会重新初始化后开始游戏。如果不需要,系统会判断是否有五颗棋子在一条线上,如果有则判断为赢结束游戏。如果没有五颗棋子在一条线上,系统会下棋切换用户获胜开始结束从新开始?判断五颗棋子是否在一条线上悔棋YESNONONOYESNOYES判断用户是否有悔棋,如果有,系统会返回上一步从新下棋,如果没有则切换用户继续下棋。下棋后重复这个判断流程。下面附上判断