ImageVerifierCode 换一换
格式:DOCX , 页数:37 ,大小:579.88KB ,
资源ID:4063079      下载积分:12 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/4063079.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(数独游戏设计论文.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

数独游戏设计论文.docx

1、数独游戏设计论文XXXXXX大学信息工程学院C+面向对象实习报告题 目: 数独游戏的设计与实现 学 号0000000000姓 名XXX专业班级计算机科学与技术XX班指导教师XXX实践日期XXXXXXX一、综合训练目的与要求1.综合训练目的:1)能够熟练运用CodeBlocks编译和调试程序。2)以实习来强化C+知识,熟练运用C+。3)学习QT编程,了解QT中各个类以及函数,并利用QT为数独游戏进行界面设计2.综合训练要求:1)按时到达实习机房,不迟到,不早退。2)在实习之前,做好实习计划,合理安排时间。3)在编程和界面设计时要尽量的专注和细心,再设计算法时要考虑周全。二、综合训练任务1.设计算

2、法自动随机生成不完整数独,并且设计算法求解,从而完成数独游戏的设计与实现。2.编译并调试程序,利用QT设计界面,完善各个功能。三、总体设计1.主菜单:主菜单中主要设计了开始游戏,游戏提示,查看答案,游戏技巧,游戏说明及退出游戏等工具条。2.游戏界面:游戏界面分为游戏区和功能区。游戏区主要是有一个99的宫格组成,玩家可以在每个宫格中输入数字。功能区主要包括游戏难度选择,提示,重玩,答案,确认及退出按钮。可实现相应的功能。四、详细设计说明1.主菜单中各个功能的详细介绍:(1)进入游戏含义:进入游戏会提供四个不同的难度进行游戏,分别是简单,一般,困难,特难四个等级。代码实现如下:operaMenu=

3、new QMenu(tr(菜单(&O),this); ui-menuBar-addMenu(operaMenu); startMenu=new QMenu(tr(开始游戏(&Q),this);operaMenu-addMenu(startMenu);而这四个难度分别由SudokuClear1(),SudokuClear2(),SudokuClear3(),SudokuClear4()来控制的。(2)重玩本局含义:玩家可以通过此操作来清除自己填过的数字,重新开始本局游戏。本操作主要通过SudokuReplay()函数来实现清除操作。(3)答案提示含义:玩家可通过此操作来获取一个空位的正确填法,也

4、可以纠正玩家填错的数字。提示操作是由SudokuHint()函数实现。(4)查看答案含义:此功能的本质是数独的自动求解,玩家可通过此操作来查看数独的正确答案。本操作由SudokuRun()来实现的。(5)游戏技巧含义:在游戏技巧中,主要是为玩家提供求解数独的几种方法,便于求解数独。(6)关于含义:对数独游戏的基本介绍,包括其版本信息及游戏来历等。(7)退出游戏含义:退出系统,close()函数实现。2.游戏界面各个功能详细介绍:(1)游戏区含义和内容:游戏界面是实现玩家直接与计算机交流的地方。对于游戏区我采用的是81个可编辑的文本框按99的顺序排列方式来形成数独显示的界面。而程序内部采用一个二

5、维数组与81个文本框相对应进行操作。游戏设置了简单,一般,困难和特难4个等级的难度。当玩家选择一个难度开始游戏时,系统内部会调用随机生成的不完整数独数组,然后将对应的数字显示在81个文本框内,如果遇到数组中的值为0的元素,那么对应的文本框将不显示数字并将此文本框的值标记为-1。遇到不为0值时文本框会将其显示出来,并使此文本框成为不可编辑的为文本框。同时,系统会对生成的数独进行求解,将答案储存在这个二维数组中。当玩家填完数独后,系统会对玩家所填好的数独与此数组中的值逐一对比若发现有不同的将提示玩家答 案错误,若完全相同则将提示玩家答案正确。玩家若想退出游戏直接点击相应的操作即可退出游戏。(2)函

6、数实现详见核心代码清单。(3)算法讲解1)数独自动随机生成算法:对于数独的随机生成,我采用的是将一个正确而完整的数独进行随机的变换得到新的数独然后对其进行随机的挖空。具体来说是将一个完整的数独,即二维数组matrix99当中的所有行或列中某两个数进行交换,然后将得到的数独记为map99,在对其进行随机的挖空,即可得到数独题目。此算法由函数:void SudokuSwap(int* number1,int* number2)和void SudokuGeneration(int degree)实现。2)数独求解算法;数独求解主要运用于数独的自动求解即给玩家提供数独正确的答案。具体来说是利用深度优先

