QT-五子棋游戏设计-课程设计报告

时间:2024.5.2

20##-20##学年秋季学期

《Windows程序设计》

课程设计报告

      学    院:        计算机与信息学院     

      序    号:              56             

      姓    名:            周春雷           

      学    号:          2012112302         

      指导教师:           王安慧           

     

                完成时间      20## 0529


目录

一、 课程设计的目的.................................................................... 1

二、 课程设计的内容及要求....................................................... 1

三、 关键技术及相关原理介绍................................................... 1

四、 系统的总体设计.................................................................... 2

五、 设计思路及关键问题的解决方法...................................... 3

六、 设计模块分类........................................................................ 4

1. 输入模块................................................................................ 4

2. 输出模块................................................................................ 6

3. 判断模块................................................................................ 7

① 判断输赢模块................................................................. 7

② 判断命令模块............................................................... 11

七、 运行结果截屏...................................................................... 13


一、课程设计的目的

通过所学的知识和技术,在老师的帮助下以及自己查询资料,完成对五子棋游戏的编程实现,使程序支持人人战,并且可以完成判断输赢,悔棋,从新开始等基本功能。

本次课程设计的课题简单,且娱乐性强。在完成课题的过程中可以很好的复习学过的知识和技术,并且在完成设计编程后,可以很大程度上提高自信心和好学心,同时在做的过程中遇到难题能主动查阅资料、寻求帮助,对团队协作以及对网络资源的有效利用有了更深的体会。

二、课程设计的内容及要求

课程设计的内容:本次设计将提供一个“五子棋”的游戏程序,可完成的功能有“人与人对战”、悔棋、开始新游戏。

课程设计的要求:使用QT软件开发,语言使用C++。

三、关键技术及相关原理介绍

本系统主要分为输入模块、输出模块和判断模块这三大块。各模块依据所属功能的不同来划分。

输入模块主要实现用户对数据的输入,输出模块则是完成对用户输入到系统的数据在棋盘上的显示,而判断模块这是系统的主要模块,完成对用户输赢的判断和对用户悔棋和从新开始等操作命令的响应。

本次采用了QT进行程序设计,对于图形界面有较好的处理方法和环境。

四、系统的总体设计

 

图1:系统功能模块图

图1是系统的总体模块图,依据系统的不同功能包含3个大的模块:输入模块,判断模块和输出模块。各个模块的具体代码实现和功能描述在后面将详细的解释。这里只是对系统功能实现有一个初步的了解。

五、设计思路及关键问题的解决方法

设计过程说明:

 

图2:系统流程图

图2给出了整个系统的流程图,简单直观的使系统一目了然。下面开始分析整个系统的流程。

首先只能进行“人人对战”,有玩家自己决定谁先手,然后输入棋子位置后系统以“标签”的形式将棋子显示在棋盘上。在下棋后系统会开始判断用户是否有“五子相连”(遵守五子棋的游戏规则),如果有五个棋子相连说明用户获胜,这时候系统会提示“你获胜了!”。

主要靠判断模块判断是否有获胜的,当然在判断后可以悔棋,系统会自动回到前一步。

六、设计模块分类

基本分为:输入模块、输出模块、判断模块

1.    输入模块

将用户输入的数据记录,并输入给程序。

本系统采用的是鼠标事件输入,用户用鼠标点击棋盘上的格子,系统将记录并在棋盘上显示。

部分代码:

void MainWindow::mousePressEvent(QMouseEvent *e)

{

   int m,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]=new QLabel(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=new QMediaPlayer();

    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;

   else j1++;

   }

}

2.    输出模块

主要是棋盘函数以及棋子的显示,这里棋子用“标签”显示。

 

图3:棋盘及棋子

如图3所示,使用QT做成的界面,棋子落于棋盘的网格中而不是棋盘网格线的交叉点上。

棋盘的部分代码:

void MainWindow::paintEvent(QPaintEvent *e)//棋盘函数

