版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、C語(yǔ)言程序設(shè)計(jì)報(bào)告題目:掃雷游戲班級(jí):網(wǎng) 101組長(zhǎng):成員:,日期: 目錄一基本情況二游戲規(guī)則三設(shè)計(jì)思路四函數(shù)說(shuō)明1. 游戲控制部分2. 圖形處理部分3. 鼠標(biāo)處理部分五調(diào)試與測(cè)試六附錄一基本情況 開(kāi)發(fā)平臺(tái): win-tc(windows-xp) 開(kāi)發(fā)進(jìn)度: 小組進(jìn)行圖形處理及鼠標(biāo)相關(guān)資料收集, 掌握相關(guān)圖形處理及 鼠標(biāo)相關(guān)技術(shù)小組成員討論程序?qū)崿F(xiàn)算法及任務(wù)分配代碼實(shí)現(xiàn),調(diào)試任務(wù)劃分:陳超 負(fù)責(zé)程序總體設(shè)計(jì),游戲控制部分實(shí)現(xiàn),后期調(diào)試張艷 負(fù)責(zé)程序圖形處理及鼠標(biāo)處理部分實(shí)現(xiàn),總結(jié)文檔編寫(xiě)二游戲規(guī)則 玩家進(jìn)入游戲界面后,只能通過(guò)鼠標(biāo)進(jìn)行操作,一旦有鍵盤(pán)輸入,則退出游 戲程序。游戲框圖左上方顯示的
2、數(shù)字為此局游戲中包含的地雷數(shù)目。中間黃 色笑臉為重新開(kāi)始按鈕,一旦鼠標(biāo)左鍵單擊此位置,則退出正在進(jìn)行的掃雷 游戲,游戲重新開(kāi)始。游戲中包含 10*10 個(gè)空格,可以通過(guò)鼠標(biāo)左鍵單擊或 者右鍵單擊來(lái)進(jìn)行掃雷游戲。鼠標(biāo)單擊表示打開(kāi)此空格位置,若此位置為地 雷,則輸出所有的地雷分布,玩家輸,游戲結(jié)束,等待玩家的選擇退出或者 繼續(xù)開(kāi)始下一次游戲。若此位置已經(jīng)被左單擊過(guò),則再次進(jìn)行鼠標(biāo)左鍵單擊 時(shí),游戲不做任何響應(yīng)。單擊過(guò)后若此位置無(wú)雷則顯示空格或者數(shù)字。空格 表示此處無(wú)雷,數(shù)字表示此處無(wú)雷且周?chē)藗€(gè)格子中的地雷數(shù)目為空格中的 數(shù)字?jǐn)?shù)目,若某個(gè)空格周?chē)鄾](méi)有地雷分布則繼續(xù)以每個(gè)方格為中心繼續(xù)判 斷無(wú)雷就
3、展開(kāi),顯示數(shù)字或者空格,直至遇到地雷或者是邊界。鼠標(biāo)右鍵單 擊表示游戲玩家標(biāo)識(shí)此位置為地雷,若游戲玩家在某位置右鍵單擊過(guò)之后, 再次右鍵單擊此位置,則表示取消此處標(biāo)注的地雷標(biāo)志,若在此處鼠標(biāo)左鍵 單擊,不做任何響應(yīng)。游戲玩家依次對(duì)每一個(gè)空格,當(dāng)游戲玩家把所有的非 雷區(qū)域全部處理完畢,則游戲結(jié)束,玩家勝利,輸出“ YOU WIN”,等待玩家 進(jìn)一步選擇。三設(shè)計(jì)思路掃雷程序主要用了一個(gè) 10 行 10 列的二維數(shù)組,數(shù)組的每個(gè)元素都是結(jié)構(gòu) 體類(lèi)型,結(jié)構(gòu)體中的 num 代表格內(nèi)當(dāng)前處于什么狀態(tài),值 1 表示有雷,值 0 表 示已經(jīng)變成空白格或者顯示過(guò)數(shù)字, roundnum 統(tǒng)計(jì)每個(gè)格子周?chē)卸嗌俚?/p>
4、雷, flag 是鼠標(biāo)右鍵的標(biāo)志,如果鼠標(biāo)左鍵單擊此方格,則對(duì)應(yīng)的二維數(shù)組結(jié)構(gòu)體里 的 flag 為 1 表示格子顯示紅旗,這樣鼠標(biāo)左鍵點(diǎn)擊在這個(gè)格子上無(wú)效。首先通過(guò)生成隨機(jī)數(shù)的方式布置地雷,如果在該點(diǎn)生成的隨機(jī)數(shù)為 1,則該 點(diǎn)存在地雷,將 NUM(結(jié)構(gòu)體)標(biāo)為 1,隨機(jī)數(shù)為其它值 NUM(結(jié)構(gòu)體)標(biāo)為 0,每生成一個(gè)地雷,則全局變量 minenum 自增一。在程序一開(kāi)始統(tǒng)計(jì)好每個(gè)格子周?chē)卸嗌俚乩祝瑢⒔y(tǒng)計(jì)的結(jié)果存放在對(duì)應(yīng) 的結(jié)構(gòu)體變量 roundnum, 然后當(dāng)鼠標(biāo)左鍵點(diǎn)擊在沒(méi)有地雷的格子上時(shí)進(jìn)行兩種 判斷,如果格子周?chē)鷽](méi)有地雷, 就在原來(lái)的格子位置顯示空白格, 然后用遞歸的 方法同樣判斷
5、周?chē)?8 個(gè)格子;如果格子周?chē)械乩祝?就在該空格顯示具體的雷 數(shù)。在遞歸判斷 8 個(gè)格子時(shí),如果格子上有雷或者格子已經(jīng)顯示過(guò)雷數(shù)或者空 白,以及格子上有紅旗標(biāo)志的話(huà),就不再對(duì)格子進(jìn)行任何判斷。否則,當(dāng)此處無(wú) 雷,即展開(kāi)此處,并且以此位置為中心繼續(xù)進(jìn)行遞歸,直至遇到邊界或者地雷, 跳出遞歸。當(dāng)游戲玩家每處理一個(gè)非雷區(qū)域的格子,則對(duì)應(yīng)的統(tǒng)計(jì)非雷方格數(shù)目的變 量自減一,當(dāng)該變量的值自減為 0 時(shí),則表示游戲結(jié)束,該玩家勝利。具體函數(shù)流程圖如下:Main四函數(shù)說(shuō)明 游戲控制部分Amain()主函數(shù) 定義使用到的常數(shù),全局變量,函數(shù)原型說(shuō)明。然后初始化圖形系統(tǒng),調(diào) 用游戲控制函數(shù),按任意鍵結(jié)束游戲,
6、關(guān)閉圖形系統(tǒng),游戲結(jié)束。Bvoid SpreadMine(int t)布雷函數(shù)通過(guò)函數(shù) srand(int)time(0); 生成隨機(jī)數(shù), 隨后在二重循環(huán)里, 生成隨機(jī) 數(shù),若生成的隨機(jī)數(shù)為 1,則將 num(結(jié)構(gòu)體)標(biāo)為 1,表示改點(diǎn)有雷,并在該 函數(shù)內(nèi)統(tǒng)計(jì)該次游戲中地雷總數(shù),通過(guò) outtextxy(210,70,randminenum); 在(210, 70)點(diǎn)輸出雷的總數(shù), 用一百減去總雷數(shù)表示該次無(wú)雷空格的總數(shù) (在輸贏判斷 中,若所有無(wú)雷區(qū)域都已經(jīng)得到了處理,即玩家勝利) 。C. void GameOver(游) 戲結(jié)束 如果單擊了地雷,則地雷爆炸,游戲結(jié)束,顯示地雷分布,兩重循環(huán)
7、 判斷每個(gè)格子的狀態(tài),如果狀態(tài)值為 1,則為地雷,設(shè)置紅色背景,實(shí)體填充模 式,畫(huà)圓表示地雷。D. void GameWin()玩家勝利win 信息。,就表示游戲玩家勝利,輸出youGameBegain()游戲開(kāi)始這個(gè)函數(shù)完成初始界面的設(shè)計(jì)以及調(diào)用函數(shù) void SpreadMine(int t) 生成 地雷。初始界面的主要工作是確定圖的位置和方格顯示的位置。 外邊框的左上角 為( 190,60),右上角坐標(biāo)為( 390,290),顯示笑臉和地雷數(shù)的區(qū)域?yàn)椋?190,60)(390,90),每個(gè)方格的寬度和高度均為 16.Fvoid ShowWhite(int i,int j)顯示空白區(qū)域當(dāng)單
8、擊某個(gè)格子, 該格子周?chē)牡乩讛?shù)為 0時(shí),應(yīng)該繼續(xù)判斷它周?chē)?8 個(gè)方 向的格子的周?chē)睦讛?shù)是否為 0,將這些格子都用空白顯示。具體實(shí)現(xiàn)如下: a 如果當(dāng)前格子有紅旗或者已經(jīng)顯示過(guò)數(shù)字或空白格子,則返回。b 空白格子數(shù)減一(統(tǒng)計(jì)處理過(guò)多少格子) 。c 如果周?chē)牡乩讛?shù)為 0 ,且它不是地雷,則將它顯示為空白,同時(shí)將它的狀 態(tài)值 num 置 0,表示處理過(guò);如果周?chē)乩讛?shù)不為 0,顯示周?chē)乩讛?shù),同時(shí)將 它的狀態(tài)值 num 置 0,表示處理過(guò),返回。Gvoid Control()調(diào)用函數(shù) GameBegain()顯示游戲初始化界面,調(diào)用 GamePlay()函數(shù) 具體實(shí)現(xiàn)游戲操作, 該函數(shù)的返回
9、值有可能有兩種: 一是正在玩中, 提前結(jié)束游 戲;一是玩完,要么失敗,要么勝利。如果是前者,則重新開(kāi)始游戲。如果是后 者,則判斷是否單擊了笑臉,是則重新開(kāi)始,否則結(jié)束程序。Hvoid GamePlay()游戲控制 游戲過(guò)程主要是對(duì)鼠標(biāo)按鍵的處理,集體算法實(shí)現(xiàn)如下: a.如果單擊了鼠標(biāo)左鍵則判斷如果單擊了笑臉,則游戲重新開(kāi)始如果單擊了方格, 判斷該格子有紅旗, 則按鍵無(wú)效。 如果單擊的格子沒(méi)有顯示 過(guò)數(shù)字或空白, 則判斷:如果是地雷, 游戲結(jié)束,顯示地雷分布;如果不是地雷, 則統(tǒng)計(jì)周?chē)?8 個(gè)方向)的地雷數(shù),如果周?chē)乩讛?shù)為 0,條用遞歸函數(shù) ShowWhite ()處理周?chē)褡拥那闆r, 顯示
10、周?chē)母褡訑?shù)或者空白。 如果單擊的格子周?chē)?雷數(shù)不為 0,則顯示周?chē)乩讛?shù),將處理過(guò)的格子做標(biāo)記。如果處理完所有的格子嗎,則游戲勝利,顯示勝利信息b.如果單擊鼠標(biāo)右鍵,該格子沒(méi)有紅旗則顯示紅旗。如果有紅旗,再擊右鍵,則紅旗消失c 重復(fù)步驟 b 直到按鍵結(jié)束游戲Iint MineStatistics(int i,int j)統(tǒng)計(jì)每個(gè)格子周?chē)牡乩讛?shù),分別考慮各自處于四個(gè)角,四條邊以及 中間某個(gè)位置的情況。周?chē)巧?,下,左,右,左上,左下,右上,右下。在統(tǒng) 計(jì)四個(gè)角格子周?chē)牡乩讛?shù)目時(shí), 統(tǒng)計(jì)其周?chē)娜齻€(gè)方格內(nèi)是否有地雷, 如統(tǒng)計(jì) 左上角位置周?chē)牡乩讛?shù)目時(shí),其周?chē)娜齻€(gè)方格的二維坐標(biāo)依次為(i
11、, j+1),( i+1,j),(i+1,j+1)(設(shè)該位置坐標(biāo)為( i,j)。而統(tǒng)計(jì)四條邊上某一空格周?chē)?的地雷數(shù)目時(shí), 則統(tǒng)計(jì)其周?chē)奈鍌€(gè)方格是否有地雷, 如統(tǒng)計(jì)左邊的邊上某位置 的地雷數(shù)目時(shí),其周?chē)奈鍌€(gè)方格的二維坐標(biāo)依次為( i-1,j),(i-1,j+1),(i, j+1), (i+1,j),(i+1,j+1) (設(shè)該位置坐標(biāo)為( i,j)。而統(tǒng)計(jì)普通位置時(shí)要統(tǒng)計(jì)其 周?chē)木艂€(gè)方格內(nèi)是否有地雷,則該點(diǎn)周?chē)木艂€(gè)坐標(biāo)依次為( i-1, j-1),( i-1, j),(i-1,j+1),(i,j-1),(i,j+1),(i+1,j-1),(i+1,j-1),(i+1,j),(i+1,j+
12、1). 統(tǒng)計(jì)完成后,將統(tǒng)計(jì)結(jié)果存入對(duì)應(yīng)的結(jié)構(gòu)體的 roundnum 變量中去。2.圖形處理部分A void Init() 對(duì)計(jì)算機(jī)進(jìn)行圖形模式初始化,加載圖形驅(qū)動(dòng)包B void DrawSmile() 畫(huà)一個(gè)笑臉C void DrawRedFlag(int i,int j) 畫(huà)一個(gè)紅旗D void DrawEmpty(int i,int j,int mode,int color) 畫(huà)兩種空格E void Close() 關(guān)閉圖形模式3.鼠標(biāo)處理部分A void MouseOn() 鼠標(biāo)顯示B void MouseOff() 鼠標(biāo)隱藏Cvoid MouseSetXY(int x,int y) 設(shè)
13、置鼠標(biāo)當(dāng)前位置Dint LeftPress() 鼠標(biāo)左鍵按下Eint RightPress() 鼠標(biāo)右鍵按下Fvoid MouseGetXY() 得到鼠標(biāo)當(dāng)前位置五調(diào)試與測(cè)試1. 書(shū)寫(xiě)標(biāo)識(shí)符時(shí),忽略了大小寫(xiě)字母的區(qū)別編譯程序把 i 和 I 認(rèn)為是兩個(gè)不同的變量名,而顯示出錯(cuò)信息。 C 語(yǔ)言認(rèn)為 大寫(xiě)字母和小寫(xiě)字母是兩個(gè)不同的字符。 習(xí)慣上, 符號(hào)常量名用大寫(xiě), 變量名用 小寫(xiě)表示,以增加可讀性。2. 在程序嵌套比較多時(shí),容易出錯(cuò)在程序嵌套比較多時(shí),很容易多卸“ ”,或者少寫(xiě)“”,造成編譯錯(cuò)誤,為 減少類(lèi)似錯(cuò)誤出現(xiàn), 在寫(xiě)程序時(shí)應(yīng)該采取縮進(jìn)式寫(xiě)法, 讓處于同一層次的函數(shù)處 于同一條線(xiàn)上,這樣就能
14、夠減少上述錯(cuò)誤的出線(xiàn)3. win7 不支持 C語(yǔ)言圖形全屏模式,圖形處理須加載圖形驅(qū)動(dòng)在進(jìn)行圖形部分處理時(shí) win7 不支持 c 語(yǔ)言圖形的全屏模式,在 XP系統(tǒng)下, 也沒(méi)法正確運(yùn)行。原因是 C 語(yǔ)言在進(jìn)行圖形處理必須正確設(shè)置圖形驅(qū)動(dòng)器和模 式,通過(guò)函數(shù) detectgraphics 能自動(dòng)進(jìn)行計(jì)算機(jī)硬件檢測(cè), 后再進(jìn)行初始華即可。4. 布雷隨機(jī)數(shù)生成的錯(cuò)誤以及優(yōu)化在進(jìn)行布雷函數(shù)編寫(xiě)時(shí), 首先用隨機(jī)數(shù)生成函數(shù)使隨機(jī)數(shù)生成范圍在 (0-1) 之間,使得地雷主要分布與上部, 下部區(qū)域基本沒(méi)有地雷, 為了使得雷區(qū)較為平 均,我又加了一重循環(huán), 強(qiáng)制每行最多只能分布 2 個(gè)地雷,并另為生成兩個(gè)隨機(jī) 數(shù)
15、,強(qiáng)制是隨機(jī)數(shù)的行數(shù),該行不分布地雷,這樣使得雷區(qū)相對(duì)平均,但語(yǔ)句過(guò) 于繁瑣,且對(duì)于知道該布雷規(guī)則的人, 游戲更加容易, 最后我們采用了加大隨機(jī) 數(shù)生成范圍,讓隨機(jī)數(shù)在( 0,t)之間, t 可以調(diào)節(jié)就是得雷區(qū)均勻的同時(shí),可 以通過(guò)調(diào)節(jié) t 的值來(lái)控制某局地雷數(shù)目的多少。 而在進(jìn)行生成隨機(jī)數(shù)時(shí)時(shí)間種子 的生成位置會(huì)影響隨機(jī)數(shù)的生成, 因?yàn)樵谟?jì)算機(jī)中隨機(jī)數(shù)一旦生成, 計(jì)算機(jī)就不 會(huì)再生成隨機(jī)數(shù),會(huì)導(dǎo)致生成的隨機(jī)數(shù)相同。5 在調(diào)用遞歸函數(shù)及遞歸函數(shù)編寫(xiě)時(shí)的錯(cuò)誤在調(diào)用遞歸函數(shù)前應(yīng)該先調(diào)用 MineStatistics 函數(shù)統(tǒng)計(jì)該格子周?chē)欠駸o(wú) 雷,只有當(dāng)該格子無(wú)雷且周?chē)鸁o(wú)雷時(shí)(而不時(shí)該格子處無(wú)雷即可
16、) ,才能調(diào)用遞 歸函數(shù)向八個(gè)方向遞歸展開(kāi)無(wú)雷區(qū)域, 該遞歸函數(shù)的出口是碰到了已經(jīng)處理過(guò)的 格子或者該格子已經(jīng)做了標(biāo)記, 又或者是該格子有雷, 而在進(jìn)行遞歸在向周?chē)?八個(gè)方向展開(kāi)時(shí)要注意設(shè)置邊界值的情況, 否則會(huì)造成處理數(shù)據(jù)超出數(shù)組定義的 邊界,造成不必要的錯(cuò)誤6. MineStatistics 函數(shù)編寫(xiě)時(shí)條件不易設(shè)置函數(shù) MineStatistics 編寫(xiě)時(shí)不同情況進(jìn)行分別統(tǒng)計(jì)時(shí)條件設(shè)置很容易錯(cuò)誤, 類(lèi)似于鞍點(diǎn)查找時(shí)的錯(cuò)誤, 導(dǎo)致一類(lèi)點(diǎn)周?chē)睦讛?shù)的統(tǒng)計(jì)出現(xiàn)錯(cuò)誤, 最后我采用 在紙上畫(huà)出模型, 在進(jìn)行某類(lèi)點(diǎn)周?chē)讛?shù)統(tǒng)計(jì)編寫(xiě)時(shí), 根據(jù)紙上模型的規(guī)律進(jìn)行 編寫(xiě)7. 輸贏判斷是靠檢索非雷的格子是否
17、處理完游戲的輸贏判斷有兩種思路, 一是檢索是雷的格子是否已經(jīng)全部做處理 (即 標(biāo)紅旗),二是檢索非雷的格子是否已經(jīng)全部處理完全。雷的數(shù)目雖然較少,但 是雷點(diǎn)具有不確定性, 為了實(shí)現(xiàn)方法一的判斷, 還需定義一個(gè)二維數(shù)組, 用于保 存哪些位置是有地雷分布的, 在進(jìn)行判斷時(shí), 首先讀取該數(shù)組的標(biāo)記, 若該格子 有雷,再?gòu)慕Y(jié)構(gòu)體數(shù)組中讀取 flag 的值,看該格子的地雷是否已經(jīng)做了處理。 而,進(jìn)行方法二的實(shí)現(xiàn)只需要每處理一個(gè)非雷的格子,讓統(tǒng)計(jì)非雷數(shù)目的數(shù)據(jù)自減 一,當(dāng)其自減為 0 時(shí),則表示玩家取得了勝利,比較兩種處理方法,知道方法二 比較容易實(shí)現(xiàn)8. 該函數(shù)鼠標(biāo)的光標(biāo)沒(méi)法顯示出來(lái)該函數(shù)鼠標(biāo)的光標(biāo)沒(méi)法
18、顯示出來(lái),在查詢(xún)了有關(guān)鼠標(biāo)光標(biāo)顯示后,進(jìn)行了 鼠標(biāo)光標(biāo)顯示的嘗試。 但出現(xiàn)了光標(biāo)只有在鼠標(biāo)單擊后才能顯示, 通過(guò)條件設(shè)置 使得能在移動(dòng)時(shí)顯示鼠標(biāo)的位置, 但鼠標(biāo)光標(biāo)的圖形會(huì)遮蓋原有圖形的顯示。 該 進(jìn)方法有兩種, 一是每次進(jìn)行鼠標(biāo)顯示后進(jìn)行清屏處理, 但這樣需要在清屏前保 存所有位置點(diǎn)的信息,數(shù)據(jù)的保存,讀取較復(fù)雜,沒(méi)有實(shí)現(xiàn);二是,在每次進(jìn)行 鼠標(biāo)光標(biāo)輸出前通過(guò)數(shù)據(jù)記錄改點(diǎn)的圖形信息, 在輸出鼠標(biāo),且鼠標(biāo)移出改點(diǎn)后, 用原來(lái)的圖形信息通過(guò)圖形輸出覆蓋掉鼠標(biāo)光標(biāo)顯示留下的痕跡還原原有圖形, 該方法的實(shí)現(xiàn)也較為復(fù)雜, 亦沒(méi)有實(shí)現(xiàn)。 由于該部分功能沒(méi)有實(shí)現(xiàn), 沒(méi)有將本部 分相關(guān)的代碼附錄出來(lái)六附錄#
19、include<>#include<>#include<>#include<>#define LEFTPRESS 0xff01#define LEFTCLICK 0xff10#define LEFTDRAG 0xff19#define MOUSEMOVE 0xff08 void Init();void Close();void DrawSmile();void DrawRedFlag(int i,int j);void DrawEmpty(int i,int j,int mode,int color);void Control();int Min
20、eStatistics(int i,int j);void SpreadMine(int t);void ShowWhite(int i,int j);void GamePlay();void GameBegain(); void GameWin(); void GameOver();void MouseOn();void MouseOff();void MouseSetXY(int x,int y); int LeftPress();int RightPress(); void MouseGetXY();char randminenum3; int minenum;int MouseX,Mo
21、useY;int gameAgain=0;int gamePlay=0;structint num;int roundnum; 圍九個(gè)方格內(nèi)的雷數(shù) */int flag;0*/Mine1010;/* 無(wú)雷標(biāo) 0,有雷標(biāo) 1*/* 此位置有雷標(biāo) 0,否則統(tǒng)計(jì)周/* 標(biāo)記為雷時(shí)為 1,沒(méi)有標(biāo)記為main()Init();Control();Close(); getch();void MouseOn()_AX=0x01; geninterrupt(0x33);/* 鼠標(biāo)光標(biāo)顯示 */void MouseOff()_AX=0x02;geninterrupt(0x33);void MouseSetXY(
22、int x,int y)_CX=x;_DX=y;_AX=0x04;geninterrupt(0x33);/*鼠標(biāo)光標(biāo)隱藏 */int LeftPress()_AX=0x03;geninterrupt(0x33); return(_BX&1);/*鼠標(biāo)左鍵按下 */* 鼠標(biāo)右鍵按下 */* 得到當(dāng)前位置 */int RightPress()_AX=0x03;geninterrupt(0x33); return(_BX&2);void MouseGetXY()_AX=0x03; geninterrupt(0x33); MouseX=_CX; MouseY=_DX;void Init
23、() /* 圖形初始化 */int gdriver, gmode;registerbgidriver(EGAVGA_driver); /* 加載圖形驅(qū)動(dòng)包 */ detectgraph(& gdriver, &gmode); /* 檢測(cè)硬件確定圖形驅(qū)動(dòng)程序和模 式*/initgraph(&gdriver, &gmode, ""); /* 初始化圖形系統(tǒng) ,gdriver 和 gmode 分別表示圖形驅(qū)動(dòng)器和模式 ,""內(nèi)為圖形驅(qū)動(dòng)的路徑 */void DrawSmile()/* 花笑臉 */ setfillstyle(SO
24、LID_FILL,YELLOW); /* 設(shè)置填充模式和顏色 ,表式對(duì)下面所 畫(huà)圖形的填充,此處表示對(duì)下面橢圓的填充 */fillellipse(290,75,10,10); /* 畫(huà)橢圓,前兩個(gè)參數(shù)表示中心點(diǎn)坐 標(biāo),后面依次為一個(gè)寬度和一個(gè)高度 */setcolor(YELLOW); /* 設(shè)置畫(huà)筆顏色 */ setfillstyle(SOLID_FILL,BLACK); /* 此處表示對(duì)下面兩個(gè)橢圓的填充 */ fillellipse(285,75,2,2);fillellipse(295,75,2,2); setcolor(BLACK);bar(287,80,293,81); /* 畫(huà)一
25、個(gè)二維線(xiàn)條 */void DrawRedFlag(int i,int j) setcolor(7);/* 設(shè)置畫(huà)筆顏色 */setfillstyle(SOLID_FILL,RED); bar(198+j*20,95+i*20,198+j*20+5,95+i*20+5);setcolor(BLACK);line(198+j*20,95+20*i,198+j*20,95+i*20+5);void DrawEmpty(int i,int j,int mode,int color)setcolor(color);setfillstyle(SOLID_FILL,color);if(mode=0)/* 沒(méi)
26、有單擊過(guò)顯示大格子 */bar(200+j*20-8,100+i*20-8,200+j*20+8,100+i*20+8);if(mode=1)/* 單擊過(guò)后顯示小格子 */bar(200+j*20-7,100+i*20-7,200+j*20+7,100+i*20+7);void Close()closegraph();void SpreadMine(int t) int i,j;minenum=0;srand(int)time(0);/* 生成時(shí)間種子 */for(i=0;i<10;i+)for(j=0;j<10;j+)Mineij.num=rand()%t;if(Mineij.n
27、um=1)minenum+;elseMineij.num=2;Mineij.flag=0;sprintf(randminenum,"%d", minenum);setcolor(1);settextstyle(0,0,2);outtextxy(210,70,randminenum);minenum=100-minenum;MouseOn();void GameOver()int i,j;setcolor(0);for(i=0;i<10;i+)for(j=0;j<10;j+)if(Mineij.num=1)DrawEmpty(i,j,0,RED);setfills
28、tyle(SOLID_FILL,BLACK); fillellipse(200+j*20,100+i*20,7,7);void GameWin()setcolor(1);settextstyle(0,0,2);outtextxy(230,30,"You Win");int MineStatistics(int i,int j)/* 統(tǒng)計(jì)左上角 */上角 */int nNUM=0; if(i=0&&j=0) if(Mine01.num=1) nNUM+;if(Mine10.num=1) nNUM+;if(Mine11.num=1) nNUM+;else if(
29、i=0&&j=9)if(Mine08.num=1) nNUM+;if(Mine19.num=1) nNUM+;if(Mine18.num=1) nNUM+;else if(i=9&&j=0)if(Mine91.num=1) nNUM+;if(Mine80.num=1) nNUM+;if(Mine81.num=1) nNUM+;else if(i=9&&j=9)if(Mine98.num=1) nNUM+;if(Mine89.num=1) nNUM+;if(Mine88.num=1) nNUM+;else if(i=0&&j!=0&
30、amp;&j!=9)if(Mineij+1.num=1) nNUM+;if(Mineij-1.num=1) nNUM+;if(Minei+1j-1.num=1) nNUM+;if(Minei+1j.num=1) nNUM+;if(Minei+1j+1.num=1) nNUM+;else if(i=9&&j!=0&&j!=9)if(Mineij+1.num=1) nNUM+;if(Mineij-1.num=1) nNUM+;if(Minei-1j-1.num=1) nNUM+;if(Minei-1j.num=1) nNUM+;if(Minei-1j+1.n
31、um=1) nNUM+;else if(j=0&&i!=0&&i!=9)if(Minei-1j.num=1) nNUM+;/* 統(tǒng)計(jì)右下角 */* 統(tǒng)計(jì)第一行 */*統(tǒng)計(jì)最后一行 */!+IINU(,=nu,+f,+!U!)j!+IINU(,=nuf,+!U!)j!+IINU(,=nu,-f,+!U!)j!+IINU(,=nu,+f!U!)j!+IINU(,=UlnUIlr-(!u)jU 5nu (,=nu,+f,-!U!)j!+IINU . (,=nuf,-!U!)j!+IINU (,=nu,-f,-!U!)j!S !+IINU (,=nu,-f,+!U!)j
32、!+IINU (,=nu,-f,-!U!)j!+IINU (,=nu,-f!U!)j!+IINU(,=nuf,+!U!)j!+IINU (,=nuf,-!U!)j! (6=i!0=i!6=! s !+IINU (,=nu,+f,+!U!)j!+IINU (,=nu,+f,-!U!)j!+IINU (,=nu,+f!U!)j!+IINU(,=nuf,+!U!)j!void GameBegain()int i,j;cleardevice();if(gamePlay!=1)MouseSetXY(290,70); /* 鼠標(biāo)開(kāi)始位置,并作為初時(shí) 坐標(biāo) */MouseX=290;MouseY=70;ga
33、mePlay=1; /* 下次開(kāi)始鼠標(biāo)不重新初始 化*/minenum=0;setfillstyle(SOLID_FILL,7);bar(190,60,390,290);for(i=0;i<10;i+)for(j=0;j<10;j+)DrawEmpty(i,j,0,8);setcolor(7);DrawSmile();randomize();SpreadMine(8);void ShowWhite(int i,int j)if(Mineij.flag=1|Mineij.num=0) /* 如果顯示過(guò)紅旗或者該格 處理過(guò)久不對(duì)該格進(jìn)行任何處理 */return;minenum-;if
34、(Mineij.roundnum=0&&Mineij.num!=1)DrawEmpty(i,j,1,7);Mineij.num=0;elseif(Mineij.num!=0)DrawEmpty(i,j,0,8);sprintf(randminenum,"%d",Mineij.roundnum);outtextxy(195+j*20,95+i*20,randminenum);Mineij.num=0;return;if(i!=0&&j!=0&&Mineij.num!=1)ShowWhite(i-1,j-1);if(i!=0&am
35、p;&j!=9&&Mineij.num!=1) ShowWhite(i-1,j+1);if(i!=9&&j!=0&&Mineij.num!=1)ShowWhite(i+1,j-1);if(i!=9&&j!=9&&Mineij.num!=1) ShowWhite(i+1,j+1);if(i!=0&&Mineij.num!=1)ShowWhite(i-1,j);if(i!=9&&Mineij.num!=1)ShowWhite(i+1,j);if(j!=0&&Min
36、eij.num!=1)ShowWhite(i,j-1);if(j!=9&&Mineij.num!=1)ShowWhite(i,j+1);void Control()/* 游戲失敗后判斷是/* 游戲失敗后,沒(méi)有/* 游戲開(kāi)始 */* 游戲具體實(shí)現(xiàn) */int gameFlag=1; 否重新開(kāi)始的標(biāo)志 */while(1)if(gameFlag) 判斷出重新開(kāi)始或者推出游戲就繼續(xù)GameBegain();GamePlay();if(gameAgain=1)gameAgain=0; continue;MouseOn();gameFlag=0;if(LeftPress() /* 判斷是否重新開(kāi)始 */ MouseGetXY(); if(MouseX>280&&MouseX<300&&MouseY>65&&MouseY<85)gameFlag=1;continue;if(kbhit()break;MouseOff();void GamePlay()int i,j,num; /*num 用于接收一個(gè)格 子周?chē)叶嗌俚乩?*/for(i=0;i<10;i+) for(j=0;j<10;j+)Mineij.round
溫馨提示
- 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ù)網(wǎng)僅提供信息存儲(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ù)vi設(shè)計(jì)制作合同
- 二零二五年度按揭貸款服務(wù)與資產(chǎn)評(píng)估合同3篇
- 二零二五年度投標(biāo)保函擔(dān)保合同范本
- 二零二五年度房屋買(mǎi)賣(mài)及貸款擔(dān)保協(xié)議3篇
- 海南職業(yè)技術(shù)學(xué)院《現(xiàn)代信息網(wǎng)絡(luò)技術(shù)》2023-2024學(xué)年第一學(xué)期期末試卷
- 海南醫(yī)學(xué)院《電子商務(wù)理論與實(shí)務(wù)》2023-2024學(xué)年第一學(xué)期期末試卷
- 二零二五年度水利設(shè)施安裝與維護(hù)合同3篇
- 2025版防盜門(mén)個(gè)性化定制加工承攬協(xié)議范本3篇
- 二零二五年度智能家居控制系統(tǒng)開(kāi)發(fā)委托服務(wù)合同3篇
- 某房地產(chǎn)公司安全管理應(yīng)急預(yù)案范文(2篇)
- 幼兒園幼兒營(yíng)養(yǎng)食譜手冊(cè)
- 《護(hù)理科研》課件
- 屋頂分布式光伏發(fā)電項(xiàng)目 投標(biāo)方案(技術(shù)方案)
- 部編版語(yǔ)文四年級(jí)下冊(cè)第六單元大單元作業(yè)設(shè)計(jì)
- 中國(guó)畜禽養(yǎng)殖污染物處理行業(yè)市場(chǎng)集中度、企業(yè)競(jìng)爭(zhēng)格局分析報(bào)告-智研咨詢(xún)發(fā)布
- DL∕T 2594-2023 電力企業(yè)標(biāo)準(zhǔn)化工作 評(píng)價(jià)與改進(jìn)
- 廣東省廣州白云區(qū)六校聯(lián)考2025屆九上數(shù)學(xué)期末教學(xué)質(zhì)量檢測(cè)試題含解析
- 肛瘺患者的護(hù)理查房
- 義務(wù)教育數(shù)學(xué)課程標(biāo)準(zhǔn)(2024年版)
- 辦公區(qū)域主要風(fēng)險(xiǎn)辨識(shí)與分級(jí)管控清單
- 山東省濟(jì)南市七年級(jí)上學(xué)期期末英語(yǔ)試卷(附答案)
評(píng)論
0/150
提交評(píng)論