7、搜索对每个空位进行19的填充,然后检测所填数字在所在行、列以及33的宫格中是否有与之相同的数字。若有,则函数返回0说明此数字错误,检测下一数字。若没有,则函数返回1,说明所填数字正确,此时对下以空格进行相同的操作。此算法对应函数bool DFS(int sum)。3),判断数独算法: 判断数独算法主要是用来判断玩家所完成的数独是否正确。该算法是先对原数独进行求解,得到正确答案map99。然后将玩家所完成的数独app99与之进行逐一对比。再次设置一个标记的变量a;若有appij!=mapij,则令a=1。检查完成后若有a=1则说明玩家答案错误。反之说明答案正确。 此算法对应函数为:void Su

8、dokuSure()。4)重玩算法:重玩算法主要是用来实现让玩家重新开始本局游戏的。该算法是将原先生成的不完成的数独记录在arr99中。当玩家需要重玩时,系统将arr99中的元素输出到宫格中覆盖掉玩家输入的数,此时玩家可以重新开始游戏。相应函数为:void SudokuReplay()。5)答案提示算法:此算法主要用于提示玩家下一个空位的正确填法或纠正玩家填错的地方。其具体实现过程是现将原数独求解出来记为map99,然后将玩家所填的数独记为app99,然后将两个数独进行逐一对比。若发现appij与mapij的值不同则将mapij的值输出到文本框,若玩家已经填过但错误那么将会被mapij所覆盖。

9、若没填过则将直接将mapij的值输出,然后跳出循环。即每次只提示一个空位或错位。此算法所调用函数为:void SudokuHint()。3.界面设计1)游戏区界面设计本游戏采用的是81个99的文本框组成。首先定义一个Block类。class Block :public QWidget Q_OBJECTpublic: Block(QWidget *parent=0); void changeColor(const QColor &color); int data(); QPoint getPos(); void setPos(const QPoint &p); void setPos(int x

10、,int y); void setValue(int a); void setEna(bool ok);private slots: void dataChange(const QString & data);private: QLineEdit *nubEidt; int da; QPoint p; 在这个类中包括文本框的的一些基本属性,包括文本框的位置,颜色,值等等。 文本框具体是通过MainWindow类里面的void createBlocks()函数来实现。 为了游戏的更好体验,再次定义了一个Gline类。Gline类是用来画线,画出六条纵横交错的线将81个小格分成9个33的格,可以让

11、玩家更好的判断某一个空格属于哪个33的格子。class GLine:public QWidgetpublic : GLine(QWidget *parent=0); void setPen(int penSize,const QColor & color); void draw(int z, int len); /z=0 H,z=1,Vprotected: void paintEvent(QPaintEvent *);private: int penSize; QColor penColor; int z; int len;2)功能区界面设计:功能区主要包括游戏菜单和按钮。菜单中包括对游戏的基

12、本操作以及对游戏的介绍。菜单:a)开始游戏开始游戏中分为四个难度的选择:简单,一般,困难,特难。这四个操作分别调用MainWindow中的槽函数:void SudokuClear1(),void SudokuClear2(),void SudokuClear3(),void SudokuClear4()。b)重玩本局调用MainWindow中的槽函数:void SudokuReplay()。c)答案提示调用MainWindow中的槽函数:void SudokuReplay()。d)查看答案调用MainWindow中的槽函数:void SudokuHint()。e)退出游戏调用close()函数

13、。 帮助:a)游戏技巧介绍游戏的几种基本解题方法,为玩家提供参考。调用函数: void SudokuSkill()b)关于对游戏基本介绍。调用函数:void SudokuAbout() 备注:为了游戏的更好体验我将菜单中的各个操作设置了相对应的按钮,其功能不变在次不作特别说明。五、调试与测试1.游戏界面展示图 1.1 游戏主界面2.帮助界面图 1.2 技巧介绍界面图 1.3 游戏介绍界面3.开始游戏界面图 1.4 开始游戏界面4.答案提示界面图 1.5 答案提示界面5.查看答案界面图 1.6 查看答案界面6.重玩界面图 1.7 重玩界面7.判断界面图 1.8 判断界面8.遇到的问题问题:当进入

