版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 本科畢業(yè)論文</b></p><p><b> ?。?0 屆)</b></p><p> 數(shù)獨(dú)游戲的設(shè)計(jì)與開(kāi)發(fā)</p><p><b> 摘要</b></p><p> 本文介紹了利用C++語(yǔ)言編寫(xiě)數(shù)獨(dú)游戲的方法。游戲的開(kāi)發(fā)設(shè)計(jì)使用了vs2
2、010作為開(kāi)發(fā)工具,根據(jù)數(shù)獨(dú)游戲特有的規(guī)則特點(diǎn)對(duì)游戲進(jìn)行設(shè)計(jì)。并且游戲在開(kāi)發(fā)的過(guò)程中使用了微軟的MFC開(kāi)源框架,在數(shù)獨(dú)游戲的界面上做了一定的處理。本文首先對(duì)游戲進(jìn)行了簡(jiǎn)單的介紹,對(duì)游戲的計(jì)算機(jī)實(shí)現(xiàn)進(jìn)行分析。最后通過(guò)部分游戲截圖和數(shù)據(jù)表格來(lái)介紹了游戲的開(kāi)發(fā)設(shè)計(jì)過(guò)程和游戲的基本操作。并根據(jù)軟件工程的方法,從需求分析、概要設(shè)計(jì)、詳細(xì)設(shè)計(jì)、編碼實(shí)現(xiàn)等方面闡述了游戲的開(kāi)發(fā)流程,并通過(guò)游戲界面的截圖、數(shù)據(jù)表格等體現(xiàn)了我的設(shè)計(jì)思路。</p>
3、;<p> 關(guān)鍵字:數(shù)獨(dú) C++ MFC 畢業(yè)設(shè)計(jì)</p><p><b> TAbstract</b></p><p> This paper describes the use of C + + method number written language alone game. Game development and design usin
4、g vs2010 as a development tool, according to the Sudoku rules specific to the characteristics of the game design. And the game uses Microsoft's MFC source framework development process, in Sudoku interface to do some
5、 processing. This paper first gives a brief introduction to the game, the game's computer-implemented analysis. Finally, some games screenshots and data tables to introduc</p><p> Keywords: Sudoku C++
6、 MFC graduation</p><p><b> 目錄</b></p><p> 1 引言.................................................................1</p><p> 1.1 簡(jiǎn)介......................................
7、......................1</p><p> 1.2 數(shù)獨(dú)的起源.....................................................1</p><p> 1.3 數(shù)獨(dú)的發(fā)展.....................................................1</p><p> 2
8、開(kāi)發(fā)環(huán)境及開(kāi)發(fā)工具...................................................2</p><p> 2.1 C++語(yǔ)言簡(jiǎn)介....................................................2</p><p> 2.2 MFC語(yǔ)言簡(jiǎn)介......................................
9、..............2</p><p> 3.系統(tǒng)的需求分析.......................................................2</p><p> 3.1現(xiàn)行系統(tǒng)概況描述...............................................,2</p><p> 3.2需求分析....
10、....................................................2</p><p> 系統(tǒng)開(kāi)發(fā)可行性分析...................................................2</p><p> 系統(tǒng)分析........................................................
11、.....2</p><p> 6.系統(tǒng)設(shè)計(jì).............................................................3</p><p> 6.1設(shè)計(jì)思路........................................................3</p><p> 6.2系統(tǒng)主要類(lèi)設(shè)計(jì)...
12、...............................................3</p><p> 6.2.1 GamePad類(lèi).................................................3</p><p> 6.2.2 SudokuDlg類(lèi)..............................................
13、.4</p><p> 6.2.3 Sudokugame類(lèi)..............................................5</p><p> 7.系統(tǒng)主要技術(shù)特色.....................................................11</p><p> 8.結(jié)論................
14、.................................................11</p><p> 9.參考文獻(xiàn).............................................................12</p><p> 10.致謝.................................................
15、...............12</p><p><b> 1.引言</b></p><p><b> 1.1簡(jiǎn)介</b></p><p> 數(shù)獨(dú)游戲是一種源自18世紀(jì)末的瑞士,后在美國(guó)發(fā)展、并在日本得以發(fā)揚(yáng)光大的數(shù)學(xué)智力拼圖游戲。拼圖是九宮格(即3格寬×3格高)的正方形狀,每一格又細(xì)分為一個(gè)九宮格。在每
16、一個(gè)小九宮格中,分別填上1至9的數(shù)字,讓整個(gè)大九宮格每一列、每一行的數(shù)字都不重復(fù)。 數(shù)獨(dú)的玩法邏輯簡(jiǎn)單,數(shù)字排列方式千變?nèi)f化。不少教育者認(rèn)為數(shù)獨(dú)是鍛煉腦筋的好方法。</p><p><b> 圖1.1</b></p><p><b> 1.2數(shù)獨(dú)的起源</b></p><p> 數(shù)獨(dú)前身為“九宮格”,最早起源于中國(guó)。
17、數(shù)千年前,我們的祖先就發(fā)明了洛書(shū),其特點(diǎn)較之現(xiàn)在的數(shù)獨(dú)更為復(fù)雜,要求縱向、橫向、斜向上的三個(gè)數(shù)字之和等于15,而非簡(jiǎn)單的九個(gè)數(shù)字不能重復(fù)。儒家典籍《易經(jīng)》中的“九宮圖”也源于此,故稱(chēng)“洛書(shū)九宮圖”。而“九宮”之名也因《易經(jīng)》在中華文化發(fā)展史上的重要地位而保存、沿用至今。</p><p> 1783年,瑞士數(shù)學(xué)家萊昂哈德·歐拉發(fā)明了一種當(dāng)時(shí)稱(chēng)作“拉丁方塊”(Latin Square)的游戲,這個(gè)游戲是一
18、個(gè)n×n的數(shù)字方陣,每一行和每一列都是由不重復(fù)的n個(gè)數(shù)字或者字母組成的。</p><p> 19世紀(jì)70年代,美國(guó)的一家數(shù)學(xué)邏輯游戲雜志《戴爾鉛筆字謎和詞語(yǔ)游戲》(Dell Puzzle Mαgαzines)開(kāi)始刊登現(xiàn)在稱(chēng)為“數(shù)獨(dú)”的這種游戲,當(dāng)時(shí)人們稱(chēng)之為“數(shù)字拼圖”(Number Place),在這個(gè)時(shí)候,9×9的81格數(shù)字游戲才開(kāi)始成型。</p><p><
19、;b> 1.3數(shù)獨(dú)的發(fā)展</b></p><p> 1984年4月,在日本游戲雜志《字謎通訊Nikoil》(《パズル通信ニコリ》)上出現(xiàn)了“數(shù)獨(dú)”游戲,提出了“獨(dú)立的數(shù)字”的概念,意思就是“這個(gè)數(shù)字只能出現(xiàn)一次”或者“這個(gè)數(shù)字必須是惟一的”,并將這個(gè)游戲命名為“數(shù)獨(dú)”(sudoku)。一位前任香港高等法院的新西蘭籍法官高樂(lè)德(Wayne Gould)在1997年3月到日本東京旅游時(shí),無(wú)意中
20、發(fā)現(xiàn)了。他首先在英國(guó)的《泰晤士報(bào)》上發(fā)表,不久其他報(bào)紙也發(fā)表,很快便風(fēng)靡全英國(guó),之后他用了6年時(shí)間編寫(xiě)了電腦程式,并將它放在網(wǎng)站上,使這個(gè)游戲很快在全世界流行。從此,這個(gè)游戲開(kāi)始風(fēng)靡全球。后來(lái)更因數(shù)獨(dú)的流行衍生了許多類(lèi)似的數(shù)學(xué)智力拼圖游戲,例如:數(shù)和、殺手?jǐn)?shù)獨(dú)。</p><p><b> 2.開(kāi)發(fā)工具及環(huán)境</b></p><p> 2.1 C++語(yǔ)言簡(jiǎn)介<
21、/p><p> C++語(yǔ)言是一種優(yōu)秀的面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言,它在C語(yǔ)言的基礎(chǔ)上發(fā)展而來(lái),但它比C語(yǔ)言更容易為人們學(xué)習(xí)和掌握。</p><p> C++以其獨(dú)特的語(yǔ)言機(jī)制在計(jì)算機(jī)科學(xué)的各個(gè)領(lǐng)域中得到了廣泛的應(yīng)用。面向?qū)ο蟮脑O(shè)計(jì)思想是在原來(lái)結(jié)構(gòu)化程序設(shè)計(jì)方法基礎(chǔ)上的一個(gè)質(zhì)的飛躍,C++完美地體現(xiàn)了面向?qū)ο蟮母鞣N特性。</p><p><b> 2.2 MFC
22、簡(jiǎn)介</b></p><p> MFC,微軟基礎(chǔ)類(lèi)(Microsoft Foundation Classes),實(shí)際上是微軟提供的,用于在C++環(huán)境下編寫(xiě)應(yīng)用程序的一個(gè)框架和引擎。MFC是Win API與C++的結(jié)合,API,即微軟提供的WinDOS下應(yīng)用程序的編程語(yǔ)言接口,是一種軟件編程的規(guī)范,但不是一種程序開(kāi)發(fā)語(yǔ)言本身,可以允許用戶(hù)使用各種各樣的第三方的編程語(yǔ)言來(lái)進(jìn)行對(duì)WinDOS下應(yīng)用程序的開(kāi)
23、發(fā),使這些被開(kāi)發(fā)出來(lái)的應(yīng)用程序能在WinDOS下運(yùn)行。</p><p><b> 3.系統(tǒng)需求分析</b></p><p> 3.1現(xiàn)行系統(tǒng)概況描述</p><p> 同類(lèi)似的填字游戲不同,數(shù)獨(dú)受歡迎的原因之一是它既不需要豐富的百科知識(shí),也不要掌握大量的詞匯,這使其能迅速為孩子和初學(xué)者所接受。根據(jù)游戲開(kāi)始時(shí)的方格中已有的數(shù)字和位置,數(shù)獨(dú)難
24、易程度不同,有些復(fù)雜的甚至令數(shù)學(xué)家也不能完成。現(xiàn)在在各個(gè)系統(tǒng)平臺(tái)上都有數(shù)獨(dú)游戲的開(kāi)發(fā),且用戶(hù)十分龐大</p><p><b> 3.2需求分析</b></p><p> “數(shù)獨(dú)”,即“獨(dú)立的數(shù)字”的簡(jiǎn)稱(chēng),游戲在一個(gè)9*9的方格中,有81個(gè)小方格組成,然后又分成9個(gè)大塊,每塊由3*3組成,就是九宮格,大九宮格里邊再嵌套9個(gè)小的九宮格,游戲開(kāi)始前會(huì)有一些格子上寫(xiě)好了數(shù)
25、字,你需要在剩下的格子里面填寫(xiě)數(shù)字,直到把所有的鴿子填滿(mǎn),并且要求最后任何一行或者一列或者一個(gè)小九宮格中都不存在相同的數(shù)字。</p><p><b> 系統(tǒng)開(kāi)發(fā)可行性分析</b></p><p> 據(jù)著名的動(dòng)游戲開(kāi)發(fā)商Astraware Ltd.預(yù)計(jì),移動(dòng)數(shù)獨(dú)游戲的版本多達(dá)幾十種,Palm和Windows Mobile設(shè)備版本的數(shù)獨(dú)游戲就各有20種左右。Sudok
26、umo推出的移動(dòng)數(shù)獨(dú)游戲,能夠下載到大多數(shù)手機(jī)中。這家位于英國(guó)的游戲軟件公司表示,已經(jīng)在全球賣(mài)出了7500套數(shù)獨(dú)游戲,而且來(lái)自用戶(hù)的興趣還在增加。因此,一個(gè)好的數(shù)獨(dú)游戲的開(kāi)發(fā),可以吸引很多潛在的玩家。</p><p><b> 5.系統(tǒng)分析</b></p><p> 利用C++語(yǔ)言的面向?qū)ο筇匦?,把生產(chǎn)游戲數(shù)據(jù)的程序封裝成一個(gè)類(lèi),在玩游戲時(shí),只要根據(jù)數(shù)獨(dú)游戲的邏輯
27、性來(lái)編寫(xiě),先得到一個(gè)完整的數(shù)獨(dú),然后根據(jù)難度需要,隨機(jī)的挖一些空格出來(lái)。便可以得到唯一解的數(shù)獨(dú)。</p><p> 終盤(pán)數(shù)量數(shù)獨(dú)中的數(shù)字排列千變?nèi)f化,那么究竟有多少種終盤(pán)的數(shù)字組合呢?共有6,670,903,752,021,072,936,960(約有6.67×10的21次方)種組合,2005年由Bertram Felgenhauer和Frazer Jarvis計(jì)算出該數(shù)字,并將計(jì)算方法發(fā)布在他們網(wǎng)站
28、上,如果將等價(jià)終盤(pán)(如旋轉(zhuǎn)、翻轉(zhuǎn)、行行對(duì)換,數(shù)字對(duì)換等變形)不計(jì)算,則有5,472,730,538個(gè)組合。數(shù)獨(dú)終盤(pán)的組合數(shù)量都如此驚人,那么數(shù)獨(dú)題目數(shù)量就更加不計(jì)其數(shù)了,因?yàn)槊總€(gè)數(shù)獨(dú)終盤(pán)又可以制作出無(wú)數(shù)道合格的數(shù)獨(dú)題目。 按照這個(gè)數(shù)量,如果我們將一個(gè)[1,2,3,4,5,6,7,8,9]的數(shù)組隨機(jī)化,然后將其作為一行數(shù)據(jù)添加到一個(gè)二維數(shù)組中去,該行能滿(mǎn)足數(shù)獨(dú)終盤(pán)規(guī)則的概率是很大的。 基于這個(gè)假設(shè)(假設(shè)的有效性會(huì)在文章后面驗(yàn)證),我
29、的算法思想如下: </p><p> 寫(xiě)一個(gè)方法用于獲取一個(gè)由1到9九個(gè)數(shù)隨機(jī)排列的一維數(shù)組。</p><p> 將獲取到的1到9的隨機(jī)數(shù)的一維數(shù)組放入九宮格中,每一個(gè)隨機(jī)數(shù)的列坐標(biāo)循環(huán)采用1到9,行坐標(biāo)使用1到9的隨機(jī)數(shù),從而使步驟一中產(chǎn)生的隨機(jī)數(shù)隨機(jī)分布在九宮格中每一列中。</p><p> 循環(huán)尋找出當(dāng)前九宮格中所有空白格中的右下角的一個(gè)空格。</
30、p><p> 寫(xiě)一個(gè)算法找出某一個(gè)單元格中可以填入的數(shù)字的數(shù)組。</p><p> 在所有空白格中的最右下角的空白格中填入可能存在的數(shù)字,以此數(shù)據(jù)為新的游戲數(shù)據(jù),接著循環(huán)尋找當(dāng)前數(shù)據(jù)中空白格中的最右下角的空白格,填入當(dāng)前空白格中可能存在的內(nèi)容。</p><p> 遞歸尋找,若最后每一個(gè)空白格中都有可以填入的數(shù)字,則游戲終盤(pán)生產(chǎn)成功,否則往回遞歸,填入可能存在數(shù)字?jǐn)?shù)
31、組中的第二個(gè)數(shù)組,循環(huán)遞歸,若仍然沒(méi)有終盤(pán)生產(chǎn),則生產(chǎn)游戲失敗。</p><p> 根據(jù)玩具設(shè)置的游戲難度,在生產(chǎn)的終盤(pán)游戲中隨機(jī)挖取一定的空數(shù)據(jù),空格越多,則游戲難度越大。</p><p> 游戲生產(chǎn)完畢以后,玩家開(kāi)始填數(shù)字開(kāi)始游戲,當(dāng)玩家填寫(xiě)完成,則開(kāi)始進(jìn)行游戲是否完成的判斷,在判斷過(guò)程中,只需要判斷當(dāng)前空格中的數(shù)字是否與同行,同列和同小九宮格中的數(shù)字是否相同即可,若所有的單元格都
32、判斷成功,則玩家成功完成游戲。</p><p><b> 6.系統(tǒng)設(shè)計(jì)</b></p><p><b> 6.1設(shè)計(jì)思路</b></p><p> 先得到一個(gè)完整的數(shù)獨(dú),然后根據(jù)難度需要,隨機(jī)地挖取一些空格出來(lái),然后判斷是否符合條件(游戲規(guī)則),循環(huán)再輸出。</p><p> 6.2系統(tǒng)主要
33、類(lèi)設(shè)計(jì)</p><p> 游戲框架基于MFC的對(duì)話(huà)框,在一個(gè)對(duì)話(huà)框中顯示九宮格和一些功能性按鈕,該程序主要包含GamePad類(lèi), sudokuDlg類(lèi)和 SudokuGame類(lèi)。</p><p> 6.2.1 GamePad類(lèi)</p><p> 該類(lèi)主要對(duì)數(shù)獨(dú)游戲的九宮格進(jìn)行記錄和操作。</p><p> 九宮格的狀態(tài)一共分為5種:&
34、lt;/p><p> enum CellType {</p><p> ORIGINAL_CELL = 0, //原始數(shù)據(jù)單元格</p><p> EDIT_CELL, //可編輯單元格</p><p> ERROR_CELL, //輸入錯(cuò)誤單元格</p><p> CLICK_CELL
35、, //單機(jī)單元格</p><p> PROMPT_CELL //提示輸入單元格</p><p><b> };</b></p><p> 可編輯的單元格在每次點(diǎn)擊兩次之后會(huì)變成可編輯狀態(tài),玩家可通過(guò)鍵盤(pán)先單元格中輸入數(shù)字,提示單元格在玩家開(kāi)啟提示功能之后,會(huì)在單元格的最下方顯示該單元格中可輸入的數(shù)字。</p>
36、;<p> 該類(lèi)中記錄了九宮格操作需要的一些數(shù)據(jù),具體包括:</p><p> CSudokuGame m_sudo; //數(shù)獨(dú)游戲數(shù)據(jù)對(duì)象</p><p> int m_x; //鼠標(biāo)點(diǎn)擊x坐標(biāo)</p><p> int m_y; //鼠標(biāo)點(diǎn)擊y坐標(biāo)</p><p> int
37、 m_row; //選擇行</p><p> int m_col; //選擇列</p><p> CRect m_rect[9][9]; //保存各個(gè)小方格坐標(biāo)</p><p> bool m_bCorrect[9][9]; //保存各個(gè)小方塊的輸入狀態(tài):輸入正確或者輸入錯(cuò)誤</p><p&
38、gt; CString m_proStr[2]; //保存提示字符串</p><p> CRect m_proRect[2]; //保存顯示提示符的坐標(biāo)</p><p> int m_key; //鍵盤(pán)輸入</p><p> int m_nClick; //記錄單機(jī)次數(shù):?jiǎn)螜C(jī)兩次為輸入</p&g
39、t;<p> BOOL m_bPrompt; //是否顯示提示</p><p><b> ·</b></p><p> 同時(shí),該類(lèi)中記錄了九宮格操作的一些方法,具體包括:</p><p> Bool GetRowCol(const CPoint point); //獲取鼠標(biāo)單機(jī)單元格的行號(hào)和列號(hào)<
40、/p><p> bool GetRowCol(int &row, int &col, const CPoint point); </p><p> //外部進(jìn)程獲取鼠標(biāo)單機(jī)單元格的行號(hào)和列號(hào)</p><p> bool GetPromptStrRect(const int row, const int col); //獲取提示符輸入&
41、lt;/p><p> void DrawCell(const int row, const int col, const int invalue, const int type); //繪制單元格</p><p> void Initialize(); // 單元格的初始化</p><p&g
42、t; void MarkErrorCell(); //標(biāo)記輸入錯(cuò)誤的單元格</p><p> void ShowTheComputeResult(const vector<vector<vector<int>>> &result, const bool bFinish); //顯示游戲自動(dòng)完成的結(jié)果</p&
43、gt;<p> 在該類(lèi)中,通過(guò)以上的變量和方法,對(duì)游戲界面的九宮格的狀態(tài)進(jìn)行操作。</p><p> 6.2.2 SudokuDlg類(lèi)</p><p> 該類(lèi)主要對(duì)數(shù)獨(dú)游戲的整個(gè)運(yùn)行邏輯進(jìn)行控制,是整個(gè)對(duì)話(huà)框的控制類(lèi),在整個(gè)對(duì)話(huà)框中除了九宮格之外,還有8個(gè)按鈕,分別是“載入游戲”, “選擇游戲文件”,“退出游戲”,“保存游戲文件”,“完成游戲”,“保存正確結(jié)果”,“自動(dòng)
44、計(jì)算數(shù)獨(dú)結(jié)果”和“隨機(jī)生成新游戲數(shù)據(jù)”,同時(shí),還有一個(gè)復(fù)選框按鈕,玩家可以通過(guò)打開(kāi)此開(kāi)關(guān)顯示輸入提示。該類(lèi)通過(guò)消息映射機(jī)制,分別對(duì)每一個(gè)按鈕做了相應(yīng)的功能性處理,主要包括以下功能:</p><p> void CSudokuDlg::OnBnClickedLoadgame()//加載原始游戲數(shù)據(jù)文件</p><p> void CSudokuDlg::OnBnClickedChoose
45、()//選擇游戲數(shù)據(jù)文件進(jìn)行游戲</p><p> void CSudokuDlg::OnBnClickedNew()//生產(chǎn)新的游戲數(shù)據(jù)</p><p> void CSudokuDlg::OnBnClickedSave()//保存新生產(chǎn)的游戲數(shù)據(jù)</p><p> UINT Computing(LPVOID lpParam)//多線(xiàn)程計(jì)算數(shù)據(jù)結(jié)果</
46、p><p> void CSudokuDlg::OnBnClickedCompute()//自動(dòng)計(jì)算數(shù)據(jù)結(jié)果</p><p> 6.2.3 Sudokugame類(lèi)</p><p> 該類(lèi)是數(shù)獨(dú)游戲的規(guī)則控制類(lèi),主要用于控制游戲數(shù)據(jù)的生成,計(jì)算,判斷游戲成功失敗等等。</p><p> 主要包括以下的變量和函數(shù):</p>&l
47、t;p> int m_data[9][9]; //保存原始游戲數(shù)據(jù)</p><p> int m_user[9][9]; //保存用戶(hù)輸入數(shù)據(jù)</p><p> int m_bCompute; //判斷用戶(hù)是否終止自動(dòng)計(jì)算</p><p> bool m_bExit; //標(biāo)志線(xiàn)程是否終止退出<
48、/p><p> void Initialize();//初始化</p><p> bool CheckInput(const int row, const int col, const int input); //判斷輸入的某個(gè)數(shù)據(jù)是否有效</p><p> bool CheckCell(const int row, const int col);
49、 //判斷某一個(gè)單元格是否有錯(cuò)</p><p> bool CheckOriginalData(); //檢查原始數(shù)據(jù)的合法性</p><p> int GetInputNum(const int row, const int col, vector<int> &integer); //獲取某個(gè)單元格所有可輸入的整數(shù)<
50、/p><p> bool CheckTheResult(); //判斷用戶(hù)最終是否完成了游戲</p><p> bool ComputeResult(vector<vector<vector<int>>> &results); //自動(dòng)計(jì)算數(shù)獨(dú)結(jié)果</p><p> bool CallRecur
51、rence(int *data, int count, vector<vector<vector<int>>> &results); //遞歸計(jì)算</p><p> bool CallRecurrence(int *data, int count, int *result); //遞歸計(jì)算,用于生產(chǎn)數(shù)獨(dú)數(shù)據(jù)的中間計(jì)算過(guò)程</p><
52、;p> void CreateSudokuData(); //自動(dòng)隨機(jī)生產(chǎn)數(shù)據(jù)游戲數(shù)據(jù)</p><p> void CopyToUser(); //將原始數(shù)據(jù)拷貝到用戶(hù)數(shù)據(jù)</p><p><b> 生產(chǎn)游戲數(shù)據(jù)代碼:</b></p><p><b> 思路分析:</b>&
53、lt;/p><p> 首先,確定一個(gè)9*9的正方形盤(pán)。</p><p> 第一行:取1~9個(gè)數(shù)字,然后把數(shù)字打亂放好到每一行每個(gè)格子里面。</p><p> 第二行開(kāi)始:(因?yàn)橛辛说谝恍械南拗疲缘诙虚_(kāi)始就不能亂填了)。這時(shí)可以建立一個(gè)函數(shù)專(zhuān)門(mén)用來(lái)填數(shù)字,從第一列開(kāi)始到第9列結(jié)束。</p><p> 函數(shù)的實(shí)現(xiàn)過(guò)程基本是這樣的:首先生
54、產(chǎn)一個(gè)1到9的隨機(jī)數(shù),這時(shí)候判斷跟同一行前面填了的有沒(méi)有重復(fù)的,重復(fù)的重來(lái),還要再判斷跟同一列的舔的數(shù)據(jù)有沒(méi)有重復(fù)的,重復(fù)的從來(lái),總有一個(gè)會(huì)適合的。</p><p> //遞歸計(jì)算,用于生產(chǎn)數(shù)獨(dú)數(shù)據(jù)的中間計(jì)算過(guò)程</p><p> bool CSudokuGame::CallRecurrence(int *data, int count, int *result)</p>
55、<p><b> {</b></p><p> int a[9][9];</p><p> memcpy(a, data, sizeof(a));</p><p> if ( count == 81 )</p><p><b> {</b></p><p&g
56、t; memcpy(result, a, sizeof(a));</p><p> return true;</p><p><b> }</b></p><p> unsigned int num = 10;</p><p> int row = 0, col = 0;</p><p&g
57、t; vector<int> mayInput;</p><p> for ( int i = 0; i < 9; i++ )</p><p><b> {</b></p><p> for ( int j = 0; j < 9; j++ )</p><p><b> {&l
58、t;/b></p><p> if ( a[i][j] == 0 )</p><p><b> {</b></p><p> vector<int> integer;</p><p> memcpy(m_user, a, sizeof(m_user));</p><p>
59、 GetInputNum(i, j, integer);</p><p> if ( integer.empty() ) return false;</p><p> if ( num > integer.size() )</p><p><b> {</b></p><p> num = integ
60、er.size();</p><p><b> row = i;</b></p><p><b> col = j;</b></p><p> mayInput = integer;</p><p><b> }</b></p><p><
61、b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> for (unsigned int i = 0; i < mayInput.size(); i++ )</p><p><b> {</b
62、></p><p> a[row][col] = mayInput[i];</p><p> if ( CallRecurrence( (int *)a, count+1, result) ) return true;</p><p><b> }</b></p><p> return false;&
63、lt;/p><p><b> }</b></p><p> //自動(dòng)隨機(jī)生成數(shù)獨(dú)游戲數(shù)據(jù)</p><p> void CSudokuGame::CreateSudokuData()</p><p><b> {</b></p><p> int data[9][9];
64、</p><p> memset(data, 0, sizeof(data));</p><p> srand( (unsigned) time(NULL) );</p><p> int num = (rand() % 17) + 25; //隨機(jī)產(chǎn)生20-41個(gè)隨機(jī)數(shù)</p><p> int possible[9], i1
65、, i2, temp;</p><p> for ( int i = 0; i < 9; i++ ) possible[i] = i+1;</p><p> for ( int i = 0; i < 20; i++ )</p><p><b> {</b></p><p> i1 = rand(
66、) % 9;</p><p> i2 = rand() % 9;</p><p> temp = possible[i1];</p><p> possible[i1] = possible[i2];</p><p> possible[i2] = temp;</p><p><b> }</
67、b></p><p> bool bNon = true;</p><p> int count = 9;</p><p> int row, col;</p><p> while ( bNon )</p><p><b> {</b></p><p>
68、; for ( int i = 0; i < 9; i++ )</p><p><b> {</b></p><p> col = rand() % 9;</p><p> data[i][col] = possible[i];</p><p><b> }</b></p>
69、;<p> if ( CallRecurrence((int *)data, count, (int *)data) ) </p><p><b> {</b></p><p> bNon = false; </p><p><b> break; </b></p><p>
70、<b> }</b></p><p><b> }</b></p><p> //隨機(jī)挖去81-num個(gè)的洞</p><p> for (int i = 0; i < (81-num); i++ )</p><p><b> {</b></p>
71、<p> row = rand() % 9;</p><p> col = rand() % 9;</p><p> while( data[row][col] == 0 )</p><p><b> {</b></p><p> row = rand() % 9;</p><p&
72、gt; col = rand() % 9;</p><p><b> }</b></p><p> data[row][col] = 0;</p><p><b> }</b></p><p> memcpy(m_data, data, sizeof(data));</p>
73、<p> memcpy(m_user, data, sizeof(data)); </p><p><b> }</b></p><p> //遞歸計(jì)算數(shù)獨(dú)結(jié)果</p><p> bool CSudokuGame::CallRecurrence(int *data, int count, vector<vector<
74、;vector<int>>> &results)</p><p><b> {</b></p><p> if ( !m_bCompute ) return false;</p><p> if ( results.size() >= MAX_NUM ) return true;</p&
75、gt;<p> if ( count == 81 )</p><p><b> {</b></p><p> memcpy(m_user, data, sizeof(m_user));</p><p> vector<vector<int>> result;</p><p>
76、 result.clear();</p><p> result.resize(9);</p><p> for ( int i = 0; i < 9; i++ )</p><p><b> {</b></p><p> for ( int j = 0; j < 9; j++ )</p>
77、<p><b> {</b></p><p> result[i].push_back(m_user[i][j]);</p><p><b> }</b></p><p><b> }</b></p><p> results.push_back(res
78、ult);</p><p> return true;</p><p><b> }</b></p><p> int a[9][9];</p><p> memcpy(a, data, sizeof(a));</p><p> unsigned int num = 10;</p&
79、gt;<p> int row = 0, col = 0;</p><p> vector<int> mayInput;</p><p> for ( int i = 0; i < 9; i++ )</p><p><b> {</b></p><p> for ( int j
80、 = 0; j < 9; j++ )</p><p><b> {</b></p><p> if ( a[i][j] == 0 )</p><p><b> {</b></p><p> vector<int> integer;</p><p>
81、 memcpy(m_user, a, sizeof(m_user));</p><p> GetInputNum(i, j, integer);</p><p> if ( integer.empty() ) return false;</p><p> if ( num > integer.size() )</p><p>
82、<b> {</b></p><p> num = integer.size();</p><p><b> row = i;</b></p><p><b> col = j;</b></p><p> mayInput = integer;</p>
83、<p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> bool bOK = false;</p><p>
84、; for (unsigned int i = 0; i < mayInput.size(); i++ )</p><p><b> {</b></p><p> a[row][col] = mayInput[i];</p><p> if ( CallRecurrence( (int *)a, count+1, results
85、) ) bOK = true;</p><p><b> }</b></p><p> return bOK;</p><p><b> }</b></p><p> //自動(dòng)計(jì)算數(shù)獨(dú)游戲的可能解代碼:</p><p> bool CSudokuGame::Com
86、puteResult(vector<vector<vector<int>>> &results)</p><p><b> {</b></p><p> m_bExit = false;</p><p> results.clear();</p><p> int d
87、ata[9][9];</p><p> memcpy(data, m_data, sizeof(m_data)); </p><p> int count = 0;</p><p> for ( int i = 0; i < 9; i++ )</p><p><b> {</b></p>&l
88、t;p> for ( int j = 0; j < 9; j++ )</p><p><b> {</b></p><p> if ( m_data[i][j] > 0 ) count++;</p><p><b> }</b></p><p><b> }&
89、lt;/b></p><p> if ( CallRecurrence((int *)data, count, results) )</p><p><b> {</b></p><p> m_bExit = true;</p><p> return true;</p><p>&
90、lt;b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> m_bExit = true;</p><p> return false;</p><p><b> }<
91、;/b></p><p><b> }</b></p><p> //獲取某個(gè)單元格中可以輸入的數(shù)據(jù)代碼</p><p> int CSudokuGame::GetInputNum(const int row, const int col, vector<int> &integer)</p><
92、;p><b> {</b></p><p> if ( (col >= 9) || (row >= 9) || (col < 0) || (row < 0) ) return 0;</p><p> int num = 0;</p><p> integer.clear();</p><
93、;p> int line[9];</p><p> memset(line, 1, sizeof(line));</p><p> int i = 0, j = 0, temp;</p><p> for( i = 0; i < 9; i++)</p><p><b> {</b></p&g
94、t;<p> temp = m_user[i][col];</p><p> if( (row != i) && temp > 0 ) line[temp-1] = 0;</p><p><b> }</b></p><p> for( i = 0; i < 9; i++)</p>
95、;<p><b> {</b></p><p> temp = m_user[row][i];</p><p> if( (col != i) && temp > 0 ) line[temp-1] = 0;</p><p><b> }</b></p><p
96、> int t1 = row / 3, t2 = col / 3;</p><p> for( i = t1*3; i < (t1*3+3); i++)</p><p><b> {</b></p><p> if ( row == i ) continue;</p><p> for( j =
97、t2*3; j < (t2*3+3); j++)</p><p><b> {</b></p><p> if ( col == j ) continue;</p><p> temp = m_user[i][j];</p><p> if( temp > 0 ) line[temp-1] = 0
98、;</p><p><b> }</b></p><p><b> }</b></p><p> for ( i = 0; i < 9; i++ )</p><p><b> {</b></p><p> if ( line[i] !=
99、0 )</p><p><b> {</b></p><p> integer.push_back(i+1);</p><p><b> num++;</b></p><p><b> }</b></p><p><b> }<
100、/b></p><p> return num;</p><p><b> }</b></p><p> //檢查用戶(hù)是否正確完成數(shù)據(jù)代碼</p><p> bool CSudokuGame::CheckTheResult()</p><p><b> {</b&g
101、t;</p><p> int i = 0, j = 0;</p><p> for( i =0; i < 9; i++)</p><p><b> {</b></p><p> for( j = 0; j < 9; j++)</p><p><b> {</
102、b></p><p> if( m_user[i][j] == 0 ) return false;</p><p><b> else</b></p><p><b> {</b></p><p> if( !CheckInput(i, j, m_user[i][j]) ) retu
103、rn false;</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> return true;</p><p><b> }</b><
104、/p><p> 7.系統(tǒng)主要技術(shù)特色</p><p> 游戲采用了MFC框架搭建,有著較好的界面顯示,可以給用戶(hù)更好的游戲體驗(yàn),相對(duì)于傳統(tǒng)的游戲設(shè)計(jì),游戲中加入了顯示輸入提示功能,可以幫助水平不高的玩具更容易的完成游戲,使初學(xué)者更容易完成數(shù)獨(dú)游戲,體驗(yàn)到數(shù)獨(dú)游戲的樂(lè)趣。</p><p><b> 8.結(jié)論</b></p><
105、;p> 畢業(yè)設(shè)計(jì)是對(duì)我們四年所學(xué)知識(shí)最后一次綜合性檢測(cè)盒實(shí)際應(yīng)用能力的考察。我們這次設(shè)計(jì)的課題是“數(shù)獨(dú)游戲的設(shè)計(jì)與開(kāi)發(fā)”,該課題使我對(duì)所學(xué)的知識(shí)有了一個(gè)比較系統(tǒng)的認(rèn)識(shí)和理解。涉及了軟件工程,C++語(yǔ)言,數(shù)據(jù)庫(kù)等科目,綜合能力有了進(jìn)一步提高,同時(shí)使我學(xué)會(huì)了如何使用所學(xué)的知識(shí)去解決一些實(shí)際問(wèn)題,增加了我們的動(dòng)手能力。</p><p> 本次的數(shù)獨(dú)游戲雖然設(shè)計(jì)簡(jiǎn)單,但是在這次設(shè)計(jì)中綜合了所學(xué)知識(shí)的理論和基礎(chǔ)。
106、通過(guò)對(duì)本次游戲的設(shè)計(jì),將所學(xué)的知識(shí)運(yùn)用到實(shí)際生活去了。從而知道自己對(duì)知識(shí)的掌握情況。經(jīng)這次設(shè)計(jì),讓專(zhuān)業(yè)知識(shí)與實(shí)踐結(jié)實(shí),讓專(zhuān)業(yè)知識(shí)得到了更好的消化和更牢固的掌握。而且我明白了知識(shí)不是單一的,它是相互聯(lián)系的,學(xué)科與學(xué)科之間都有著內(nèi)在聯(lián)系。計(jì)算機(jī)是一門(mén)非常復(fù)雜,龐大的學(xué)科,一項(xiàng)課題往往需要多項(xiàng)技術(shù)才可以完成。在設(shè)計(jì)階段,我通過(guò)對(duì)課程的深層分析與研究,使我又對(duì)多門(mén)技術(shù)有了一定的了解。在遇到困難時(shí),我懂得了該怎么樣去應(yīng)付,如何去查找和分析相關(guān)資料
107、。</p><p> 在設(shè)計(jì)過(guò)程中,遇到了很多的各種問(wèn)題,這不失是一種好的現(xiàn)象,因?yàn)樵谠O(shè)計(jì)時(shí)出現(xiàn)的問(wèn)題越多,最后成功率就越大。常說(shuō)在問(wèn)題中進(jìn)步,在失敗中成長(zhǎng),亦是如此。</p><p> 在這次設(shè)計(jì)中我得到了老師和同學(xué)的指導(dǎo)和幫助,使我們認(rèn)識(shí)到團(tuán)隊(duì)精神的重要性,因?yàn)橐粋€(gè)人所學(xué)的知識(shí)不可能面面俱到的,只有通過(guò)合作,發(fā)揮自己的優(yōu)點(diǎn),體現(xiàn)團(tuán)隊(duì)精神,才能使工作做得更為出色。通過(guò)這次設(shè)計(jì),我學(xué)到
108、了許多書(shū)本上學(xué)不到的知識(shí),增強(qiáng)了自己的動(dòng)手能力和自信心。通過(guò)這次設(shè)計(jì)使我們能力有了很大的提高,為我們以后走上崗位打下了扎實(shí)的基礎(chǔ)</p><p> 非常感謝老師給我們這次鍛煉的機(jī)會(huì),最后在老師的指導(dǎo)下完成了自己的設(shè)計(jì)任務(wù),但由于自己的知識(shí)水平有限,有許多不足之處,懇請(qǐng)老師多多指教!</p><p><b> 參考文獻(xiàn)</b></p><p>
109、; [1].羅斌,Visual C++編程技巧精選500例,北京:中國(guó)水利水電出版社,2005.1</p><p> [2].劉加海,余建軍,Visual C++程序設(shè)計(jì)基礎(chǔ),北京:科學(xué)出版社,2003.8</p><p> [3].譚鋒,章偉聰,Visual C++程序設(shè)計(jì)實(shí)訓(xùn)教程,北京:科學(xué)出版社,2003.8</p><p> [4].肖宏偉,Visu
110、al C++實(shí)效編程百例,北京:人民郵電出版社,2004.8</p><p> [5].劉加海,羅曉芳,面向?qū)ο蟮某绦蛟O(shè)計(jì)C++,北京:科學(xué)出版社,2003.8</p><p> [6].王超龍,陳志華,Visual C++入門(mén)與提高,北京:人民郵電出版社,2002.6</p><p> [7].(美國(guó))德洛拉,游戲編程精粹,人民郵電出版社,2003.12&l
111、t;/p><p> [8].(美國(guó))斯塔勒,游戲編程中的數(shù)理應(yīng)用,紅旗出版社,2005.3</p><p> [9].(美國(guó))柯姆斯,游戲編程精粹,人民郵電出版社,2005.3</p><p> [10].(美國(guó))羅比斯,C++游戲編程,清華大學(xué)出版社,2004.9</p><p><b> 致謝</b></p
112、><p> 至此,數(shù)獨(dú)游戲的畢業(yè)設(shè)計(jì)已經(jīng)全部結(jié)束。這次畢業(yè)設(shè)計(jì)是對(duì)我大學(xué)四年來(lái)所學(xué)知識(shí)的回顧和總結(jié),在此基礎(chǔ)上進(jìn)行了綜合應(yīng)用和拓展。在這次畢業(yè)設(shè)計(jì)過(guò)程中,我掌握了一般游戲設(shè)計(jì)的方法,同時(shí)也對(duì)我實(shí)踐應(yīng)用能力提出來(lái)更高的要求,開(kāi)拓了視野,拓展了知識(shí)面。再次感謝三年來(lái)對(duì)我辛勤培養(yǎng)和教育的所有老師,感謝給予我?guī)椭凸膭?lì)的所有同學(xué)。</p><p> 在設(shè)計(jì)過(guò)程中我得到了馮永老師和有關(guān)同學(xué)的支持和幫
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 數(shù)獨(dú)游戲的設(shè)計(jì)與開(kāi)發(fā)【畢業(yè)論文】
- 數(shù)獨(dú)游戲畢業(yè)論文.doc
- 數(shù)獨(dú)游戲畢業(yè)論文.doc
- 畢業(yè)論文--基于sat的數(shù)獨(dú)游戲?qū)崿F(xiàn)
- c數(shù)獨(dú)游戲的設(shè)計(jì)與開(kāi)發(fā)
- c++數(shù)獨(dú)游戲的設(shè)計(jì)與開(kāi)發(fā)
- 基于android數(shù)獨(dú)游戲設(shè)計(jì)_畢業(yè)設(shè)計(jì)論文
- 畢業(yè)論文——猜數(shù)游戲軟件的設(shè)計(jì)開(kāi)發(fā)
- 數(shù)獨(dú)游戲設(shè)計(jì)與源碼
- 課程設(shè)計(jì)報(bào)告--數(shù)獨(dú)小游戲的開(kāi)發(fā)
- 黑白棋游戲設(shè)計(jì)與開(kāi)發(fā)畢業(yè)論文
- 數(shù)獨(dú)游戲課程
- 畢業(yè)設(shè)計(jì)(論文)+手機(jī)游戲開(kāi)發(fā)-java畢業(yè)論文
- 畢業(yè)論文范文——手機(jī)游戲(堡壘)的設(shè)計(jì)與開(kāi)發(fā)
- 畢業(yè)論文——基于cocos的大富翁游戲設(shè)計(jì)與開(kāi)發(fā)
- 數(shù)獨(dú)小游戲.zip
- 畢業(yè)論文-基于java的魔板游戲的設(shè)計(jì)與開(kāi)發(fā)
- 畢業(yè)論文---- 基于j2me的手機(jī)游戲開(kāi)發(fā)
- 游戲設(shè)計(jì)畢業(yè)論文
- 數(shù)獨(dú)游戲與城市設(shè)計(jì)的關(guān)聯(lián)性研究
評(píng)論
0/150
提交評(píng)論