版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 本科畢業(yè)論文</b></p><p><b> ?。?0 屆)</b></p><p> 數(shù)獨(dú)游戲的設(shè)計(jì)與開發(fā)</p><p><b> 摘要</b></p><p> 本文介紹了利用C++語言編寫數(shù)獨(dú)游戲的方法。游戲的開發(fā)設(shè)計(jì)使用了vs2
2、010作為開發(fā)工具,根據(jù)數(shù)獨(dú)游戲特有的規(guī)則特點(diǎn)對游戲進(jìn)行設(shè)計(jì)。并且游戲在開發(fā)的過程中使用了微軟的MFC開源框架,在數(shù)獨(dú)游戲的界面上做了一定的處理。本文首先對游戲進(jìn)行了簡單的介紹,對游戲的計(jì)算機(jī)實(shí)現(xiàn)進(jìn)行分析。最后通過部分游戲截圖和數(shù)據(jù)表格來介紹了游戲的開發(fā)設(shè)計(jì)過程和游戲的基本操作。并根據(jù)軟件工程的方法,從需求分析、概要設(shè)計(jì)、詳細(xì)設(shè)計(jì)、編碼實(shí)現(xiàn)等方面闡述了游戲的開發(fā)流程,并通過游戲界面的截圖、數(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 簡介......................................
7、......................1</p><p> 1.2 數(shù)獨(dú)的起源.....................................................1</p><p> 1.3 數(shù)獨(dú)的發(fā)展.....................................................1</p><p> 2
8、開發(fā)環(huán)境及開發(fā)工具...................................................2</p><p> 2.1 C++語言簡介....................................................2</p><p> 2.2 MFC語言簡介......................................
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)開發(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)主要類設(shè)計(jì)...
12、...............................................3</p><p> 6.2.1 GamePad類.................................................3</p><p> 6.2.2 SudokuDlg類..............................................
13、.4</p><p> 6.2.3 Sudokugame類..............................................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簡介</b></p><p> 數(shù)獨(dú)游戲是一種源自18世紀(jì)末的瑞士,后在美國發(fā)展、并在日本得以發(fā)揚(yáng)光大的數(shù)學(xué)智力拼圖游戲。拼圖是九宮格(即3格寬×3格高)的正方形狀,每一格又細(xì)分為一個九宮格。在每
16、一個小九宮格中,分別填上1至9的數(shù)字,讓整個大九宮格每一列、每一行的數(shù)字都不重復(fù)。 數(shù)獨(dú)的玩法邏輯簡單,數(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ú)前身為“九宮格”,最早起源于中國。
17、數(shù)千年前,我們的祖先就發(fā)明了洛書,其特點(diǎn)較之現(xiàn)在的數(shù)獨(dú)更為復(fù)雜,要求縱向、橫向、斜向上的三個數(shù)字之和等于15,而非簡單的九個數(shù)字不能重復(fù)。儒家典籍《易經(jīng)》中的“九宮圖”也源于此,故稱“洛書九宮圖”。而“九宮”之名也因《易經(jīng)》在中華文化發(fā)展史上的重要地位而保存、沿用至今。</p><p> 1783年,瑞士數(shù)學(xué)家萊昂哈德·歐拉發(fā)明了一種當(dāng)時稱作“拉丁方塊”(Latin Square)的游戲,這個游戲是一
18、個n×n的數(shù)字方陣,每一行和每一列都是由不重復(fù)的n個數(shù)字或者字母組成的。</p><p> 19世紀(jì)70年代,美國的一家數(shù)學(xué)邏輯游戲雜志《戴爾鉛筆字謎和詞語游戲》(Dell Puzzle Mαgαzines)開始刊登現(xiàn)在稱為“數(shù)獨(dú)”的這種游戲,當(dāng)時人們稱之為“數(shù)字拼圖”(Number Place),在這個時候,9×9的81格數(shù)字游戲才開始成型。</p><p><
19、;b> 1.3數(shù)獨(dú)的發(fā)展</b></p><p> 1984年4月,在日本游戲雜志《字謎通訊Nikoil》(《パズル通信ニコリ》)上出現(xiàn)了“數(shù)獨(dú)”游戲,提出了“獨(dú)立的數(shù)字”的概念,意思就是“這個數(shù)字只能出現(xiàn)一次”或者“這個數(shù)字必須是惟一的”,并將這個游戲命名為“數(shù)獨(dú)”(sudoku)。一位前任香港高等法院的新西蘭籍法官高樂德(Wayne Gould)在1997年3月到日本東京旅游時,無意中
20、發(fā)現(xiàn)了。他首先在英國的《泰晤士報》上發(fā)表,不久其他報紙也發(fā)表,很快便風(fēng)靡全英國,之后他用了6年時間編寫了電腦程式,并將它放在網(wǎng)站上,使這個游戲很快在全世界流行。從此,這個游戲開始風(fēng)靡全球。后來更因數(shù)獨(dú)的流行衍生了許多類似的數(shù)學(xué)智力拼圖游戲,例如:數(shù)和、殺手?jǐn)?shù)獨(dú)。</p><p><b> 2.開發(fā)工具及環(huán)境</b></p><p> 2.1 C++語言簡介<
21、/p><p> C++語言是一種優(yōu)秀的面向?qū)ο蟪绦蛟O(shè)計(jì)語言,它在C語言的基礎(chǔ)上發(fā)展而來,但它比C語言更容易為人們學(xué)習(xí)和掌握。</p><p> C++以其獨(dú)特的語言機(jī)制在計(jì)算機(jī)科學(xué)的各個領(lǐng)域中得到了廣泛的應(yīng)用。面向?qū)ο蟮脑O(shè)計(jì)思想是在原來結(jié)構(gòu)化程序設(shè)計(jì)方法基礎(chǔ)上的一個質(zhì)的飛躍,C++完美地體現(xiàn)了面向?qū)ο蟮母鞣N特性。</p><p><b> 2.2 MFC
22、簡介</b></p><p> MFC,微軟基礎(chǔ)類(Microsoft Foundation Classes),實(shí)際上是微軟提供的,用于在C++環(huán)境下編寫應(yīng)用程序的一個框架和引擎。MFC是Win API與C++的結(jié)合,API,即微軟提供的WinDOS下應(yīng)用程序的編程語言接口,是一種軟件編程的規(guī)范,但不是一種程序開發(fā)語言本身,可以允許用戶使用各種各樣的第三方的編程語言來進(jìn)行對WinDOS下應(yīng)用程序的開
23、發(fā),使這些被開發(fā)出來的應(yīng)用程序能在WinDOS下運(yùn)行。</p><p><b> 3.系統(tǒng)需求分析</b></p><p> 3.1現(xiàn)行系統(tǒng)概況描述</p><p> 同類似的填字游戲不同,數(shù)獨(dú)受歡迎的原因之一是它既不需要豐富的百科知識,也不要掌握大量的詞匯,這使其能迅速為孩子和初學(xué)者所接受。根據(jù)游戲開始時的方格中已有的數(shù)字和位置,數(shù)獨(dú)難
24、易程度不同,有些復(fù)雜的甚至令數(shù)學(xué)家也不能完成?,F(xiàn)在在各個系統(tǒng)平臺上都有數(shù)獨(dú)游戲的開發(fā),且用戶十分龐大</p><p><b> 3.2需求分析</b></p><p> “數(shù)獨(dú)”,即“獨(dú)立的數(shù)字”的簡稱,游戲在一個9*9的方格中,有81個小方格組成,然后又分成9個大塊,每塊由3*3組成,就是九宮格,大九宮格里邊再嵌套9個小的九宮格,游戲開始前會有一些格子上寫好了數(shù)
25、字,你需要在剩下的格子里面填寫數(shù)字,直到把所有的鴿子填滿,并且要求最后任何一行或者一列或者一個小九宮格中都不存在相同的數(shù)字。</p><p><b> 系統(tǒng)開發(fā)可行性分析</b></p><p> 據(jù)著名的動游戲開發(fā)商Astraware Ltd.預(yù)計(jì),移動數(shù)獨(dú)游戲的版本多達(dá)幾十種,Palm和Windows Mobile設(shè)備版本的數(shù)獨(dú)游戲就各有20種左右。Sudok
26、umo推出的移動數(shù)獨(dú)游戲,能夠下載到大多數(shù)手機(jī)中。這家位于英國的游戲軟件公司表示,已經(jīng)在全球賣出了7500套數(shù)獨(dú)游戲,而且來自用戶的興趣還在增加。因此,一個好的數(shù)獨(dú)游戲的開發(fā),可以吸引很多潛在的玩家。</p><p><b> 5.系統(tǒng)分析</b></p><p> 利用C++語言的面向?qū)ο筇匦裕焉a(chǎn)游戲數(shù)據(jù)的程序封裝成一個類,在玩游戲時,只要根據(jù)數(shù)獨(dú)游戲的邏輯
27、性來編寫,先得到一個完整的數(shù)獨(dú),然后根據(jù)難度需要,隨機(jī)的挖一些空格出來。便可以得到唯一解的數(shù)獨(dú)。</p><p> 終盤數(shù)量數(shù)獨(dú)中的數(shù)字排列千變?nèi)f化,那么究竟有多少種終盤的數(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、上,如果將等價終盤(如旋轉(zhuǎn)、翻轉(zhuǎn)、行行對換,數(shù)字對換等變形)不計(jì)算,則有5,472,730,538個組合。數(shù)獨(dú)終盤的組合數(shù)量都如此驚人,那么數(shù)獨(dú)題目數(shù)量就更加不計(jì)其數(shù)了,因?yàn)槊總€數(shù)獨(dú)終盤又可以制作出無數(shù)道合格的數(shù)獨(dú)題目。 按照這個數(shù)量,如果我們將一個[1,2,3,4,5,6,7,8,9]的數(shù)組隨機(jī)化,然后將其作為一行數(shù)據(jù)添加到一個二維數(shù)組中去,該行能滿足數(shù)獨(dú)終盤規(guī)則的概率是很大的。 基于這個假設(shè)(假設(shè)的有效性會在文章后面驗(yàn)證),我
29、的算法思想如下: </p><p> 寫一個方法用于獲取一個由1到9九個數(shù)隨機(jī)排列的一維數(shù)組。</p><p> 將獲取到的1到9的隨機(jī)數(shù)的一維數(shù)組放入九宮格中,每一個隨機(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)前九宮格中所有空白格中的右下角的一個空格。</
30、p><p> 寫一個算法找出某一個單元格中可以填入的數(shù)字的數(shù)組。</p><p> 在所有空白格中的最右下角的空白格中填入可能存在的數(shù)字,以此數(shù)據(jù)為新的游戲數(shù)據(jù),接著循環(huán)尋找當(dāng)前數(shù)據(jù)中空白格中的最右下角的空白格,填入當(dāng)前空白格中可能存在的內(nèi)容。</p><p> 遞歸尋找,若最后每一個空白格中都有可以填入的數(shù)字,則游戲終盤生產(chǎn)成功,否則往回遞歸,填入可能存在數(shù)字?jǐn)?shù)
31、組中的第二個數(shù)組,循環(huán)遞歸,若仍然沒有終盤生產(chǎn),則生產(chǎn)游戲失敗。</p><p> 根據(jù)玩具設(shè)置的游戲難度,在生產(chǎn)的終盤游戲中隨機(jī)挖取一定的空數(shù)據(jù),空格越多,則游戲難度越大。</p><p> 游戲生產(chǎn)完畢以后,玩家開始填數(shù)字開始游戲,當(dāng)玩家填寫完成,則開始進(jìn)行游戲是否完成的判斷,在判斷過程中,只需要判斷當(dāng)前空格中的數(shù)字是否與同行,同列和同小九宮格中的數(shù)字是否相同即可,若所有的單元格都
32、判斷成功,則玩家成功完成游戲。</p><p><b> 6.系統(tǒng)設(shè)計(jì)</b></p><p><b> 6.1設(shè)計(jì)思路</b></p><p> 先得到一個完整的數(shù)獨(dú),然后根據(jù)難度需要,隨機(jī)地挖取一些空格出來,然后判斷是否符合條件(游戲規(guī)則),循環(huán)再輸出。</p><p> 6.2系統(tǒng)主要
33、類設(shè)計(jì)</p><p> 游戲框架基于MFC的對話框,在一個對話框中顯示九宮格和一些功能性按鈕,該程序主要包含GamePad類, sudokuDlg類和 SudokuGame類。</p><p> 6.2.1 GamePad類</p><p> 該類主要對數(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, //輸入錯誤單元格</p><p> CLICK_CELL
35、, //單機(jī)單元格</p><p> PROMPT_CELL //提示輸入單元格</p><p><b> };</b></p><p> 可編輯的單元格在每次點(diǎn)擊兩次之后會變成可編輯狀態(tài),玩家可通過鍵盤先單元格中輸入數(shù)字,提示單元格在玩家開啟提示功能之后,會在單元格的最下方顯示該單元格中可輸入的數(shù)字。</p>
36、;<p> 該類中記錄了九宮格操作需要的一些數(shù)據(jù),具體包括:</p><p> CSudokuGame m_sudo; //數(shù)獨(dú)游戲數(shù)據(jù)對象</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]; //保存各個小方格坐標(biāo)</p><p> bool m_bCorrect[9][9]; //保存各個小方塊的輸入狀態(tài):輸入正確或者輸入錯誤</p><p&
38、gt; CString m_proStr[2]; //保存提示字符串</p><p> CRect m_proRect[2]; //保存顯示提示符的坐標(biāo)</p><p> int m_key; //鍵盤輸入</p><p> int m_nClick; //記錄單機(jī)次數(shù):單機(jī)兩次為輸入</p&g
39、t;<p> BOOL m_bPrompt; //是否顯示提示</p><p><b> ·</b></p><p> 同時,該類中記錄了九宮格操作的一些方法,具體包括:</p><p> Bool GetRowCol(const CPoint point); //獲取鼠標(biāo)單機(jī)單元格的行號和列號<
40、/p><p> bool GetRowCol(int &row, int &col, const CPoint point); </p><p> //外部進(jìn)程獲取鼠標(biāo)單機(jī)單元格的行號和列號</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)記輸入錯誤的單元格</p><p> void ShowTheComputeResult(const vector<vector<vector<int>>> &result, const bool bFinish); //顯示游戲自動完成的結(jié)果</p&
43、gt;<p> 在該類中,通過以上的變量和方法,對游戲界面的九宮格的狀態(tài)進(jìn)行操作。</p><p> 6.2.2 SudokuDlg類</p><p> 該類主要對數(shù)獨(dú)游戲的整個運(yùn)行邏輯進(jìn)行控制,是整個對話框的控制類,在整個對話框中除了九宮格之外,還有8個按鈕,分別是“載入游戲”, “選擇游戲文件”,“退出游戲”,“保存游戲文件”,“完成游戲”,“保存正確結(jié)果”,“自動
44、計(jì)算數(shù)獨(dú)結(jié)果”和“隨機(jī)生成新游戲數(shù)據(jù)”,同時,還有一個復(fù)選框按鈕,玩家可以通過打開此開關(guān)顯示輸入提示。該類通過消息映射機(jī)制,分別對每一個按鈕做了相應(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)//多線程計(jì)算數(shù)據(jù)結(jié)果</
46、p><p> void CSudokuDlg::OnBnClickedCompute()//自動計(jì)算數(shù)據(jù)結(jié)果</p><p> 6.2.3 Sudokugame類</p><p> 該類是數(shù)獨(dú)游戲的規(guī)則控制類,主要用于控制游戲數(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]; //保存用戶輸入數(shù)據(jù)</p><p> int m_bCompute; //判斷用戶是否終止自動計(jì)算</p><p> bool m_bExit; //標(biāo)志線程是否終止退出<
48、/p><p> void Initialize();//初始化</p><p> bool CheckInput(const int row, const int col, const int input); //判斷輸入的某個數(shù)據(jù)是否有效</p><p> bool CheckCell(const int row, const int col);
49、 //判斷某一個單元格是否有錯</p><p> bool CheckOriginalData(); //檢查原始數(shù)據(jù)的合法性</p><p> int GetInputNum(const int row, const int col, vector<int> &integer); //獲取某個單元格所有可輸入的整數(shù)<
50、/p><p> bool CheckTheResult(); //判斷用戶最終是否完成了游戲</p><p> bool ComputeResult(vector<vector<vector<int>>> &results); //自動計(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ì)算過程</p><
52、;p> void CreateSudokuData(); //自動隨機(jī)生產(chǎn)數(shù)據(jù)游戲數(shù)據(jù)</p><p> void CopyToUser(); //將原始數(shù)據(jù)拷貝到用戶數(shù)據(jù)</p><p><b> 生產(chǎn)游戲數(shù)據(jù)代碼:</b></p><p><b> 思路分析:</b>&
53、lt;/p><p> 首先,確定一個9*9的正方形盤。</p><p> 第一行:取1~9個數(shù)字,然后把數(shù)字打亂放好到每一行每個格子里面。</p><p> 第二行開始:(因?yàn)橛辛说谝恍械南拗?,所以第二行開始就不能亂填了)。這時可以建立一個函數(shù)專門用來填數(shù)字,從第一列開始到第9列結(jié)束。</p><p> 函數(shù)的實(shí)現(xiàn)過程基本是這樣的:首先生
54、產(chǎn)一個1到9的隨機(jī)數(shù),這時候判斷跟同一行前面填了的有沒有重復(fù)的,重復(fù)的重來,還要再判斷跟同一列的舔的數(shù)據(jù)有沒有重復(fù)的,重復(fù)的從來,總有一個會適合的。</p><p> //遞歸計(jì)算,用于生產(chǎn)數(shù)獨(dú)數(shù)據(jù)的中間計(jì)算過程</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> //自動隨機(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個隨機(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個的洞</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> //自動計(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> //獲取某個單元格中可以輸入的數(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> //檢查用戶是否正確完成數(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框架搭建,有著較好的界面顯示,可以給用戶更好的游戲體驗(yàn),相對于傳統(tǒng)的游戲設(shè)計(jì),游戲中加入了顯示輸入提示功能,可以幫助水平不高的玩具更容易的完成游戲,使初學(xué)者更容易完成數(shù)獨(dú)游戲,體驗(yàn)到數(shù)獨(dú)游戲的樂趣。</p><p><b> 8.結(jié)論</b></p><
105、;p> 畢業(yè)設(shè)計(jì)是對我們四年所學(xué)知識最后一次綜合性檢測盒實(shí)際應(yīng)用能力的考察。我們這次設(shè)計(jì)的課題是“數(shù)獨(dú)游戲的設(shè)計(jì)與開發(fā)”,該課題使我對所學(xué)的知識有了一個比較系統(tǒng)的認(rèn)識和理解。涉及了軟件工程,C++語言,數(shù)據(jù)庫等科目,綜合能力有了進(jìn)一步提高,同時使我學(xué)會了如何使用所學(xué)的知識去解決一些實(shí)際問題,增加了我們的動手能力。</p><p> 本次的數(shù)獨(dú)游戲雖然設(shè)計(jì)簡單,但是在這次設(shè)計(jì)中綜合了所學(xué)知識的理論和基礎(chǔ)。
106、通過對本次游戲的設(shè)計(jì),將所學(xué)的知識運(yùn)用到實(shí)際生活去了。從而知道自己對知識的掌握情況。經(jīng)這次設(shè)計(jì),讓專業(yè)知識與實(shí)踐結(jié)實(shí),讓專業(yè)知識得到了更好的消化和更牢固的掌握。而且我明白了知識不是單一的,它是相互聯(lián)系的,學(xué)科與學(xué)科之間都有著內(nèi)在聯(lián)系。計(jì)算機(jī)是一門非常復(fù)雜,龐大的學(xué)科,一項(xiàng)課題往往需要多項(xiàng)技術(shù)才可以完成。在設(shè)計(jì)階段,我通過對課程的深層分析與研究,使我又對多門技術(shù)有了一定的了解。在遇到困難時,我懂得了該怎么樣去應(yīng)付,如何去查找和分析相關(guān)資料
107、。</p><p> 在設(shè)計(jì)過程中,遇到了很多的各種問題,這不失是一種好的現(xiàn)象,因?yàn)樵谠O(shè)計(jì)時出現(xiàn)的問題越多,最后成功率就越大。常說在問題中進(jìn)步,在失敗中成長,亦是如此。</p><p> 在這次設(shè)計(jì)中我得到了老師和同學(xué)的指導(dǎo)和幫助,使我們認(rèn)識到團(tuán)隊(duì)精神的重要性,因?yàn)橐粋€人所學(xué)的知識不可能面面俱到的,只有通過合作,發(fā)揮自己的優(yōu)點(diǎn),體現(xiàn)團(tuán)隊(duì)精神,才能使工作做得更為出色。通過這次設(shè)計(jì),我學(xué)到
108、了許多書本上學(xué)不到的知識,增強(qiáng)了自己的動手能力和自信心。通過這次設(shè)計(jì)使我們能力有了很大的提高,為我們以后走上崗位打下了扎實(shí)的基礎(chǔ)</p><p> 非常感謝老師給我們這次鍛煉的機(jī)會,最后在老師的指導(dǎo)下完成了自己的設(shè)計(jì)任務(wù),但由于自己的知識水平有限,有許多不足之處,懇請老師多多指教!</p><p><b> 參考文獻(xiàn)</b></p><p>
109、; [1].羅斌,Visual C++編程技巧精選500例,北京:中國水利水電出版社,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++入門與提高,北京:人民郵電出版社,2002.6</p><p> [7].(美國)德洛拉,游戲編程精粹,人民郵電出版社,2003.12&l
111、t;/p><p> [8].(美國)斯塔勒,游戲編程中的數(shù)理應(yīng)用,紅旗出版社,2005.3</p><p> [9].(美國)柯姆斯,游戲編程精粹,人民郵電出版社,2005.3</p><p> [10].(美國)羅比斯,C++游戲編程,清華大學(xué)出版社,2004.9</p><p><b> 致謝</b></p
112、><p> 至此,數(shù)獨(dú)游戲的畢業(yè)設(shè)計(jì)已經(jīng)全部結(jié)束。這次畢業(yè)設(shè)計(jì)是對我大學(xué)四年來所學(xué)知識的回顧和總結(jié),在此基礎(chǔ)上進(jìn)行了綜合應(yīng)用和拓展。在這次畢業(yè)設(shè)計(jì)過程中,我掌握了一般游戲設(shè)計(jì)的方法,同時也對我實(shí)踐應(yīng)用能力提出來更高的要求,開拓了視野,拓展了知識面。再次感謝三年來對我辛勤培養(yǎng)和教育的所有老師,感謝給予我?guī)椭凸膭畹乃型瑢W(xué)。</p><p> 在設(shè)計(jì)過程中我得到了馮永老師和有關(guān)同學(xué)的支持和幫
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 數(shù)獨(dú)游戲的設(shè)計(jì)與開發(fā)【畢業(yè)論文】
- 數(shù)獨(dú)游戲畢業(yè)論文.doc
- 數(shù)獨(dú)游戲畢業(yè)論文.doc
- 畢業(yè)論文--基于sat的數(shù)獨(dú)游戲?qū)崿F(xiàn)
- c數(shù)獨(dú)游戲的設(shè)計(jì)與開發(fā)
- c++數(shù)獨(dú)游戲的設(shè)計(jì)與開發(fā)
- 基于android數(shù)獨(dú)游戲設(shè)計(jì)_畢業(yè)設(shè)計(jì)論文
- 畢業(yè)論文——猜數(shù)游戲軟件的設(shè)計(jì)開發(fā)
- 數(shù)獨(dú)游戲設(shè)計(jì)與源碼
- 課程設(shè)計(jì)報告--數(shù)獨(dú)小游戲的開發(fā)
- 黑白棋游戲設(shè)計(jì)與開發(fā)畢業(yè)論文
- 數(shù)獨(dú)游戲課程
- 畢業(yè)設(shè)計(jì)(論文)+手機(jī)游戲開發(fā)-java畢業(yè)論文
- 畢業(yè)論文范文——手機(jī)游戲(堡壘)的設(shè)計(jì)與開發(fā)
- 畢業(yè)論文——基于cocos的大富翁游戲設(shè)計(jì)與開發(fā)
- 數(shù)獨(dú)小游戲.zip
- 畢業(yè)論文-基于java的魔板游戲的設(shè)計(jì)與開發(fā)
- 畢業(yè)論文---- 基于j2me的手機(jī)游戲開發(fā)
- 游戲設(shè)計(jì)畢業(yè)論文
- 數(shù)獨(dú)游戲與城市設(shè)計(jì)的關(guān)聯(lián)性研究
評論
0/150
提交評論