14、系统后直接点击答案提示,重玩本局,查看答案时系统会崩溃。解决方法:设置一个标志mark变量,来标记玩家是否开始了一局游戏if(mark=0) QMessageBox:about(NULL,提示,tr(请先选择游戏难度); 六、实习日志(1)3月2日 选题今天主要进行选题,我们组选择了“数独游戏的设计与实现”。选题之后我查阅了有关数独的资料,由于玩过数独游戏所以就数独的原理来说还是不难理解的。主要在于如何设计算法来实现数独的生成与求解。虽说玩过游戏但是其中的各种设计我还是比较陌生,所以查阅了一些数独游戏设计方法。(2)3月3日 项目总体设计与模块划分 今天是对数独游戏进行总体的设计,大概分了三个

15、模块:数独的生成,数独的求解,游戏界面设计。我负责数独生成算法的代码编写,同伴负责求解算法。然后各自设计界面。(3)3月4日 设计具体算法由于我负责数独生成的算法,即生成一个不完整的数独提供给玩家使用。我大概的思路是先找一个正确而完整的数独,然后在随机交换其中的数,使之成为新的数独,在进行随机的挖空,便可形成不完整的数独(4)3月5日 撰写代码,中期检查由于基本算法已设计好了,今天的主要任务就是编写代码。在进行数独中数字交换时遇到了一点麻烦,好几次交换过后的数独都是错误或无解的。调试了很多次均出现同样的问题,于是不得不从头开始一步一步的检验,耗费了很多时间,好在最终解决了。老师检查后提了一些意

16、见,同时也给予了肯定。(5)3月6日 继续完善和调试今天我对自己写的代码进行了再一次的调试,再确认基本完善后与同伴进行了讨论。因为我们负责的部分不同,所以要进行连部分代码的无缝链接。在链接的过程中遇到了一些问题,最终我们各修改了自己的代码。经过几次调试终于可以运行。(6)3月9日 界面总体设计数独算法已经设计完成,所以今天的任务便是设计游戏的界面,大概分为游戏区和功能区。我初步给这游戏设计了几个简单的功能:开始游戏,难度选择,提示以及查看答案等等。在菜单上设计了几个对应的工具条,又在功能区设计了几个按钮。下午的时候开始进行QT编程,对所设计的各个功能进行实现。首先是将各个操作对应的函数写出来,

17、然后将各个幸好与槽进行链接。放学时,基本的都实现了,但有待完善。(7)3月10日 完善代码,准备论文今天我是将昨天的QT代码进行了完善对界面进行了美化,虽然我设计的游戏有些方面不够完善,但是由于实习的时间紧迫,无法做到面面俱到。下午的时候我就开始准备论文资料,将这几天所做的东西进行了整理和总结。(8)3月11日 撰写实习报告。由于实习论文比较重要,所以我打算今天用一整天的时间来撰写论文。所以今天基本所有时间都在写论文。(9)3月12日 完善论文,制作答辩PPT今天将论文完善了一遍,将其中的错误进行了纠正。由于明天就要进行实习答辩,所以剩下的时间都用来制作答辩PPT了。(10)3月13日 实习答

18、辩今天是实习的最后一天,同时也要进行实习答辩。整个上午我将答辩的资整理了一下,下午进行了答辩。七、实习总结通过此次C+面向对象编程的实习,我学到了许多东西。首先经过一个寒假的休整,由于过年的原因没有时间巩固C+知识,然而这次实习就给我提供了一个很好的机会。在实习过程中不断地运用上学期学的C+知识,使我对其中的一些以前难以消化的东西有了新的理解。而且编程过程中也找到了以规范化的东西,老师也说规范对于程序员来说是至关重要的。而在实习中我也得到了一些提升,虽然说不上标准,但最起码比以前有了进步。这次实习的另一个较大的收获就是,我认识到了如何利用QT进行界面设计。老师也讲了一些关于界面设计的知识,由于

19、时间紧迫无法讲透彻,只是做了大概的介绍。我在用QT做界面设计的时候遇到了不少问题,只得自己查阅资料了解QT里的各种函数。由于时间有限没法对QT进行升入的研究,所以游戏的界面做的可能还有很多缺陷。但是这次界面设计让我认识到了QT的强大,我想在以后的学习中慢慢的了解它,争取做出美观的界面。总而言之,这次课程设计对于我学习有很大的促进作用,这样的实习很有意思,同时也很有意义。八、附录:核心代码清单1.主界面及个菜单的建立MainWindow类:#ifndef MAINWINDOW_H#define MAINWINDOW_H#include #include #include #include #in

20、clude #include #include #include #include #include #include #include #include #include block.h#include gline.hnamespace Ui class MainWindow;class MainWindow : public QMainWindow Q_OBJECTpublic: explicit MainWindow(QWidget *parent = 0); MainWindow();private slots: void SudokuRun(); void SudokuClear1(

21、); void SudokuClear2(); void SudokuClear3(); void SudokuClear4(); void SudokuAbout(); void SudokuHint(); void SudokuSkill(); void SudokuReplay(); void SudokuSure();private: void drawLine(); void createBlocks(); void createAction_Menu(); bool DFS(int sum); void Init(); bool Cmps(int i,int j,int k); b

