数独游戏的设计与开发【毕业论文】 (2).doc

上传人:文初 文档编号:3524713 上传时间:2019-06-02 格式:DOC 页数:17 大小:243KB
下载 相关 举报
数独游戏的设计与开发【毕业论文】 (2).doc_第1页
第1页 / 共17页
数独游戏的设计与开发【毕业论文】 (2).doc_第2页
第2页 / 共17页
数独游戏的设计与开发【毕业论文】 (2).doc_第3页
第3页 / 共17页
数独游戏的设计与开发【毕业论文】 (2).doc_第4页
第4页 / 共17页
数独游戏的设计与开发【毕业论文】 (2).doc_第5页
第5页 / 共17页
点击查看更多>>
资源描述

1、1本科毕业论文(20 届)数独游戏的设计与开发所在学院专业班级 软件工程学生姓名指导教师完成日期2摘要本文介绍了利用 C+语言编写数独游戏的方法。游戏的开发设计使用了 vs2010作为开发工具,根据数独游戏特有的规则特点对游戏进行设计。并且游戏在开发的过程中使用了微软的 MFC开源框架,在数独游戏的界面上做了一定的处理。本文首先对游戏进行了简单的介绍,对游戏的计算机实现进行分析。最后通过部分游戏截图和数据表格来介绍了游戏的开发设计过程和游戏的基本操作。并根据软件工程的方法,从需求分析、概要设计、详细设计、编码实现等方面阐述了游戏的开发流程,并通过游戏界面的截图、数据表格等体现了我的设计思路。关

2、键字:数独 C+ MFC 毕业设计3TAbstractThis paper describes the use of C + + method number written language alone game. Game development and design using vs2010 as a development tool, according to the Sudoku rules specific to the characteristics of the game design. And the game uses Microsofts MFC source framew

3、ork development process, in Sudoku interface to do some processing. This paper first gives a brief introduction to the game, the games computer-implemented analysis. Finally, some games screenshots and data tables to introduce the basic operation of the game development and game design process. And

4、in accordance with the method of software engineering, from requirements analysis, aspects of the outline design, detailed design, coding realization expounded the game development process, and through screenshots game interface, data tables, etc. embodies my design ideas.Keywords: Sudoku C+ MFC gra

5、duation4目录1 引言.11.1 简介.11.2 数独的起源.11.3 数独的发展.12 开发环境及开发工具.22.1 C+语言简介.22.2 MFC语言简介.23.系统的需求分析.23.1现行系统概况描述.,23.2需求分析.24.系统开发可行性分析.25.系统分析.26.系统设计.36.1设计思路.36.2系统主要类设计.36.2.1 GamePad类.36.2.2 SudokuDlg类.46.2.3 Sudokugame类.57.系统主要技术特色.118.结论.119.参考文献.1210.致谢.1211.引言1.1 简介数独游戏是一种源自 18世纪末的瑞士,后在美国发展、并在日本得

6、以发扬光大的数学智力拼图游戏。拼图是九宫格(即 3格宽3 格高)的正方形状,每一格又细分为一个九宫格。在每一个小九宫格中,分别填上 1至 9的数字,让整个大九宫格每一列、每一行的数字都不重复。 数独的玩法逻辑简单,数字排列方式千变万化。不少教育者认为数独是锻炼脑筋的好方法。图 1.11.2 数独的起源数独前身为“九宫格” ,最早起源于中国。数千年前,我们的祖先就发明了洛书,其特点较之现在的数独更为复杂,要求纵向、横向、斜向上的三个数字之和等于 15,而非简单的九个数字不能重复。儒家典籍易经中的“九宫图”也源于此,故称“洛书九宫图” 。而“九宫”之名也因易经在中华文化发展史上的重要地位而保存、沿

