最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

C語(yǔ)言開發(fā):一篇文章帶你還原童年,掃雷游戲完整源碼分析!

2022-09-21 16:01 作者:C語(yǔ)言編程__Plus  | 我要投稿

想必屏幕前的你,肯定玩過(guò)windows系統(tǒng)自帶的那個(gè)游戲,掃雷

回想當(dāng)年,我根本沒看懂這個(gè)游戲是怎么玩的


比起掃雷,三維彈球?qū)ξ腋形?/p>

跑題了

本篇博客就讓我們一起來(lái)試試,如何通過(guò)C語(yǔ)言代碼,制作出一個(gè)“掃雷游戲se”

1.游戲程序主函數(shù)

在編寫這類游戲代碼時(shí),我們要用到的主函數(shù)基本是一致的

掃雷游戲的主函數(shù)和猜數(shù)字游戲的主函數(shù)相差很小

2.游戲?qū)崿F(xiàn)原理

想寫好一串代碼,首先我們要知道掃雷游戲需要通過(guò)什么方式來(lái)實(shí)現(xiàn)


我們需要一個(gè)9x9的棋盤,用于生成我們的雷以及玩家的游玩

在c語(yǔ)言中當(dāng)然無(wú)法直接產(chǎn)生這樣的畫面

但我們可以同符號(hào)*或者#來(lái)代替網(wǎng)格,用1和0來(lái)表示有無(wú)雷

如果我們只生成一個(gè)棋盤,那1和0會(huì)直接顯示出來(lái),達(dá)不到隱藏的效果

所以我們需要用二維數(shù)組生成兩個(gè)棋盤,一個(gè)用于存放雷,一個(gè)用于玩家的游玩

掃雷游戲我們使用頭文件+源文件的形式撰寫代碼

這樣寫代碼的優(yōu)點(diǎn)在于后續(xù)我們可以直接通過(guò)更改.h文件中的數(shù)組,從而更改我們的格子大小

如: 改成12x12的游玩界面,改變雷區(qū)布雷個(gè)數(shù)等等

所以我們需要在game.h中定義這些符號(hào)

同時(shí)我們要在主函數(shù)的最上面引用這個(gè)自己寫的頭文件

只要把庫(kù)函數(shù)頭文件放入game.h文件,在其他源文件中只需引用game.h

不需要再次引用<stdio.h>、<stdlib.h>之類

棋盤大小為什么需要11x11?

你可能注意到了,在生成數(shù)組的時(shí)候,我使用了ROWS,其值為ROW+2

我們最終展示的只是9x9的游戲界面,但生成的棋盤其實(shí)是11x11的

這是因?yàn)槲覀冃枰趍ine數(shù)組中實(shí)現(xiàn)掃描雷區(qū)的操作

玩過(guò)掃雷游戲的你肯定知道:在你點(diǎn)擊一個(gè)格子的時(shí)候,如果這個(gè)格子不是雷

它會(huì)顯示一個(gè)數(shù)字,告訴你它周圍的8個(gè)格子中有幾顆雷

如圖所示:


在C語(yǔ)言中,我們可以用函數(shù)統(tǒng)計(jì)周圍8個(gè)格子中雷’1’的個(gè)數(shù)

但是如果你來(lái)到邊緣,那就出現(xiàn)問(wèn)題了


如果我們想統(tǒng)計(jì)邊緣的格子周邊有幾顆雷,就會(huì)遇到這種溢出數(shù)組的情況

此時(shí)代碼會(huì)報(bào)錯(cuò)

為了避免這個(gè)問(wèn)題,我們可以在原來(lái)9x9的基礎(chǔ)上在周圍加一圈空白的格子

也就是代碼所示的ROW(行)COL(列)都要+2的情況

游戲過(guò)程

這里簡(jiǎn)單梳理一下我們的游戲過(guò)程

(1)玩家選擇開始游戲

