版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
PAGE摘要本論文介紹了利用C語(yǔ)言編寫(xiě)數(shù)獨(dú)游戲的方法。系統(tǒng)的開(kāi)發(fā)設(shè)計(jì)使用了turboC作為開(kāi)發(fā)工具,根據(jù)數(shù)獨(dú)游戲特有的規(guī)則特點(diǎn)對(duì)游戲進(jìn)行設(shè)計(jì)。本文首先對(duì)開(kāi)發(fā)語(yǔ)言C語(yǔ)言進(jìn)行了做簡(jiǎn)單的介紹,并列舉了開(kāi)發(fā)語(yǔ)言優(yōu)于其他語(yǔ)言的特點(diǎn),其次對(duì)游戲進(jìn)行簡(jiǎn)單介紹,對(duì)游戲的計(jì)算機(jī)實(shí)現(xiàn)進(jìn)行分析。最后通過(guò)部分系統(tǒng)截圖和數(shù)據(jù)表格來(lái)介紹了系統(tǒng)的開(kāi)發(fā)設(shè)計(jì)過(guò)程以及系統(tǒng)的基本操作。并根據(jù)軟件工程的方法,從需求分析、概要設(shè)計(jì)、詳細(xì)設(shè)計(jì)、編碼實(shí)現(xiàn)等方面闡述了系統(tǒng)的開(kāi)發(fā)流程,并通過(guò)系統(tǒng)界面的截圖、數(shù)據(jù)表格等體現(xiàn)了我的設(shè)計(jì)思路,最后就系統(tǒng),測(cè)試運(yùn)行情況,測(cè)試運(yùn)行結(jié)果和系統(tǒng)開(kāi)發(fā)過(guò)程中的技術(shù)難點(diǎn)加以分析。數(shù)獨(dú)游戲C語(yǔ)言
AbstractThispaperintroducesthemethodofusingClanguagetowritesudokugame.ThedevelopmentofthesystemdesignusingturboCasadevelopmenttool,accordingtotherulesofsudokupeculiarcharacteristicsofgamedesign.ThisarticlefirsttothedevelopmentoflanguageClanguagetodosimpleintroduction,andliststhedevelopmentlanguageisbetterthanthatofotherlanguagefeatures,abriefintroductiontothesecondofthegame,thegameofcomputerimplementationareanalyzed.Finally,partofthesystemscreenshotsanddataformtothedevelopmentofthesystemdesignprocessareintroducedandthebasicoperationsystem.Andaccordingtothemethodofsoftwareengineering,fromthedemandanalysis,generaldesign,detaileddesign,coding,implementationaspectselaboratedthesystemdevelopmentprocess,andthroughthesysteminterfacescreenshots,dataformreflectedmydesignideas,suchasthefinalsystem,testrun,testrunresults,andanalyzethetechnicaldifficultiesintheprocessofsystemdevelopment.Keywords:Sudoku;Clanguage
目錄1引言 11.1簡(jiǎn)介 11.2數(shù)獨(dú)的起源 11.2.1拉丁方塊 11.2.2九宮圖 21.3數(shù)獨(dú)的發(fā)展 21.3.1Nikoli將其引入日本并命名為Sudoku 21.3.2Sudoku傳入英國(guó)并速度流行風(fēng)靡全球 31.3.3數(shù)獨(dú)游戲的流行及其與計(jì)算機(jī)的結(jié)合 32開(kāi)發(fā)環(huán)境及開(kāi)發(fā)工具 42.1C語(yǔ)言簡(jiǎn)介 42.2C語(yǔ)言優(yōu)于其他語(yǔ)言的特點(diǎn) 43系統(tǒng)的需求分析 63.1技術(shù)可行性 63.2操作可行性 63.2.1生成數(shù)獨(dú)題目的方法 63.2.2推導(dǎo)題目的方法 63.2.3數(shù)獨(dú)題目的變換 74用C語(yǔ)言編寫(xiě)數(shù)獨(dú)游戲程序 84.1設(shè)計(jì)思路 84.1.1總體思路 84.1.2過(guò)程分析: 84.2具體步驟與代碼 84.3測(cè)試運(yùn)行結(jié)果 15結(jié)果: 15總結(jié)及體會(huì): 17致謝 17參考文獻(xiàn) 11引言1.1簡(jiǎn)介數(shù)獨(dú)(Sudoku)是一種源自18世紀(jì)末的瑞士后在美國(guó)發(fā)展,并在日本得以發(fā)揚(yáng)光大的數(shù)學(xué)智力拼圖游戲。游戲拼圖有多種表現(xiàn)形式,現(xiàn)在流行的玩法主要以九宮格(即3格寬×3格高的正方形)為主,每一格又細(xì)分為一個(gè)九宮格。在每一個(gè)小九宮格中,分別填上1至9的數(shù)字,讓整個(gè)大九宮格每一列、每一行的數(shù)字都不重復(fù)。圖1-11.2數(shù)獨(dú)的起源1.2.1拉丁方塊據(jù)說(shuō)是大數(shù)學(xué)家歐拉(Euler)發(fā)明了數(shù)獨(dú)的最初版本,這與我們現(xiàn)在所熟知的在世界范圍內(nèi)廣為流傳的數(shù)獨(dú)游戲是一致的。但是在當(dāng)時(shí)(18世紀(jì)末)瑞士大數(shù)學(xué)家萊昂哈德.歐拉發(fā)明的“拉丁方塊”并沒(méi)有受到人們的重視。圖1-21.2.2九宮圖另一種關(guān)于數(shù)獨(dú)游戲起源的說(shuō)法是早在數(shù)千年前,中國(guó)人就發(fā)明了九宮圖。九宮圖又名洛書(shū)。其實(shí)在中國(guó)數(shù)獨(dú)的淵源比“拉丁方塊”更為久遠(yuǎn),還記得金庸的《射雕英雄傳》么?黃蓉在破解瑛姑的九宮圖時(shí)的“二四為肩,六八為足,左三右七,戴九履一,五居中央”,數(shù)獨(dú)對(duì)于中國(guó)人來(lái)說(shuō)已經(jīng)不是什么新鮮事了。相傳大禹治水時(shí)龍龜載洛書(shū)而出,夏禹受其啟發(fā)而成就一番偉業(yè)。我國(guó)關(guān)于數(shù)獨(dú)的最早文獻(xiàn)記載出現(xiàn)在漢朝,在流傳下來(lái)的當(dāng)時(shí)的書(shū)籍里就有就有“九宮格”在9個(gè)方格中,橫行和豎行的數(shù)字總和是相同的記載。圖1-3圖1-41.3數(shù)獨(dú)的發(fā)展1.3.1Nikoli將其引入日本并命名為Sudoku數(shù)獨(dú)游戲在1970年已經(jīng)由美國(guó)的一家數(shù)學(xué)邏輯游戲雜志首先發(fā)表,當(dāng)時(shí)名為NumberPlace。但在眾多填字游戲中并未引起特別注意。直到1984年,日本的填字游戲出版商N(yùn)ikoli公司的煅治真起從美國(guó)發(fā)現(xiàn)了這個(gè)游戲,決定引入日本并將其命名為Sudoku,意思是每個(gè)數(shù)字只能出現(xiàn)一次。這個(gè)游戲在日本開(kāi)始流行,數(shù)獨(dú)即為日語(yǔ)すうどく(Sudoku)的音譯(意譯其實(shí)也是),也就是只有一個(gè)數(shù)字的意思。1.3.2Sudoku傳入英國(guó)并速度流行風(fēng)靡全球數(shù)獨(dú)成為大眾的流行游戲,得歸功于香港高等法院法官高樂(lè)德(WayneGould)。2004年,他在日本旅行的時(shí)候,發(fā)現(xiàn)雜志上介紹的這款游戲,便帶回倫敦向《泰晤士報(bào)》推介并獲得接納。英國(guó)《每日郵報(bào)》也于三日后開(kāi)始連載,使數(shù)獨(dú)在英國(guó)正式掀起熱潮。很快,其他國(guó)家和地區(qū)受其影響也開(kāi)始風(fēng)靡數(shù)獨(dú)。1.3.3數(shù)獨(dú)游戲的流行及其與計(jì)算機(jī)的結(jié)合數(shù)獨(dú)的玩法邏輯簡(jiǎn)單,數(shù)字或符號(hào)的排列方式千變?nèi)f化,不少教育學(xué)者認(rèn)為數(shù)獨(dú)是鍛煉邏輯思維能力的上佳辦法。雖然數(shù)獨(dú)長(zhǎng)期以來(lái)一直是作為數(shù)學(xué)邏輯游戲在紙面上進(jìn)行,但卻可以用簡(jiǎn)單的程序編制出來(lái),非常適合于移植到數(shù)碼設(shè)備中。而且,玩家用簡(jiǎn)單的輸入設(shè)備就可以輕松操作,無(wú)需翻譯就能在全球各地進(jìn)行流通。除了英國(guó)《泰晤士報(bào)》發(fā)行的首款手機(jī)版數(shù)獨(dú)游戲,一些游戲軟件開(kāi)發(fā)公司紛紛開(kāi)發(fā)出不同計(jì)算機(jī)版本的數(shù)獨(dú)游戲,以及在線網(wǎng)絡(luò)數(shù)獨(dú)游戲?qū)⑵涮峁┙o廣大玩家。位于英國(guó)的S游戲軟件公司表示,已經(jīng)在全球賣出了7500套數(shù)獨(dú)游戲,而且來(lái)自用戶的興趣還在增加。
2開(kāi)發(fā)環(huán)境及開(kāi)發(fā)工具2.1C語(yǔ)言簡(jiǎn)介C語(yǔ)言是一種計(jì)算機(jī)程序設(shè)計(jì)語(yǔ)言。它既有高級(jí)語(yǔ)言的特點(diǎn),又具有匯編語(yǔ)言的特點(diǎn)。它可以作為系統(tǒng)設(shè)計(jì)語(yǔ)言,編寫(xiě)工作系統(tǒng)應(yīng)用程序,也可以作為應(yīng)用程序設(shè)計(jì)語(yǔ)言,編寫(xiě)不依賴計(jì)算機(jī)硬件的應(yīng)用程序。因此,它的應(yīng)用范圍廣泛。2.2C語(yǔ)言優(yōu)于其他語(yǔ)言的特點(diǎn)1.簡(jiǎn)潔緊湊、靈活方便
C語(yǔ)言一共只有32個(gè)關(guān)鍵字,9種控制語(yǔ)句,程序書(shū)寫(xiě)自由,主要用小寫(xiě)字母表示。它把高級(jí)語(yǔ)言的基本結(jié)構(gòu)和語(yǔ)句與低級(jí)語(yǔ)言的實(shí)用性結(jié)合起來(lái)。C語(yǔ)言可以象匯編語(yǔ)言一樣對(duì)位、字節(jié)和地址進(jìn)行操作,而這三者是計(jì)算機(jī)最基本的工作單元。
2.運(yùn)算符豐富
C的運(yùn)算符包含的范圍很廣泛,共有種34個(gè)運(yùn)算符。C語(yǔ)言把括號(hào)、賦值、強(qiáng)制類型轉(zhuǎn)換等都作為運(yùn)算符處理。從而使C的運(yùn)算類型極其豐富表達(dá)式類型多樣化,靈活使用各種運(yùn)算符可以實(shí)現(xiàn)在其它高級(jí)語(yǔ)言中難以實(shí)現(xiàn)的運(yùn)算。
3.數(shù)據(jù)結(jié)構(gòu)豐富
C的數(shù)據(jù)類型有:整型、實(shí)型、字符型、數(shù)組類型、指針類型、結(jié)構(gòu)體類型、共用體類型等。能用來(lái)實(shí)現(xiàn)各種復(fù)雜的數(shù)據(jù)類型的運(yùn)算。并引入了指針概念,使程序效率更高。另外C語(yǔ)言具有強(qiáng)大的圖形功能,支持多種顯示器和驅(qū)動(dòng)器。且計(jì)算功能、邏輯判斷功能強(qiáng)大。
4.C是結(jié)構(gòu)式語(yǔ)言
結(jié)構(gòu)式語(yǔ)言的顯著特點(diǎn)是代碼及數(shù)據(jù)的分隔化,即程序的各個(gè)部分除了必要的信息交流外彼此獨(dú)立。這種結(jié)構(gòu)化方式可使程序?qū)哟吻逦?便于使用、維護(hù)以及調(diào)試。C語(yǔ)言是以函數(shù)形式提供給用戶的,這些函數(shù)可方便的調(diào)用,并具有多種循環(huán)、條件語(yǔ)句控制程序流向,從而使程序完全結(jié)構(gòu)化。
5.C語(yǔ)法限制不太嚴(yán)格、程序設(shè)計(jì)自由度大
一般的高級(jí)語(yǔ)言語(yǔ)法檢查比較嚴(yán),能夠檢查出幾乎所有的語(yǔ)法錯(cuò)誤。而C語(yǔ)言允許程序編寫(xiě)者有較大的自由度。
6.C語(yǔ)言允許直接訪問(wèn)物理地址,可以直接對(duì)硬件進(jìn)行操作
因此既具有高級(jí)語(yǔ)言的功能,又具有低級(jí)語(yǔ)言的許多功能,能夠象匯編語(yǔ)言一樣對(duì)位、字節(jié)和地址進(jìn)行操作,而這三者是計(jì)算機(jī)最基本的工作單元,可以用來(lái)寫(xiě)系統(tǒng)軟件。
7.C語(yǔ)言程序生成代碼質(zhì)量高,程序執(zhí)行效率高
一般只比匯編程序生成的目標(biāo)代碼效率低10へ20%。
8.C語(yǔ)言適用范圍大,可移植性好
C語(yǔ)言有一個(gè)突出的優(yōu)點(diǎn)就是適合于多種操作系統(tǒng),如DOS、UNIX,也適用于多種機(jī)型。
當(dāng)然,C語(yǔ)言也有自身的不足,比如:C語(yǔ)言的語(yǔ)法限制不太嚴(yán)格,對(duì)變量的類型約束不嚴(yán)格,影響程序的安全性,對(duì)數(shù)族下標(biāo)越界不作檢查等。從應(yīng)用的角度,C語(yǔ)言比其他高級(jí)語(yǔ)言較難掌握。
總之,C語(yǔ)言既有高級(jí)語(yǔ)言的特點(diǎn),又具有匯編語(yǔ)言的特點(diǎn);既是一個(gè)成功的系統(tǒng)設(shè)計(jì)語(yǔ)言,又是一個(gè)使用的程序設(shè)計(jì)語(yǔ)言;既能用來(lái)編寫(xiě)不依賴計(jì)算機(jī)硬件的應(yīng)用程序,又能用來(lái)編寫(xiě)各種系統(tǒng)程序;是一種受歡迎、應(yīng)用廣泛的程序設(shè)計(jì)語(yǔ)言C語(yǔ)言版本。
3系統(tǒng)的需求分析“數(shù)獨(dú)”,即“獨(dú)立的數(shù)字”的省略,在一個(gè)9x9的方格中,有81個(gè)小方格組成,然后又分9個(gè)大塊,每塊由3x3的方格組成,就是九宮圖,大九宮里面再套9個(gè)小九宮,共九九八十一個(gè)小格子,游戲開(kāi)始前會(huì)有一些格子上寫(xiě)好了數(shù),你需要在剩下的格子里填數(shù),真到把所有格子填滿,并且要求,任何一行或一列或者一個(gè)小九宮中沒(méi)有相同的數(shù)字。3.1技術(shù)可行性利用C語(yǔ)言的邏輯性,用簡(jiǎn)潔的程序來(lái)描述復(fù)雜的變換。只要根據(jù)數(shù)獨(dú)游戲的邏輯性來(lái)編寫(xiě),先得到一個(gè)完整的數(shù)獨(dú),然后根據(jù)難度需要,隨機(jī)地挖一些空格出來(lái)。便可以得到唯一解的數(shù)獨(dú)。3.2操作可行性3.2.1生成數(shù)獨(dú)題目的方法產(chǎn)生數(shù)獨(dú)題目的方法是從答案反推題目。為了便于理解,可以先從2×2的4個(gè)四宮格(共16個(gè)宮格)開(kāi)始思考、推論。以2×2個(gè)四宮格的數(shù)獨(dú)解為例,為了方便解說(shuō),把方陣內(nèi)的數(shù)字位置分區(qū)塊為A區(qū)、B區(qū)、C區(qū)、D區(qū),如圖所示圖3-13.2.2推導(dǎo)題目的方法任意選取一個(gè)空格,并將此空格內(nèi)的數(shù)字挖掉。例如將(3,3)位置的數(shù)字4挖掉,如圖3所示。 觀察B區(qū)的四宮格可以發(fā)現(xiàn),不管(2,2)位置的數(shù)字4是否存在,為了確定(4,1)位置挖掉的數(shù)字4,(3,1)位置的數(shù)字2必須存在,如圖4所示。 圖3-2挖掉(3,3)位置的數(shù)字4圖3-3保留(3,1)位置的數(shù)字2 觀察A區(qū)的四宮格,由于(3,1)位置的數(shù)字2已存在,為了要找到(1,2)位置的數(shù)字2,則(2,2)位置的數(shù)字4必須存在,如圖5所示。 觀察C區(qū)的四宮格,由于(2,2)位置的數(shù)字4已存在,為了要找到(1,4)位置的數(shù)字4,則(1,3)位置的數(shù)字3必須存在,如圖6所示。 圖3-4保留(2,2)位置的數(shù)字4圖3-5保留(1,3)位置的數(shù)字3 觀察D區(qū)的四宮格,由于(1,3)位置的數(shù)字3已存在,為了要找到(3,4)位置的數(shù)字3,則(4,4)位置的數(shù)字1必須存在,如圖7所示。3.2.3數(shù)獨(dú)題目的變換 經(jīng)過(guò)這5個(gè)步驟可以發(fā)現(xiàn):只需要提供這4個(gè)位置的數(shù)字就可以得出一個(gè)唯一解的數(shù)獨(dú)謎題,如圖8所示。另外,通過(guò)以下形式的變換方式,仍然可以得到唯一解的數(shù)獨(dú)謎題。 圖3-6保留(4,4)位置的數(shù)字1圖3-7最終謎題 (1)行列交換:將同一四宮格內(nèi)的行列交換,例如,將第1、2列互調(diào);第3、4列互調(diào);第1、2行互調(diào);第3、4行互調(diào),如圖9和圖10所示。標(biāo)準(zhǔn)3×3個(gè)九宮格的數(shù)獨(dú)謎題的推出原理與此相同,但過(guò)程比較復(fù)雜。(2)數(shù)字替換:例如數(shù)字1換4;數(shù)字2換3,如圖11所示。圖3-8行變換圖3-9列變換圖3-10數(shù)字變換
4用C語(yǔ)言編寫(xiě)數(shù)獨(dú)游戲程序4.1設(shè)計(jì)思路4.1.1總體思路先得到一個(gè)完整的數(shù)獨(dú),然后根據(jù)難度需要,隨機(jī)地挖一些空格出來(lái),然后判斷是否符合條件(游戲規(guī)則),循環(huán)再輸出。4.1.2過(guò)程分析:首先,確定一個(gè)9×9的正方形盤(pán)。第一行:取1~9個(gè)數(shù)字,然后把數(shù)字打亂放好到每一行每個(gè)格子里面。第二行開(kāi)始:(因?yàn)橛辛说谝恍械南拗?,所以第二行開(kāi)始就不能亂填了)。這時(shí)可以選擇建立一個(gè)函數(shù)專門(mén)用來(lái)填數(shù)字,從第一列開(kāi)始到第9列結(jié)束。函數(shù)的實(shí)現(xiàn)過(guò)程基本是這樣的:首先生成一個(gè)隨機(jī)數(shù),1到9,這時(shí)候判斷跟同一行前面填了的有沒(méi)有重復(fù)的,重復(fù)的重來(lái),還要再判斷跟同一列的填的有沒(méi)有重復(fù),重復(fù)的從來(lái),總有一個(gè)會(huì)適合的。數(shù)都生成好了,然后游戲的時(shí)候隨機(jī)把一些數(shù)遮蓋?。ㄉ煽崭瘢袛嗵钊雽?duì)不對(duì)。4.2具體步驟與代碼#include<stdio.h>#include<stdlib.h>intsudoku[81];//數(shù)獨(dú)題目陣列inttempNum[81];//上一次填數(shù)位置inttempSp=0;//上一次填數(shù)位置指標(biāo)intstartH[81];//列位置的起點(diǎn)intstartV[81];//行位置的起點(diǎn)intstartB[81];//九宮格位置的起點(diǎn)intaddH[9];//列位置的加值intaddV[9];//行位置的加值intaddB[9];//九宮格位置的加值intmain(intargc,char*argv[]){intj;if(argc>1)for(j=0;j<81;j++)sudoku[j]=argv[1][j]-'0';elseexit(0);printf("\n");printSudoku(sudoku);init();//參數(shù)設(shè)定tryAns();//測(cè)試求解printf("\n");printSudoku(sudoku);printf("\n");}intinit(){//參數(shù)設(shè)定(設(shè)定這些參數(shù)之后,無(wú)論檢查行、列、九宮格都方便多了)inti;for(i=0;i<81;i++){startH[i]=i/9*9;//列位置的起點(diǎn)startV[i]=i%9;//行位置的起點(diǎn)startB[i]=((i/9)/3)*27+((i%9)/3)*3;//九宮格位置的起點(diǎn)}for(i=0;i<9;i++){addH[i]=i;//列位置的加值addV[i]=i*9;//行位置的加值addB[i]=(i/3)*9+(i%3);//九宮格位置的加值}}intprintSudoku(int*prn){//印出數(shù)獨(dú)題目(陣列內(nèi)容)inti;for(i=0;i<81;i++){printf("%2d",prn[i]);if(i%9==8)printf("\n");}}inttryAns(){//測(cè)試求解intsp=getNextBlank(-1);//取得第一個(gè)空白的位置開(kāi)始填入數(shù)字do{sudoku[sp]++;//將本位置數(shù)字加1if(sudoku[sp]>9){//如果本位置的數(shù)字已大於9時(shí)則回到上一個(gè)位置繼續(xù)測(cè)試sudoku[sp]=0;sp=pop();}else{if(check(sp)==0){//如果同行、列、九宮格都沒(méi)有相同的數(shù)字,則到下一個(gè)空白處繼續(xù)push(sp);//當(dāng)然,如果發(fā)現(xiàn)有相同的數(shù)字時(shí),就需把原位置的數(shù)字加1(所以本處什麼都不做)sp=getNextBlank(sp);}}}while(sp>=0&&sp<81);}intgetNextBlank(intsp){//取得下一個(gè)空白的位置do{sp++;}while(sp<81&&sudoku[sp]>0);return(sp);}intcheck(intsp){//檢查同行、列、九宮格有沒(méi)有相同的數(shù)字,若有傳回1intfg=0;if(!fg)fg=check1(sp,startH[sp],addH);//檢查同列有沒(méi)有相同的數(shù)字if(!fg)fg=check1(sp,startV[sp],addV);//檢查同行有沒(méi)有相同的數(shù)字if(!fg)fg=check1(sp,startB[sp],addB);//檢查同九宮格有沒(méi)有相同的數(shù)字return(fg);}intcheck1(intsp,intstart,int*addnum){//檢查指定的行、列、九宮格有沒(méi)有相同的數(shù)字,若有傳回1intfg=0,i,sp1;for(i=0;i<9;i++){sp1=start+addnum[i];if(sp!=sp1&&sudoku[sp]==sudoku[sp1])fg++;}return(fg);}intpush(intsp){//將指定的位置放入堆疊中tempNum[tempSp++]=sp;}intpop(){//取出堆疊中的上一個(gè)位置if(tempSp<0)return(-1);elsereturn(tempNum[--tempSp]);}publicclassShuDu{/**存儲(chǔ)數(shù)字的數(shù)組*/staticint[][]n=newint[9][9];/**生成隨機(jī)數(shù)字的源數(shù)組,隨機(jī)數(shù)字從該數(shù)組中產(chǎn)生*/staticint[]num={1,2,3,4,5,6,7,8,9};publicstaticvoidmain(String[]args){//生成數(shù)字for(inti=0;i<9;i++){//嘗試填充的數(shù)字次數(shù)inttime=0;//填充數(shù)字for(intj=0;j<9;j++){//產(chǎn)生數(shù)字n[i][j]=generateNum(time);//如果返回值為0,則代表卡住,退回處理//退回處理的原則是:如果不是第一列,則先倒退到前一列,否則倒退到前一行的最后一列if(n[i][j]==0){//不是第一列,則倒退一列if(j>0){j-=2;continue;}else{//是第一列,則倒退到上一行的最后一列i--;j=8;continue;}}//填充成功if(isCorret(i,j)){//初始化time,為下一次填充做準(zhǔn)備time=0;}else{//繼續(xù)填充//次數(shù)增加1time++;//繼續(xù)填充當(dāng)前格j--;}}}//輸出結(jié)果for(inti=0;i<9;i++){for(intj=0;j<9;j++){System.out.print(n[i][j]+"");}System.out.println();}}/***是否滿足行、列和3X3區(qū)域不重復(fù)的要求*@paramrow行號(hào)*@paramcol列號(hào)*@returntrue代表符合要求*/publicstaticbooleanisCorret(introw,intcol){return(checkRow(row)&checkLine(col)&checkNine(row,col));}/***檢查行是否符合要求*@paramrow檢查的行號(hào)*@returntrue代表符合要求*/publicstaticbooleancheckRow(introw){for(intj=0;j<8;j++){if(n[row][j]==0){continue;}for(intk=j+1;k<9;k++){if(n[row][j]==n[row][k]){returnfalse;}}}returntrue;}/***檢查列是否符合要求*@paramcol檢查的列號(hào)*@returntrue代表符合要求*/publicstaticbooleancheckLine(intcol){for(intj=0;j<8;j++){if(n[j][col]==0){continue;}for(intk=j+1;k<9;k++){if(n[j][col]==n[k][col]){returnfalse;}}}returntrue;}/***檢查3X3區(qū)域是否符合要求*@paramrow檢查的行號(hào)*@paramcol檢查的列號(hào)*@returntrue代表符合要求*/publicstaticbooleancheckNine(introw,intcol){//獲得左上角的坐標(biāo)intj=row/3*3;intk=col/3*3;//循環(huán)比較for(inti=0;i<8;i++){if(n[j+i/3][k+i%3]==0){continue;}for(intm=i+1;m<9;m++){if(n[j+i/3][k+i%3]==n[j+m/3][k+m%3]){returnfalse;}}}returntrue;}/***產(chǎn)生1-9之間的隨機(jī)數(shù)字*規(guī)則:生成的隨機(jī)數(shù)字放置在數(shù)組8-time下標(biāo)的位置,隨著time的增加,已經(jīng)嘗試過(guò)的數(shù)字將不會(huì)在取到*說(shuō)明:即第一次次是從所有數(shù)字中隨機(jī),第二次時(shí)從前八個(gè)數(shù)字中隨機(jī),依次類推,*這樣既保證隨機(jī),也不會(huì)再重復(fù)取已經(jīng)不符合要求的數(shù)字,提高程序的效率*這個(gè)規(guī)則是本算法的核心*@paramtime填充的次數(shù),0代表第一次填充*@return*/publicstaticintgenerateNum(inttime){//第一次嘗試時(shí),初始化隨機(jī)數(shù)字源數(shù)組if(time==0){for(inti=0;i<9;i++){num[i]=i+1;}}//第10次填充,表明該位置已經(jīng)卡住,則返回0,由主程序處理退回if(time==9){return0;}//不是第一次填充//生成隨機(jī)數(shù)字,該數(shù)字是數(shù)組的下標(biāo),取數(shù)組num中該下標(biāo)對(duì)應(yīng)的數(shù)字為隨機(jī)數(shù)字intranNum=(int)(Math.random()*(9-time));//把數(shù)字放置在數(shù)組倒數(shù)第time個(gè)位置,inttemp=num[8-time];num[8-time]=num[ranNum];num[ranNum]=temp;//返回?cái)?shù)字returnnum[8-time];}}4.3測(cè)試運(yùn)行結(jié)果結(jié)果:隨機(jī)生成一個(gè)數(shù)獨(dú),輸入空格數(shù)40
[]<7><8>[][][][][]<6>
<6><3>[]<7>[]<2><8>[]<5>
<2>[][]<8>[][][][]<9>
<3><9>[]<1>[][]<2><5>[]
[][][]<2><5><4><6>[]<3>
<4>[][][][][]<7><1>[]
[][][]<4><7>[][]<3><1>
<9><4>[]<6><2><1><5><8>[]
[]<1><7><9><3>[][]<6><2>
開(kāi)始解數(shù)獨(dú):
<1><7><8><5><4><9><3><2><6>
<6><3><9><7><1><2><8><4><5>
<2><5><4><8><6><3><1><7><9>
<3><9><6><1><8><7><2><5><4>
<7><8><1><2><5><4><6><9><3>
<4><2><5><3><9><6><7><1><8>
<5><6><2><4><7><8><9><3><1>
<9><4><3><6><2><1><5
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 教科版四年級(jí)下冊(cè)科學(xué)科學(xué)教案+教材分析
- 2018年Q1中國(guó)移動(dòng)互聯(lián)網(wǎng)行業(yè)發(fā)展分析報(bào)告
- 能源有限公司企業(yè)標(biāo)準(zhǔn):基本建設(shè)管理標(biāo)準(zhǔn)
- 修繕協(xié)議書(shū)(2篇)
- 公共關(guān)系咨詢合同(2篇)
- 酒店租賃協(xié)議
- 房屋場(chǎng)地租賃合同書(shū)模板
- 博覽會(huì)總贊助協(xié)議書(shū)
- 土方車租賃合同
- 2025年金屬壓力及大型容器合作協(xié)議書(shū)
- GB/T 16823.3-2010緊固件扭矩-夾緊力試驗(yàn)
- GB/T 1446-2005纖維增強(qiáng)塑料性能試驗(yàn)方法總則
- 透水混凝土工程檢驗(yàn)批質(zhì)量驗(yàn)收記錄表
- 2023年中荊投資控股集團(tuán)有限公司招聘筆試模擬試題及答案解析
- DPP-4抑制劑的臨床應(yīng)用及優(yōu)勢(shì)解析課件
- 《起重吊裝方案編制》課件
- 光伏扶貧項(xiàng)目可行性研究報(bào)告
- 鈑金沖壓件質(zhì)量要求
- 2022年高考全國(guó)甲卷語(yǔ)文試題評(píng)講課件55張
- 欠條(標(biāo)準(zhǔn)模版)
- 深圳京基·KKmall市場(chǎng)考察報(bào)告(45頁(yè)
評(píng)論
0/150
提交評(píng)論