7、用至今。1783年,瑞士数学家莱昂哈德欧拉发明了一种当时称作“拉丁方块” (Latin Square)的游戏,这个游戏是一个 nn的数字方阵,每一行和每一列都是由不重复的 n个数字或者字母组成的。19世纪 70年代,美国的一家数学逻辑游戏杂志戴尔铅笔字谜和词语游戏 (Dell Puzzle Mgzines)开始刊登现在称为“数独 ”的这种游戏,当时人们称之为“数字拼图” (Number Place) ,在这个时候,99 的 81格数字游戏才开始成型。1.3 数独的发展1984年 4月,在日本游戏杂志字谜通讯 Nikoil (通信 )上出现了“数独”游戏,提出了“独立的数字”的概念,意思就是“这

8、个数字只能出现一次”或者“这个数字必须是惟一的” ,并将这个游戏命名为“数独” (sudoku) 。一位前任香港高等法院的新西兰籍法官高乐德(Wayne Gould)在 1997年 3月到日本东京旅游时,无意中发现了。他首先在英国的泰晤士报上发表,不久其他报纸也发表,很快便风靡全英国,之后他用了 6年时间编写了电脑程式,并将它放在网站上,使这个游戏很快在全世界流行。从此,这个游戏开始风靡全球。后来更因数独的流行衍生了许2多类似的数学智力拼图游戏,例如:数和、杀手数独。2.开发工具及环境2.1 C+语言简介C+语言是一种优秀的面向对象程序设计语言,它在 C语言的基础上发展而来,但它比 C语言更容

9、易为人们学习和掌握。C+以其独特的语言机制在计算机科学的各个领域中得到了广泛的应用。面向对象的设计思想是在原来结构化程序设计方法基础上的一个质的飞跃,C+完美地体现了面向对象的各种特性。2.2 MFC 简介MFC,微软基础类(Microsoft Foundation Classes),实际上是微软提供的,用于在 C+环境下编写应用程序的一个框架和引擎。MFC 是 Win API与 C+的结合,API,即微软提供的 WinDOS下应用程序的编程语言接口,是一种软件编程的规范,但不是一种程序开发语言本身,可以允许用户使用各种各样的第三方的编程语言来进行对 WinDOS下应用程序的开发,使这些被开发

10、出来的应用程序能在 WinDOS下运行。3.系统需求分析3.1 现行系统概况描述同类似的填字游戏不同,数独受欢迎的原因之一是它既不需要丰富的百科知识,也不要掌握大量的词汇,这使其能迅速为孩子和初学者所接受。根据游戏开始时的方格中已有的数字和位置,数独难易程度不同,有些复杂的甚至令数学家也不能完成。现在在各个系统平台上都有数独游戏的开发,且用户十分庞大3.2 需求分析“数独” ,即“独立的数字”的简称,游戏在一个 9*9的方格中,有 81个小方格组成,然后又分成 9个大块,每块由 3*3组成,就是九宫格,大九宫格里边再嵌套 9个小的九宫格,游戏开始前会有一些格子上写好了数字,你需要在剩下的格子里

11、面填写数字,直到把所有的鸽子填满,并且要求最后任何一行或者一列或者一个小九宫格中都不存在相同的数字。4.系统开发可行性分析据著名的动游戏开发商 Astraware Ltd.预计,移动数独游戏的版本多达几十种,Palm和 Windows Mobile设备版本的数独游戏就各有 20种左右。Sudokumo 推出的移动数3独游戏,能够下载到大多数手机中。这家位于英国的游戏软件公司表示,已经在全球卖出了 7500套数独游戏,而且来自用户的兴趣还在增加。因此,一个好的数独游戏的开发,可以吸引很多潜在的玩家。5.系统分析利用 C+语言的面向对象特性,把生产游戏数据的程序封装成一个类,在玩游戏时,只要根据数