(2)生成兩個(gè)棋盤,一個(gè)放置雷\掃描雷,一個(gè)向玩家展示游戲界面

(3)玩家輸入坐標(biāo),選擇排雷位置

(4)有雷–>玩家被炸死,游戲結(jié)束;無(wú)雷–>顯示周邊有幾顆雷,游戲繼續(xù)

(5)所有雷被排出,游戲勝利


3.游戲代碼實(shí)現(xiàn)

接下來(lái)就進(jìn)入我們的游戲代碼部分

3-1.初始化和打印

我們需要初始化兩個(gè)棋盤,其中雷區(qū)初始化為0(0代表無(wú)雷),展示區(qū)初始化為’*’,用?代替界面

同時(shí)我們打印這兩個(gè)棋盤,查看初始化效果

因?yàn)檫@是我們的自定義函數(shù),所以需要在.h文件中定義函數(shù),在另外一個(gè).c文件中包含函數(shù)的實(shí)現(xiàn)

初始化函數(shù)和打印函數(shù)比較簡(jiǎn)單,使用for語(yǔ)句達(dá)成我們的需求

需要注意的是我們的最后打印棋盤的時(shí)候是從i=1開始的,這樣就能避開添加的空白邊緣區(qū)域,只打印中心的99方格

同時(shí)我們添加了列號(hào)和行號(hào),這樣能讓玩家清除的知道自己應(yīng)該輸入什么坐標(biāo)



3-2.布置雷區(qū)

同樣的,我們需要在game.h中定義這個(gè)函數(shù)

在game.c中寫入自定義函數(shù)的實(shí)現(xiàn)

這里面出現(xiàn)了一個(gè)前面沒有提到的變量,EASY_COUNT

本來(lái)這個(gè)位置只是個(gè)10

但如果我們想更改布雷個(gè)數(shù),那每次都需要更改這里的10,后面的代碼中也需要更改,非常麻煩

所以我們改為使用一個(gè)自定義變量,在game.h中定義這個(gè)變量的值

這個(gè)值就代表我們布置雷的個(gè)數(shù)了

3-3.玩家排查雷

因?yàn)槲覀冃枰裮ine數(shù)組中排查出的雷的個(gè)數(shù)放入show數(shù)組中打印出來(lái)

所以這里我們需要把兩個(gè)數(shù)組都傳送過(guò)去

1.輸入排查的坐標(biāo)

2.檢查坐標(biāo)處是不是雷

? ? ? ? ·是雷 -boom!炸死 -游戲結(jié)束

? ? ? ? ·不是雷 -統(tǒng)計(jì)坐標(biāo)周圍有幾個(gè)雷-存儲(chǔ)排雷的信息到show數(shù)組,游戲繼續(xù)

注意,這里面我們需要添加一個(gè)代碼來(lái)判斷坐標(biāo)合法性

我們的棋盤是9x9,玩家要是輸入一個(gè)(99,99)的坐標(biāo),那肯定不在數(shù)組中的,是無(wú)效的

我們需要提醒玩家他輸錯(cuò)了

‘0’的作用

你可能會(huì)對(duì)這行代碼感到疑惑

為什么要在count后面+上一個(gè)‘0’?

這里就和我們ascii碼表有關(guān)了


因?yàn)槲覀兂跏蓟瘮?shù)組和布置雷的時(shí)候,我們給數(shù)組傳入的都是1和0這兩個(gè)符號(hào),并不是數(shù)字!

但是在show數(shù)組中我們需要給玩家顯示一個(gè)數(shù)字的字符


這里面我們提供的是1的字符,并不是1它本身

而我們?cè)谟?jì)算周邊雷的個(gè)數(shù)的時(shí)候,傳回來(lái)的是一個(gè)具體的數(shù)字

觀察表格,你會(huì)發(fā)現(xiàn)數(shù)字和對(duì)應(yīng)的字符中間,都差了48

