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

歡迎光臨散文網 會員登陸 & 注冊

C++控制臺界面掃雷程序(包含所有基本功能)

2021-03-26 16:41 作者:NormanGrimes  | 我要投稿

C++控制臺界面掃雷程序

提示:本程序使用了ICUF_HEAD_03.h作為頭文件。
可以參考:ICUF_HEAD_03.h.

開發(fā)環(huán)境:Visual Studio 2019

一、系統(tǒng)功能分析


系統(tǒng)功能分析圖


地圖設置功能根據所選擇的難度、或者自定義的設置給地圖數組賦值。地圖生成功能給地圖、地圖狀態(tài)、指針狀態(tài)數組進行初始化,然后用隨機數逐一布雷。掃雷操作功能可以用鍵盤選擇各種功能進行掃雷操作,并且正下方顯示了各種數據,包括最高分數以及開始時間(分數)。每進行一次操作,就進入勝負判斷階段,如果沒有判斷出勝或負則返回掃雷操作,如果判斷出了勝負則立即停止,并彈出結束界面,如果是失敗,還會在地圖上顯示所有雷的位置。最后從文件中讀取分數記錄,如果成績更加優(yōu)秀則將其存入文件。

二、各功能模塊設計與分析

Main

主函數中并沒有加入任何可以對程序造成實際影響的代碼,因為考慮到后面的功能調用主函數功能時可能會產生不必要的輸出,所以主函數設置為一個過渡的函數,后面的每個函數都單獨負責一個功能。


MineSweeper

主函數通過調用初始化難度的函數選擇數值對變量進行初始化,然后調用地圖生成函數通過剛才初始化的數據生成地圖,然后在一個無限循環(huán)中進行掃雷操作、勝負判斷,在勝負判斷有結果后停止并調用展示地雷、展示地圖和分數功能,玩家此時可以選擇繼續(xù)或者退出程序。


DifficultyInit(int Set)

此函數用于選擇難度,默認提供了三種難度:簡單、普通、困難。簡單難度下是九乘九的地圖加十個地雷,普通難度是十六乘十六的地圖加四十個地雷,困難難度是十六乘三十的地圖加九十九個地雷。此外還提供了一個自定義的功能,可以自己輸入X軸、Y軸的長度以及地雷的數量,在玩家輸入數據后進行判斷,如果地雷數量大于或等于X軸乘Y軸則數據無效,重新返回選擇難度界面。傳入值Set可以在調用此函數時通過Set值直接選擇難度,但在此項目中沒有使用此功能。


InitMap(int SetX,int SetY)

此功能先對默認的長數組進行整體賦值,一共設定了三個二維數組:3X3地雷數組、格子狀態(tài)數組、指針位置數組。在3X3地雷數組中顯示周圍3X3的格子中雷的數量,數值為0到8,地雷也在這個數組中賦值為9。初始化函數給此數組所有值初始化為2,而不是0,避免指針在邊緣翻開格子時因為判斷未顯示的數組為0而翻開右邊和下邊一圈的格子。指針位置二維數組一共有8種狀態(tài):0. 未翻開狀態(tài)、1.指向未翻開狀態(tài)、2.插旗狀態(tài)、3.指向插旗狀態(tài)、4.疑問狀態(tài)、5.指向疑問狀態(tài)、6.已翻開狀態(tài)、7.指向已翻開狀態(tài)。這八種狀態(tài)都設定為指向時的狀態(tài)值加一,在后面的移動指針時可以大幅簡化代碼,此函數在此階段不初始化。格子狀態(tài)二維數組只有0和1兩個狀態(tài),0代表未翻開,1代表已翻開,初始化為0。然后再根據傳入的地圖X,Y值給三個數組在X,Y部分賦值為0,再用一個循環(huán)來逐一添加地雷,如果添加隨機到了一樣的X,Y坐標則此次循環(huán)不執(zhí)行加一,確保能生成指定數量的地雷,然后整體計算給3X3地雷數組賦值,完成地圖初始化的工作。