12、独游戏的逻辑性来编写,先得到一个完整的数独,然后根据难度需要,随机的挖一些空格出来。便可以得到唯一解的数独。终盘数量数独中的数字排列千变万化,那么究竟有多少种终盘的数字组合呢?共有6,670,903,752,021,072,936,960(约有 6.6710的 21次方)种组合,2005 年由Bertram Felgenhauer和 Frazer Jarvis计算出该数字,并将计算方法发布在他们网站上,如果将等价终盘(如旋转、翻转、行行对换,数字对换等变形)不计算,则有5,472,730,538个组合。数独终盘的组合数量都如此惊人,那么数独题目数量就更加不计其数了,因为每个数独终盘又可以制作出

13、无数道合格的数独题目。 按照这个数量,如果我们将一个1,2,3,4,5,6,7,8,9的数组随机化,然后将其作为一行数据添加到一个二维数组中去,该行能满足数独终盘规则的概率是很大的。 基于这个假设(假设的有效性会在文章后面验证),我的算法思想如下: 1. 写一个方法用于获取一个由 1到 9九个数随机排列的一维数组。2. 将获取到的 1到 9的随机数的一维数组放入九宫格中,每一个随机数的列坐标循环采用 1到 9,行坐标使用 1到 9的随机数,从而使步骤一中产生的随机数随机分布在九宫格中每一列中。3. 循环寻找出当前九宫格中所有空白格中的右下角的一个空格。4. 写一个算法找出某一个单元格中可以填入

14、的数字的数组。5. 在所有空白格中的最右下角的空白格中填入可能存在的数字,以此数据为新的游戏数据,接着循环寻找当前数据中空白格中的最右下角的空白格,填入当前空白格中可能存在的内容。6. 递归寻找,若最后每一个空白格中都有可以填入的数字,则游戏终盘生产成功,否则往回递归,填入可能存在数字数组中的第二个数组,循环递归,若仍然没有终盘生产,则生产游戏失败。7. 根据玩具设置的游戏难度,在生产的终盘游戏中随机挖取一定的空数据,空格越多,则游戏难度越大。8. 游戏生产完毕以后,玩家开始填数字开始游戏,当玩家填写完成,则开始进行游戏是否完成的判断,在判断过程中,只需要判断当前空格中的数字是否与同行,同列和

15、同小九宫格中的数字是否相同即可,若所有的单元格都判断成功,则玩家成功完成游戏。6.系统设计6.1 设计思路先得到一个完整的数独,然后根据难度需要,随机地挖取一些空格出来,然后判断是否符合条件(游戏规则) ,循环再输出。6.2 系统主要类设计4游戏框架基于 MFC的对话框,在一个对话框中显示九宫格和一些功能性按钮,该程序主要包含 GamePad类, sudokuDlg 类和 SudokuGame 类。6.2.1 GamePad 类该类主要对数独游戏的九宫格进行记录和操作。九宫格的状态一共分为 5种:enum CellType ORIGINAL_CELL = 0, /原始数据单元格EDIT_CEL

16、L, /可编辑单元格ERROR_CELL, /输入错误单元格CLICK_CELL, /单机单元格PROMPT_CELL /提示输入单元格;可编辑的单元格在每次点击两次之后会变成可编辑状态,玩家可通过键盘先单元格中输入数字,提示单元格在玩家开启提示功能之后,会在单元格的最下方显示该单元格中可输入的数字。该类中记录了九宫格操作需要的一些数据,具体包括:CSudokuGame m_sudo; /数独游戏数据对象int m_x; /鼠标点击 x坐标int m_y; /鼠标点击 y坐标int m_row; /选择行int m_col; /选择列CRect m_rect99; /保存各个小方格坐标bool

