激情六月丁香婷婷|亚洲色图AV二区|丝袜AV日韩AV|久草视频在线分类|伊人九九精品视频|国产精品一级电影|久草视频在线99|在线看的av网址|伊人99精品无码|午夜无码视频在线

高校合作1:010-59833514 ?咨詢電話:400-810-1418 服務(wù)與監(jiān)督電話:400-810-1418轉(zhuǎn)接2

開發(fā)c++游戲(C++項(xiàng)目開發(fā):C++制作經(jīng)典連連看小游戲,學(xué)習(xí)編程的你不能忽視)

發(fā)布時(shí)間:2023-11-27 02:07:18 瀏覽量:135次

?C++項(xiàng)目開發(fā):C++制作經(jīng)典連連看小游戲,學(xué)習(xí)編程的你不能忽視

開發(fā)c++游戲(C++項(xiàng)目開發(fā):C++制作經(jīng)典連連看小游戲,學(xué)習(xí)編程的你不能忽視)

這篇連連看教程我嘗試換一種方式,多講一些算法思路和編程思想,少貼一些代碼。

大家應(yīng)該都玩過連連看,游戲規(guī)則不多說了,我們先看看設(shè)計(jì)思路。

第一件事要根據(jù)游戲玩法確定程序的數(shù)據(jù)結(jié)構(gòu),不同的數(shù)據(jù)結(jié)構(gòu)決定了不同的算法設(shè)計(jì),用錯(cuò)了數(shù)據(jù)結(jié)構(gòu)可能直接讓代碼復(fù)雜好幾倍。

連連看中玩家操作的數(shù)據(jù)是一個(gè)個(gè)的圖片,多個(gè)圖片組成一個(gè)棋盤式的矩陣界面。程序根據(jù)玩家的點(diǎn)擊位置計(jì)算兩個(gè)圖片的連接路線,這要求程序以最快、最簡單的方式獲得矩陣中每個(gè)格子的數(shù)據(jù)。

用二維數(shù)組表示游戲中的矩陣界面比較合適,因?yàn)閿?shù)組可以通過索引快速訪問數(shù)據(jù),二維數(shù)組的兩個(gè)索引剛好對應(yīng)矩陣界面的(x, y)坐標(biāo)。例如:

開發(fā)c++游戲(C++項(xiàng)目開發(fā):C++制作經(jīng)典連連看小游戲,學(xué)習(xí)編程的你不能忽視)



圖中矩陣數(shù)據(jù)在代碼中應(yīng)該這樣表示:



可以用不同的數(shù)字代表不同的圖片,比如:



那么上面的矩陣?yán)L制的時(shí)候就會(huì)是這樣:



0表示空格,不顯示圖片。初始化時(shí)的空格或消除后的空格,都會(huì)被設(shè)置為0。



接下來要初始化數(shù)據(jù),我打算用8種不一樣的圖片,每種6張,隨機(jī)放入矩陣中,矩陣最外一圈是空的。這個(gè)算法可以用標(biāo)準(zhǔn)庫函數(shù) std::random_shuffle 來完成。std::random_shuffle 用于把容器內(nèi)的數(shù)據(jù)隨機(jī)打亂,因此按順序把數(shù)據(jù)放入數(shù)組中,然后調(diào)用 std::random_shuffle 就可以完成初始化。



斷點(diǎn)運(yùn)行觀察數(shù)組數(shù)據(jù),和我們設(shè)計(jì)的一樣:



貼上圖片看起來還不錯(cuò):



現(xiàn)在來分析游戲玩法。這個(gè)游戲的難點(diǎn)是兩個(gè)圖片連接的判定算法,要求連接線只能轉(zhuǎn)折兩次。

我的第一反應(yīng)這是一個(gè)尋路算法,要求找到轉(zhuǎn)折兩次以下的最短路徑。教科書上常見的廣度優(yōu)先搜索、深度優(yōu)先搜索、DijKstra算法或是游戲中常用的A星算法,稍作修改加上兩次轉(zhuǎn)折的限制都能解決這個(gè)問題。

但是如果我用這些比較復(fù)雜的算法來教新手,顯然是在勸退。所以還是考慮找一找連線判定的算法有沒有簡單的規(guī)律。

多玩幾次游戲,把不同種類的連線記錄下來,總結(jié)后可以發(fā)現(xiàn)總共有3種連線類型,分別是不轉(zhuǎn)折連接、轉(zhuǎn)折一次和轉(zhuǎn)折兩次。

還是從最簡單的情況開始考慮。這是解決難題的通用方法:從最簡單的情況開始考慮,再逐步增加復(fù)雜的條件。

最簡單的不轉(zhuǎn)折連接,有兩種情況,橫向連線和縱向連線:



這兩種情況很容易處理,橫向、豎向依次檢查每個(gè)格子是否被阻擋即可。



最后把這兩個(gè)合并就是不轉(zhuǎn)折的情況下:



轉(zhuǎn)折一次:



轉(zhuǎn)折一次的算法也是比較明顯的,像上圖中的兩種情況,找到綠色點(diǎn)的位置,如果這個(gè)點(diǎn)可以不轉(zhuǎn)折連到兩個(gè)紅色的圖片,那么這兩個(gè)紅色的圖片就可以通過一次轉(zhuǎn)折連接。

綠點(diǎn)的位置是由兩個(gè)紅點(diǎn)決定的,只有上圖中的兩種可能。



轉(zhuǎn)折兩次的情況就多了,下圖同樣是連接紅色圖片,要繞過綠色圖片。



轉(zhuǎn)折兩次的情況很多,這里無法一一列舉,但是仔細(xì)思考可以發(fā)現(xiàn)和轉(zhuǎn)折一次本質(zhì)上是一樣的,就是找到兩個(gè)點(diǎn),這兩個(gè)點(diǎn)可以分別和紅色圖片無轉(zhuǎn)折連接,并且這兩個(gè)點(diǎn)也可以無轉(zhuǎn)折連接。

這兩個(gè)點(diǎn)需要位于經(jīng)過紅色圖片的十字線上,并且只要確定一個(gè)了其中一個(gè)點(diǎn),就能對應(yīng)地找到另一個(gè)點(diǎn):



因此只要遍歷其中一個(gè)圖片的兩條十字線經(jīng)過的所有的點(diǎn),并計(jì)算出另一個(gè)圖片十字線上對應(yīng)點(diǎn)的位置,檢查這兩個(gè)點(diǎn)和兩個(gè)紅色圖片是否可以無轉(zhuǎn)折連接:



代碼碼完了,添上圖片和鼠標(biāo)檢測的代碼跑一跑試試。



右邊顯示臨時(shí)顯示字符用于測試連通性,多次測試沒有問題。

最后加上連線,并清除被點(diǎn)擊的兩個(gè)格子,就完成了連連看的核心邏輯。你學(xué)會(huì)了嗎?

開發(fā)c++游戲(C++項(xiàng)目開發(fā):C++制作經(jīng)典連連看小游戲,學(xué)習(xí)編程的你不能忽視)

熱門課程推薦

熱門資訊

請綁定手機(jī)號(hào)

x

同學(xué)您好!

您已成功報(bào)名0元試學(xué)活動(dòng),老師會(huì)在第一時(shí)間與您取得聯(lián)系,請保持電話暢通!
確定