{    

   QPainter painter(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:判断输赢模块流程图

判断输赢模块的具体工作原理由图4可以清晰直观的看到。

为了完成判断输赢模块的编码实现,首先要了解五子棋输赢的规则。五子棋需要满足五颗棋子在水平、竖直、斜向上或斜向下这四个方向上任意一个方向上有相同五个棋子出现就判断为赢。所以编码时也要依次判断这四个方向是否有五颗棋子满足要求,如果有则判断赢,如果没有这切换用户继续下棋。然后下棋后继续判断这时候是否有五颗棋子满足要求,然后这样循环。

首先当用户开始下棋后系统就开始判断是否存在五颗棋子连在一条线上,系统先从水平方向判断,如果水平方向有五颗棋子连成一条线就显示获胜,如果水平方向上没有就开始竖直方向上的判断;竖直方向有五颗棋子连成一条线就显示获胜,如果竖直方向上没有就开始斜向上方向上的判断;斜向上方向有五颗棋子连成一条线就显示获胜,如果斜向上方向上没有就开始斜向下方向上的判断;斜向下方向有五颗棋子连成一条线就显示获胜,如果斜向下方向上没有就切换用户下棋。

然后开始新开始对用户输赢的判断,这就是整个系统的判断输赢模块的流程了。

判断输赢模块的部分代码:

int  MainWindow::check(int n,int m,int p)//判断是否五子相连

{

   l=1;

   int k=m,k1=p;

   for(int i=0;i<10-p;i++)/*横向右判断是否五子相连*/

   {

       if(color[k][p]==color[k][++k1]){

           l++;

           if(l==5)

               return 1;

       }else break;

   }

   k1=p;

   for(i=p-1;i>=0;i--)/*横向左判断是否五子相连*/

   {

       if(color[k][p]==color[k][--k1]){

           l++;

           if(l==5)

               return 1;

       }else break;

   }

   k=m;

   k1=p;

   l=1;

   for(i=0;i<10-m;i++)/*竖向上判断是否五子相连*/

   {

       if(color[k][p]==color[++k][k1]){

                l++;

                if(l==5)

                    return 1;

            }else break;

   }

   k=m;

   k1=p;

   for(i=m-1;i>=0;i--)/*竖向下判断是否五子相连*/

       {

           if(color[k][p]==color[--k][k1]){

               l++;

               if(l==5)

                   return 1;

           }else break;

       }

       k=m;

       k1=p;

       l=1;

       if(m<=9-p) t=m;

       else t=9-p;

   for(i=0;i<t;i++)/*135度向上判断是否五子相连*/

   {

       if(color[m][p]==color[--k][++k1]){

                l++;

               if(l==5)

                   return 1;

            }else break;

   }

   k=m;

   k1=p;

   if(p<=9-m) t=p;

   else t=9-m;

   for(i=t-1;i>=0;i--)/*135度向下判断是否五子相连*/

       {

           if(color[m][p]==color[++k][--k1]){

               l++;

               if(l==5)

                   return 1;

           }else break;

       }

   k=m;

   k1=p;

   l=1;

   if(m<p) t=m;

   else t=p;

for(i=0;i<t;i++)/*45度向上判断是否五子相连*/

{

   if(color[m][p]==color[--k][--k1]){

            l++;

           if(l==5)

               return 1;

        } else break;

}

k=m;

k1=p;

if(p<m) t=9-m;

else t=9-p;

for(i=t-1;i>=0;i--)/*45度向上判断是否五子相连*/

   {

       if(color[m][p]==color[++k][++k1]){

           l++;

           if(l==5)

               return 1;

       }else break;

   }

   if(l!=5) return 0;

}

② 判断命令模块

主要是判断退出、从新开始、悔棋。

是对系统功能的一个拓展和优化,有利于用户更方便舒适的操作系统,加强五子棋游戏的娱乐性。这一部分的流程图如下:

 

图5:判断命令模块流程图

如图5给出了系统判断命令模块的流程图。

如图知道当用户下棋后,系统首先会判断用户是否需要从新开始游戏,如果需要系统会重新初始化后开始游戏。如果不需要,系统会判断是否有五颗棋子在一条线上,如果有则判断为赢结束游戏。如果没有五颗棋子在一条线上,系统会判断用户是否有悔棋,如果有,系统会返回上一步从新下棋,如果没有则切换用户继续下棋。下棋后重复这个判断流程。

下面附上判断命令模块的部分代码:

void MainWindow::huiqi()//悔棋的代码

{

   label[j][j1-1]->close();

   color[y/50][x/50]=0;

   if(temp==0)

   temp=1;

   else temp=0;

}

void MainWindow::init()//初始化界面

{

   player->stop();

   int t2,t3;

   for(t2=0;t2<10;t2++)

       for(t3=0;t3<10;t3++)

       {

           color[t2][t3]=0;

       }

   for(t2=0;t2<j;t2++)

       for(t3=0;t3<10;t3++)

       {

           label[t2][t3]->close();

       }

   for(t2=0;t2<j1;t2++)

       label[j][t2]->close();

   j=0;j1=0;color[10][10]={};k=0;l=1;temp=0,win=0;

}

七、运行结果截屏

     

图6:棋盘界面                                                      图7:赢棋界面

图8:悔棋连图


第二篇:C语言五子棋游戏程序课程设计


C++五子棋游戏程序设计

一、课设内容

1. 掌握C++基本编程风格。

2. 编写程序代码,实现各个模块的功能。

3. 完成小型游戏应用系统的设计开发.

4. 关键语句写注释。

5. 测试程序,写出测试报告。

6. 在实验报告写出综合设计心得。

二、实验内容

在此次大作业中,我学习设计一个五子棋游戏的程序,源代码及分析如下:

#include<iostream.h>

#include<iomanip.h>

void shuchu(char a[15][15])

{

       int x,y,i;

       cout<<"  ";

       for(i=0;i<15;i++)

              cout<<setw(3)<<i;

       cout<<endl; 

       for(x=0;x<15;x++)

       {

              cout<<setw(2)<<x;

              for(y=0;y<15;y++)

                     cout<<setw(3)<<a[x][y];

              cout<<endl;

             

       }

}

bool osheng(char a[15][15])

{

       int x,y;

       for(x=0;x<15;x++)

              for(y=0;y<11;y++)

                     if(a[x][y]=='o'&&a[x][y+1]=='o'&&a[x][y+2]=='o'&&a[x][y+3]=='o'&&a[x][y+4]=='o')

                            return 1;

       for(x=0;x<11;x++)

              for(y=0;y<15;y++)

                     if(a[x][y]=='o'&&a[x+1][y]=='o'&&a[x+2][y]=='o'&&a[x+3][y]=='o'&&a[x+4][y]=='o')

                            return 1;

       for(x=0;x<11;x++)

              for(y=0;y<11;y++)

                     if(a[x][y]=='o'&&a[x+1][y+1]=='o'&&a[x+2][y+2]=='o'&&a[x+3][y+3]=='o'&&a[x+4][y+4]=='o')

                            return 1;

       for(x=15;x>4;x--)

             

       return 0;

}

bool xsheng(char a[15][15])

{

       int x,y;

       for(x=0;x<15;x++)

              for(y=0;y<11;y++)

                     if(a[x][y]=='x'&&a[x][y+1]=='x'&&a[x][y+2]=='x'&&a[x][y+3]=='x'&&a[x][y+4]=='x')

                            return 1;

       for(x=0;x<11;x++)

              for(y=0;y<15;y++)

                     if(a[x][y]=='x'&&a[x+1][y]=='x'&&a[x+2][y]=='x'&&a[x+3][y]=='x'&&a[x+4][y]=='x')

                            return 1;

       for(x=0;x<11;x++)

              for(y=0;y<11;y++)

                     if(a[x][y]=='x'&&a[x+1][y+1]=='x'&&a[x+2][y+2]=='x'&&a[x+3][y+3]=='x'&&a[x+4][y+4]=='x')

                            return 1;

       for(x=15;x>4;x--)

              for(y=15;y>4;y--)

                     if(a[x][y]=='x'&&a[x+1][y-1]=='x'&&a[x+2][y-2]=='x'&&a[x+3][y-3]=='x'&&a[x-4][y+4]=='x')

                            return 1;

       return 0;

}

bool he(char a[15][15])

{

       int x,y;

       for(x=0;x<15;x++)

              for(y=0;y<15;y++)

                     if(a[x][y]=='-')

                            return 0;

       return 1;

}

void main()

{

       int x,y,s,q;

       char a[15][15];

       for(x=0;x<15;x++)

              for(y=0;y<15;y++)

       cin>>q;

       if(q==1)

              goto two;

/*    else       

              goto one;   */

two:

       cout<<"请选择是否进入悔棋模式:1.是;2.否\n";

       cin>>q;

       if(q==2)

              goto three;

       shuchu(a);

       while(1)

       {

s:            while(1)

              {

                     cout<<"请玩家1输入下子的坐标"<<endl;

                     cin>>x>>y;

                     if(a[x][y]=='o'||a[x][y]=='x')

                            cout<<"此处已经有字,请重下"<<endl;

                     else

                     {

                            a[x][y]='o';

                            break;

                     }

              }

              shuchu(a);

              cout<<"是否需要悔棋?是 请输入:1;否 请输入:0"<<endl;

              cin>>s;

              switch(s)

              {

              case 1:

                     a[x][y]='-';

                     goto s;

                     break;

              case 0:

                     goto s1;

                     break;

              }

s1:          if(osheng(a))

              {

                     cout<<"玩家1胜";

                     break;

              }

s2:          while(1)

              {

                     cout<<"请玩家2输入下子的坐标"<<endl;

                     cin>>x>>y;

            if(a[x][y]=='o'||a[x][y]=='x')

                            cout<<"此处已经有字,请重下"<<endl;

                     else

                     {

                            a[x][y]='x';

                            break;

                     }

              }

              shuchu(a);

              cout<<"是否需要悔棋?是 请输入:1;否 请输入:0"<<endl;

              cin>>s;

              switch(s)

              {

              case 1:

                     a[x][y]='-';

                     goto s2;

                     break;

              case 0:

                     goto s3;

                     break;

              }

s3:       if(xsheng(a))

              {

                     cout<<"玩家2胜";

             

             

             

             

              if(he(a))

              {

                     cout<<"平局";

                     break;

              }

       }

three:      shuchu(a);

       while(1)

       {

              while(1)

              {

                     cout<<"请玩家1输入下子的坐标"<<endl;

                     cin>>x>>y;

                     if(a[x][y]=='o'||a[x][y]=='x')

                            cout<<"此处已经有字,请重下"<<endl;

                     else

                     {

                            a[x][y]='o';

                            break;

                     }

              }

              shuchu(a);

           if(osheng(a))

              {

                     cout<<"玩家1胜";

                     break;

              }

             

              }

              shuchu(a);

           if(xsheng(a))

              {

                     cout<<"玩家2胜";

                     break;

              }

             

             

             

              if(he(a))

              {

                     cout<<"平局";

                     break;

              }

       }

             

      

}

三、感想体会

本实验是用C++来设计完成了五子棋游戏。在起初学习C++语言时我认为它就是在C语言基础上的延伸,一直用C语言的编程思想和设计理念来学习C++,这种错误的思想也让我在学习C++时走了不少的弯路,转变思想后我更认真的学习了C++语言的语法、程序结构、各类语句、函数格式和调用方式、作用域及存储类等内容。

在仅一遍学习的基础上来学习设计游戏程序让我遇到了第一个难题,就是对知识点的掌握不够扎实,在用C++语言所支持的面向对象程序设计方法的内容时让我很被动,尤其是类和对象的复制和运算、集成性和派生类、多态性和虚函数等内容。在这次做大作业时让我系统的复习了所学的知识,让我认识到利用类和对象可以将程序中很复杂和重复的内容省掉,同时可以将用以前所学语言设计的程序变的更简单。

当然在程序学习过程中遇到的一些复杂程序仅靠书本上的知识是不够解决的,因此通过在网上查找资料,跟同学交流心得过程中也学到了很多。在这次做大作业学习编写五子棋游戏的过程中让我领略到了C++语言的魅力和精髓,在以后的编程过程中会更熟练的运用C++语言,吸取了这次的经验后,在下次运用C++时会更全面的考虑问题,使用更正确的方法来解决问题,这次学习C++让我受益匪浅,最后感谢老师的悉心教导,老师辛苦了!

更多相关推荐:
五子棋-课程设计报告

五子棋-课程设计报告单位分院(系)专业学号学生姓名指导教师完成日期20xx年05月日摘要五子棋的历史:五子棋是一种两人对弈的纯策略型棋类游戏,是起源于中国古代的传统黑白棋种之一。发展于日本,流行于欧美。容易上手…

五子棋游戏 课程设计报告(含源代码可以运行)

五子棋游戏课程设计报告(含源代码可以运行)目录第一章需求分析.11.1总体分析.11.2初始化.11.3主循环控制模块.11.4玩家下子.11.5盘面分析填写棋型表.21.6对方下子.21.7胜负判断.2第二章…

C语言图形五子棋课程设计报告

北京师范大学C语言课程设计报告课题名称:游戏五子棋指导教师:课题组员:院系:信息科学与技术时间:20##.3.15-20##.4.20摘要五子棋是一种两人对弈的纯策略型棋类游戏,应用C语言编写程序可以在计算机上…

《C++语言程序设计》课程设计报告--五子棋

C语言程序设计课程设计报告课程题目年级专业学号姓名指导教师江苏师范大学数学与统计学院摘要五子棋是我国古代的传统的黑白棋种之一五子棋不仅能增强思维能力提高智力而且富含哲理有助于修身养性本游戏是以C语言作为开发工具...

20xx年C语言五子棋课程设计报告

本科控制软件设计课程设计题目五子棋学院计信院专业自动化年级学号姓名谯平同组人张健李益指导教师黄仁杰20xx年9月6日1目录1设计简介32设计模块3小组分工4流程图5设计过程6调试过程7分析与总结8源程序4445...

c++五子棋课程设计报告

福建农林大学计算机与信息学院课程设计报告课程名称课程设计题目姓名系专业年级学号指导教师职称面向对象程序设计课程设计五子棋计算机软件工程年月日福建农林大学计算机与信息学院计算机类课程设计报告结果评定2目录1设计目...

五子棋JAVA语言课程设计报告

封面Java语言程序设计课程设计报告分院电信分院班级电子商务1班姓名何芳林学号20xx0210460123指导教师吴军良课设时间20xx1220至20xx1231二O一一年十二月二十日10电商1班何芳林Java...

JAVA课程设计 五子棋

攀枝花学院课程业设计五子棋学生姓名学号所在院系数学院计算机学院专业信息与计算科学指导教师讲师二一四年六月攀枝花学院教务处制攀枝花学院Java课程设计攀枝花学院本科学生课程设计任务书注任务书由指导教师填写攀枝花学...

五子棋程序设计报告

宜宾学院面向对象课程设计学院计算机与信息工程学院班级20xx级6班学生姓名郑亮学号141106020设计地点单位宜宾学院设计题目双人五子棋完成日期20xx年12月5日目录1问题要求及任务描述411题目要求412...

五子棋游戏程序设计报告

计算机学院网络工程专业程序设计综合课程设计报告20xx20xx学年第一学期学生姓名学生班级学生学号指导教师20xx年12月30日双人五子棋目录第一章课程设计目的和要求111课程设计的目的112课程设计的要求1第...

C语言五子棋源代码 - 课程设计报告

计算机程序设计基础C语言课程设计题目简易五子棋软件设计院系部信息工程学院姓名张卓班级自103学号10072820xx年7月5日北京目录1课程设计报告311课题描述312需求分析313概要设计4131功能模块41...

基于java程序的五子棋游戏设计 开题报告

陕西科技大学镐京学院毕业设计论文任务书系专业班级学生题目基于JAVA程序的五子棋游戏设计毕业设计论文从20xx年3月20日起到20xx年6月25日课题的意义及培养目标课题意义随着社会经济的迅速发展人们生活水平有...

五子棋课程设计报告(33篇)