22、ool Cmp1(); void SudokuSwap(int* number1,int* number2); void SudokuGeneration(int degree);private: Ui:MainWindow *ui; enumMax=9; Block *blocksMaxMax; QFrame *frame; QMenu *startMenu; QMenu *operaMenu; QMenu *helpMenu; QAction *easyAction; QAction *normalAction; QAction *hardAction; QAction *difficul

23、tAction; QAction *replayAction; QAction *clearAction; QAction *runAction; QAction *quitAction; QAction *aboutAction; QAction *hintAction; QAction *skillAction; QAction *degreeAction; QPushButton *easyButton; QPushButton *normalButton; QPushButton *hardButton; QPushButton *difficultButton; QPushButto

24、n *hintButton; QPushButton *replayButton; QPushButton *runButton; QPushButton *quitButton; QPushButton *sureButton; int map99; int arr99; int mark; int fw99,fh99,fs559;#endif创建窗口:MainWindow:MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui:MainWindow) mark=0; ui-setupUi(this); createActio

25、n_Menu(); frame=new QFrame(this); createBlocks(); drawLine(); this-setFixedSize(700,500); frame-move(0,25); this-setWindowIcon(QIcon(:/icon/icon2.png); this-setWindowTitle(数独); QPalette palette(this-palette(); palette.setColor(QPalette:Background, Qt:green); this-setPalette(palette);创建99的文本框:void Ma

26、inWindow:createBlocks()/创建文本框 for(int i=0;iMax;i+) for(int j=0;jsetPos(i,j); blocksij-move(j*50,i*50); blocksij-setEna(false); int w=(50)*9+1; frame-setMinimumSize(w,w);void MainWindow:drawLine()/绘制线条 GLine *line_H4; QColor color; QRgb rgb=qRgb(255,0,0); color.setRgb(rgb); for(int i=0;isetPen(3,colo

27、r); line_Hi-draw(1,frame-height(); if(i0) line_Hi-move(blocks0i*3+1-pos().x()+blocks0i*3+1-width()-2,0); else line_Hi-move(0,0); GLine *line_V4; for(int i=0;isetPen(3,color); line_Vi-draw(0,frame-width(); if(i0) line_Vi-move(0,blocksi*3-10-pos().y()+blocksi*3-10-height()+ui-menuBar-height()-2); else

28、 line_Vi-move(0,0); 创建菜单及按钮:void MainWindow:createAction_Menu()/菜单 operaMenu=new QMenu(tr(菜单(&O),this); ui-menuBar-addMenu(operaMenu); startMenu=new QMenu(tr(开始游戏(&Q),this); operaMenu-addMenu(startMenu); easyAction=new QAction(tr(简单),this); easyAction-setShortcut(tr(ctrl+e); easyAction-setStatusTip(数独较简单); connect(easyAction,SIGNAL(triggered(),this,SLOT(SudokuClear1(); startMenu-addAction(easyAction); normalAction=new QAction(tr(一般),this); normalAction-setShortcut(tr(ctrl+n); normalAction-setStatusTip(数独较一般); connect(normalAction,SIGNAL(trigger

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

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