ShowMap(int SetX, int SetY)

此函數首先根據上面生成的數據和頭文件ICUF_HEAD_03.h中的Col輸出顏色功能,對游戲界面進行輸出,每種狀態(tài)都對應一種顏色,格子狀態(tài)數組中的0. 未翻開狀態(tài)對應白色1.指向未翻開狀態(tài)對應紫色2.插旗狀態(tài)對應紅色3.指向插旗狀態(tài)對應黃色4.疑問狀態(tài)對應藍色5.指向疑問狀態(tài)對應淡藍色6.已翻開狀態(tài)不繪制顏色7.指向已翻開狀態(tài)對應紫色。然后用_getch()不回顯的獲取一個鍵盤輸入,在SWITCH中進行判斷,然后執(zhí)行操作,由于格子狀態(tài)數組的八種狀態(tài)都設定為指向時的狀態(tài)值加一所以在控制指針移動時,只需要給要移動到的地方狀態(tài)值加一,離開的地方狀態(tài)值減一即可,省去了復雜繁瑣的逐一賦值。SWITCH中除了上下左右的移動還提供了J、L、Q、E四種額外操作,J是插旗功能,L是標記疑問功能,Q是對一個已經揭開的方塊根據周圍插的旗判斷,如果周圍一圈的旗子數等于該格子上寫的雷數,則翻開周圍其他所有未翻開的格子。E則是用來排查問題時加入的功能,按下后會顯示所有格子下的數字,再按一次關閉。


CheckZero(int tempX, int tempY)

此功能在翻開格子為0或者按下Q翻開0的格子后啟動,對0周圍八個格子進行判斷,如果有0則繼續(xù)在另一個0的坐標上執(zhí)行此函數。無論周圍有沒有零,其附近的八個格子都會翻開,一直執(zhí)行下去知道不滿足條件為止。為避免兩個0相鄰然后無限重復執(zhí)行,加入了一個判斷,只有未翻開的格子且下面時0才能執(zhí)行全部功能。


CheckMap()

對整個地圖進行搜索,如果有翻開的地雷格子則立刻判定失敗,并顯示所有地雷的位置,進入結束界面。然后再判斷不為雷的所有格子是否已經翻開,如果是則提示成功輸出分數并進入結束界面。


ShowMine()

展示所有地雷,而不展示其他格子。


ShowMapEnd()

結束頁面,輸出分數。


Rank(int Fun, int goal)

對文件里的分數進行判斷,是否打破紀錄,是則用此分數覆蓋文件里的分數,否則提示未能打破紀錄。


三、系統(tǒng)實現

ICUF_HEAD_03.h:

MineSweeper.cpp


開始界面

難度選擇

運行階段

展示所有數字功能(9為雷)


紅色為插旗,藍色為疑問


失敗界面


翻開后的反應


2020/12/1 23:20 糾正了188行的錯誤
Key[x][y] = 1; (Key[KeyX][KeyY] = 1;)

2021/5/2 12:09 發(fā)現了B站的代碼塊中不顯示尖括號之間的內容.

include《iostream》(尖括號打出來不顯示,用書名號表示原來的的樣子)改為include"iostream"



C++控制臺界面掃雷程序(包含所有基本功能)的評論 (共 條)

分享到微博請遵守國家法律
仁化县| 麦盖提县| 祥云县| 绩溪县| 芦山县| 凭祥市| 金川县| 吉安市| 临朐县| 宁德市| 黎川县| 会泽县| 富阳市| 乌兰察布市| 乌拉特后旗| 桃源县| 长汀县| 沂水县| 南陵县| 探索| 内江市| 彩票| 会同县| 西丰县| 隆安县| 寿阳县| 肥城市| 秦皇岛市| 瓦房店市| 大悟县| 邯郸市| 句容市| 镇坪县| 兴海县| 辽源市| 宝丰县| 柯坪县| 景泰县| 万州区| 获嘉县| 海晏县|