17、 m_bCorrect99; /保存各个小方块的输入状态:输入正确或者输入错误CString m_proStr2; /保存提示字符串CRect m_proRect2; /保存显示提示符的坐标int m_key; /键盘输入int m_nClick; /记录单机次数:单机两次为输入BOOL m_bPrompt; /是否显示提示同时,该类中记录了九宫格操作的一些方法,具体包括:Bool GetRowCol(const CPoint point); /获取鼠标单机单元格的行号和列号bool GetRowCol(int /外部进程获取鼠标单机单元格的行号和列号bool GetPromptStrRect

18、(const int row, const int col); /获取提示符输入void DrawCell(const int row, const int col, const int invalue, const int type); /绘制单元格void Initialize(); / 单元格的初始化void MarkErrorCell(); /标记输入错误的单元格5void ShowTheComputeResult(const vector /显示游戏自动完成的结果在该类中,通过以上的变量和方法,对游戏界面的九宫格的状态进行操作。6.2.2 SudokuDlg 类该类主要对数独游戏的整

19、个运行逻辑进行控制,是整个对话框的控制类,在整个对话框中除了九宫格之外,还有 8个按钮,分别是“载入游戏” , “选择游戏文件” , “退出游戏” , “保存游戏文件” , “完成游戏” , “保存正确结果” , “自动计算数独结果”和“随机生成新游戏数据” ,同时,还有一个复选框按钮,玩家可以通过打开此开关显示输入提示。该类通过消息映射机制,分别对每一个按钮做了相应的功能性处理,主要包括以下功能:void CSudokuDlg:OnBnClickedLoadgame()/加载原始游戏数据文件void CSudokuDlg:OnBnClickedChoose()/选择游戏数据文件进行游戏voi

20、d CSudokuDlg:OnBnClickedNew()/生产新的游戏数据void CSudokuDlg:OnBnClickedSave()/保存新生产的游戏数据UINT Computing(LPVOID lpParam)/多线程计算数据结果void CSudokuDlg:OnBnClickedCompute()/自动计算数据结果6.2.3 Sudokugame 类该类是数独游戏的规则控制类,主要用于控制游戏数据的生成,计算,判断游戏成功失败等等。主要包括以下的变量和函数:int m_data99; /保存原始游戏数据int m_user99; /保存用户输入数据int m_bCompute

21、; /判断用户是否终止自动计算bool m_bExit; /标志线程是否终止退出void Initialize(); /初始化bool CheckInput(const int row, const int col, const int input); /判断输入的某个数据是否有效bool CheckCell(const int row, const int col); /判断某一个单元格是否有错bool CheckOriginalData(); /检查原始数据的合法性int GetInputNum(const int row, const int col, vector /获取某个单元格所有

22、可输入的整数bool CheckTheResult(); /判断用户最终是否完成了游戏6bool ComputeResult(vector /自动计算数独结果bool CallRecurrence(int *data, int count, vector /递归计算bool CallRecurrence(int *data, int count, int *result); /递归计算,用于生产数独数据的中间计算过程void CreateSudokuData(); /自动随机生产数据游戏数据void CopyToUser(); /将原始数据拷贝到用户数据生产游戏数据代码:思路分析:首先,确定一

23、个 9*9的正方形盘。第一行:取 19个数字,然后把数字打乱放好到每一行每个格子里面。第二行开始:(因为有了第一行的限制,所以第二行开始就不能乱填了) 。这时可以建立一个函数专门用来填数字,从第一列开始到第 9列结束。函数的实现过程基本是这样的:首先生产一个 1到 9的随机数,这时候判断跟同一行前面填了的有没有重复的,重复的重来,还要再判断跟同一列的舔的数据有没有重复的,重复的从来,总有一个会适合的。/递归计算,用于生产数独数据的中间计算过程bool CSudokuGame:CallRecurrence(int *data, int count, int *result)int a99;memcpy(a, data, sizeof(a);if ( count = 81 )memcpy(result, a, sizeof(a);return true;unsigned int num = 10;int row = 0, col = 0;vector mayInput;for ( int i = 0; i integer;memcpy(m_user, a, sizeof(m_user);GetInputNum(i, j, integer);if ( integer.empty() ) return false;if ( num integer.size() )

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文资料库 > 毕业论文

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。