QT实现扫雷项目
1.該項(xiàng)目主要實(shí)現(xiàn)了掃雷的基本游戲功能,以及能夠自主設(shè)計(jì)行數(shù)、列數(shù)、以及雷數(shù)
設(shè)計(jì)思路如下:一個(gè)物體狀態(tài)為 所處位置、是否被標(biāo)記、是否被打開(kāi)、是否是雷,以及如果不是雷,被打開(kāi)后會(huì)顯示什么數(shù)字能夠概括其全部?jī)?nèi)容,設(shè)計(jì)一個(gè)類(lèi)來(lái)表示該物體
將該類(lèi)用無(wú)參構(gòu)造和有參構(gòu)造初始化
?2.物體被設(shè)計(jì)好后,我設(shè)計(jì)了一個(gè)容器用來(lái)裝雷的坐標(biāo),以及一個(gè)二維容器來(lái)裝所有的物體,并設(shè)計(jì)了一些菜單欄功能。
3.下一步,也是最重要的一步,函數(shù)的實(shí)現(xiàn)。
new_game函數(shù) ,即開(kāi)始一局新游戲,對(duì)游戲失敗變量進(jìn)行初始化,根據(jù)每回合提供的行數(shù),列數(shù),雷數(shù),重新設(shè)置界面的大小,對(duì)物體進(jìn)行初始化,以及上一次游戲空間的清理
?釋放空間:
對(duì)物體進(jìn)行初始化: 首先,將裝有雷坐標(biāo)的容器進(jìn)行清空,根據(jù)雷的數(shù)目,隨機(jī)生成雷的坐標(biāo),并將他放置在雷容器中;其次,根據(jù)行數(shù)和列數(shù),初始化二維容器,假如是雷,則isMine設(shè)置為true;最后,當(dāng)不是雷時(shí),判斷該格子是否在有效區(qū)域內(nèi),再計(jì)算該格子周?chē)?個(gè)格子,其中為雷的個(gè)數(shù)。
判斷區(qū)域有效:
?
?畫(huà)家繪制背景板還有循環(huán)繪制每個(gè)物體:
?
?
?每個(gè)物體的繪制如下: 當(dāng)處于被標(biāo)記狀態(tài),若游戲結(jié)束,將雷顯示出來(lái),未結(jié)束,則顯示旗子的圖片。當(dāng)處于被打開(kāi)狀態(tài),如果該數(shù)字為0,則為純白色,不為0時(shí),則將數(shù)字畫(huà)出來(lái)(需要將數(shù)字轉(zhuǎn)化為QString類(lèi)型);否則,即沒(méi)被打開(kāi),也沒(méi)被標(biāo)記,則為藍(lán)色。
?接下來(lái)是對(duì)鼠標(biāo)單擊事件的處理。首先獲得鼠標(biāo)處格子的坐標(biāo),判斷是否在游戲區(qū)域內(nèi),定義一個(gè)對(duì)象指針指向該坐標(biāo),如果是鼠標(biāo)左鍵點(diǎn)擊,只能在不是被打開(kāi),且被標(biāo)記狀態(tài)下點(diǎn)擊成功,如果是雷的話,則游戲結(jié)束;不是雷的話,交給畫(huà)家將數(shù)字顯示出來(lái)。當(dāng)打開(kāi)所有的非雷,標(biāo)記所有的雷,則游戲結(jié)束。鼠標(biāo)右鍵點(diǎn)擊,處于被標(biāo)記狀態(tài)時(shí),就取消標(biāo)記狀態(tài),當(dāng)沒(méi)有被打開(kāi)時(shí),才能被標(biāo)記。
?當(dāng)所有的雷被標(biāo)記,所有的非雷被打開(kāi),則找到了全部
當(dāng)數(shù)字為0時(shí),打開(kāi)他,并查找其周?chē)鷶?shù)字也為0的元素,再遞歸尋找空白區(qū)域附近的數(shù)字元素,并把數(shù)字元素也打開(kāi)。
?
?游戲結(jié)束后,遍歷所有的格子,將雷展示出來(lái),非雷都打開(kāi)。
?自定義雷的個(gè)數(shù)、行數(shù)、列數(shù),我設(shè)計(jì)了一個(gè)類(lèi),將得到的字符類(lèi)型轉(zhuǎn)化為整型,再回傳給大類(lèi),大類(lèi)設(shè)計(jì)了一個(gè)槽函數(shù),點(diǎn)擊自定義時(shí)會(huì)將這個(gè)類(lèi)show出來(lái),然后產(chǎn)生一個(gè)dia_test信號(hào),收到信號(hào)后,會(huì)調(diào)用自定義生成槽函數(shù)。
?
?
?游戲效果圖如下所示:
?
?
?
?
總結(jié)
- 上一篇: 试用android studio 3.0
- 下一篇: mac安装QT及QT基本使用