說明
本項目部分思路參考了王桂林老師的項目課程,在此表示感謝。
項目地址:https://github.com/xiaoxi666/mines_sweeper
開發環境
-
開發工具:Qt5.6.1
-
開發語言:C++
技術要點
1.數據支撐
-
由於數據在全局只有唯一一份,故設計為單例模式。默認布局也在這里設置(寬20,高15,雷數50)。
-
關於布雷:隨機算法,注意判斷邊界,如果確定此位置布雷(我用-1表示),其周圍8個方向的數據均加1;
-
關於游戲設置:
-
游戲支持自己配置寬度和高度以及地雷數目,這里用到了兩套數據,一個為配置數據域,一個為基本數據域,當我們設置成功后,需要轉場,這時先刪除舊的場景(這時用的是基本數據域),再創建新的場景(這時把配置數據傳給基本數據域,就把基本數據域更新了),再把視圖設置為當前場景即可;這里的數據傳遞很巧妙,注意體會;
-
數據有效性檢查利用QIntValidator類自動檢查,省去不少功夫(我當前限制寬為1~30,高為1~19,雷數不能超過“寬*高”的一半);
-
2.圖形框架及渲染
-
QGraphicsPixmapItem負責生成每個格子元素item;
-
利用格子元素生成場景Scene;
-
將Scene裝進QGraphicsView視圖中;
-
注意坐標處理:
-
視圖和場景的坐標由框架自動處理,保證整體視圖位於中心位置;
-
鼠標點擊尋找對應的格子元素,利用itemAt函數(注意此函數參數為int,因此無法做到太高精度,這也是整體畫面限制大小的一個原因,另外一個原因是視覺的美觀性);
-
3.自動尋路擴展
-
如果點擊的格子周圍沒有地雷,需要自動擴展,需要考慮兩方面因素:一個是底層數據的擴展,一個是視圖的擴展;
-
兩者均利用隊列的思想實現,探尋周圍8個方向的格子元素(底層數據)是否周圍沒有地雷,如果是的話就將其加入隊列,不是的話翻開;需要加上標記表示其是否被翻開過,如果已經被訪問過就不需要再加進隊列了;
-
根據基本數據的尋找方向,同步擴展指針坐標(相當於自動鼠標點擊),找到對應的格子元素,再根據底層數據做相應操作;我當初想直接基於當前格子元素獲取其周圍的格子元素,但是沒有找到方法,然后就模擬鼠標自動擴展了,歡迎指教;
-
注意這里可能會出現畫面縮放(雖然我最后限制了畫面擴展減輕了負擔),縮放時需要同步考慮鼠標指針的變換,必須是高精度(int不行,可以用double,但是經過測試雷數太多(大概50*30)的時候double也不夠用,因為上層的itemAt函數參數為int);
4.各種標記的處理
- 我們知道,游戲中有旗子,問號等標記,因此需要單獨處理;自動尋路擴展時不會考慮旗子,但是會考慮問號,只要查詢其狀態再對應處理即可;
5.判贏和判輸
-
輸比較好判斷,只要點擊到地雷,直接判輸;
-
判贏方式:用兩個變量分別表示目前還沒有被翻開的格子和目前已經標記的地雷數目,如果某時刻兩個變量相等,則判贏;注意每次翻格子的時候檢查一次即可(不用開多線程進行全局判斷);
6.關於畫面縮放
- 我們的格子元素大小應該根據畫面大小自動調整,但是我還沒做這一點,初步想法是可以添加窗口變化事件,進行處理。現在為了美觀,直接最大化了;
項目建立和打包發布
- 選擇Qt Widgets Application項目,添加需要的ui圖形文件; 添加類文件;
- 剩下的就是算法設計和各種事件的處理了;
- 由於項目采用動態庫構建,因此項目打包發布時需要加上各種dll,這里我們用qt自帶打包工具windeployqt。具體步驟為(或者參見這里):
- 將你編譯出來的exe文件隨意存在一個新的文件夾(名稱不要帶中文)
- 用windows自帶的cmd命令進入該文件夾,具體命令為:cd /d 你的文件夾路徑
- 執行命令:windeployqt 你的exe程序名
- 之后你會發現文件夾里面已經自動包含了所需要的dll庫
- 注意!還需另外拷貝幾個dll進去(因為好多人的電腦沒有相關開發環境),這幾個dll分別是:libgccsdw2-1.dll、libstdc++-6.dll、libwinpthread-1.dll,這時一般就沒有問題了(如果還提示缺少dll,就自己下載放進去~)
與傳統wndows掃雷程序的對比
- 沒有添加應用程序圖標,有興趣可以自己添加;
- 沒有加入步驟計數、時間、音樂,有興趣可以自己添加;
- 踩到雷即結束游戲,沒有加入地雷連鎖爆炸動畫;
- 左右鍵同時按下功能未實現(具體實現思路很簡單:用兩個標記位分別標記左右鍵是否處於按下狀態,兩者同時為真的時候,進一步檢查標記旗,符合要求就打開);
- 目前三個難度選擇未實現,但是可以自己配置寬高以及雷數,選擇性更大;
- 關於隨機算法與布局:
- windows系統自帶的程序:隨機算法偏弱,但是布局算法更勝一籌,各種數字出現幾率更大;
- 自己開發的程序:隨機算法偏強,因此布局算法偏弱,有些大的數字出現幾率相對小一點。
附件
-
源碼可以在github下載(里面包含了windows版程序)。
-
windows執行程序以動態鏈接庫的方式給出。程序本身只有78k,dll就有十幾M。一定注意驗證校驗碼。
-
MD5: 91A4699F89F275B14E9CB90D721409EE
-
SHA1: AA72FC1C154198CE36276741D96B9729D5BF8281
-
-
如果需要在linux上面玩兒,重新編譯一下即可;
曬幾張運行截圖