而48恰好是字符’0’對(duì)應(yīng)的ASCII碼值

所以我們需要用count加上字符’0’,以此在界面中向玩家展示周邊8格有幾顆雷

3-4. 系統(tǒng)掃描雷

如何把玩家選擇的格子周邊的雷掃描出來(lái)呢?

設(shè)玩家的選擇的坐標(biāo)為x和y


我們只需要把這些坐標(biāo)全部在二維數(shù)組中鍵入,就能逐個(gè)掃描出雷的個(gè)數(shù)

這里因?yàn)槲覀儝呙璩鰜?lái)的也是‘1’的字符,系統(tǒng)中是字符1的ascii碼值49

所以我們需要減去8個(gè)字符‘0’,這樣就能得到雷的個(gè)數(shù)的數(shù)字

(然后在之前的那個(gè)函數(shù)中接受,count+‘0’,在show數(shù)組中顯示)

這個(gè)函數(shù)是在玩家排查雷的函數(shù)之前的

因?yàn)樵谥骱瘮?shù)中我們不需要使用這個(gè)自定義函數(shù),所以不需要在game.h中定義

我們想讓它只在game.c中生效,所以用static修飾它

static的作用

1.修飾局部變量

2.修飾全局變量

3.修飾函數(shù)

上面的代碼其實(shí)還少了一個(gè)東西

我們需要判斷玩家什么時(shí)候勝利——雷區(qū)的0(無(wú)雷方塊)全部被玩家找出,玩家就勝利了

這里我們需要更改的是whlie函數(shù)

其中 row * col - EASY_COUNT 指方格總數(shù)減去雷的個(gè)數(shù),得到的是無(wú)雷方塊的個(gè)數(shù)

玩家每成功排除一個(gè)無(wú)雷方塊,win就會(huì)加一個(gè)數(shù)字

當(dāng)win達(dá)到無(wú)雷方塊個(gè)數(shù)的時(shí)候,whlie循環(huán)就會(huì)停止

隨后我們判斷玩家是否勝利,如果勝利,就打印棋盤,讓玩家知道雷的位置

這里必須要判斷,因?yàn)槟闶×艘彩菚?huì)跳出循環(huán)的!

到此,我們的掃雷代碼就是完成了

4.查看結(jié)果

這里我作弊,將雷的個(gè)數(shù)設(shè)置為80并打印出布置雷之后的棋盤

輸入最后一個(gè)雷的位置,系統(tǒng)提示我們游戲勝利


輸入雷的坐標(biāo)后,也會(huì)提示你被炸死了

到這里我們可以確認(rèn)代碼是編寫成功了!

對(duì)啦對(duì)啦!另外的話為了幫助大家,輕松,高效學(xué)習(xí)C語(yǔ)言/C++,我給大家分享我收集的資源,從最零基礎(chǔ)開始的教程到C語(yǔ)言項(xiàng)目案例,幫助大家在學(xué)習(xí)C語(yǔ)言的道路上披荊斬棘!可以來(lái)我粉絲群領(lǐng)取哦~

編程學(xué)習(xí)書籍分享:

編程粉絲交流:


C語(yǔ)言開發(fā):一篇文章帶你還原童年,掃雷游戲完整源碼分析!的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
恩施市| 辽阳市| 六枝特区| 新密市| 班戈县| 阳曲县| 沂水县| 民丰县| 萨嘎县| 西华县| 宁南县| 新营市| 台南县| 咸宁市| 曲阜市| 察雅县| 柳江县| 江门市| 漳州市| 昌江| 仁化县| 苏尼特左旗| 石渠县| 大悟县| 左权县| 固始县| 合水县| 孟连| 新田县| 乌鲁木齐市| 陇西县| 永靖县| 龙山县| 简阳市| 灵宝市| 甘谷县| 松桃| 任丘市| 松原市| 舟山市| 德保县|