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