首頁體育 > 正文

C ++專案開發:C ++製作經典連連看小遊戲,學習程式設計的你不能忽視

2021-09-07由 愛手遊的網癮萌妹 發表于 體育

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

大家應該都玩過連連看,遊戲規則不多說了,我們先看看設計思路。

第一件事要根據遊戲玩法確定程式的資料結構,不同的資料結構決定了不同的演算法設計,用錯了資料結構可能直接讓程式碼複雜好幾倍。

連連看中玩家操作的資料是一個個的圖片,多個圖片組成一個棋盤式的矩陣介面。程式根據玩家的點選位置計算兩個圖片的連線路線,這要求程式以最快、最簡單的方式獲得矩陣中每個格子的資料。

用二維陣列表示遊戲中的矩陣介面比較合適,因為陣列可以透過索引快速訪問資料,二維陣列的兩個索引剛好對應矩陣介面的(x, y)座標。例如:

C ++專案開發:C ++製作經典連連看小遊戲,學習程式設計的你不能忽視

開啟搜狗搜尋APP,檢視更多精彩資訊

圖中矩陣資料在程式碼中應該這樣表示:

C ++專案開發:C ++製作經典連連看小遊戲,學習程式設計的你不能忽視

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

C ++專案開發:C ++製作經典連連看小遊戲,學習程式設計的你不能忽視

那麼上面的矩陣繪製的時候就會是這樣:

C ++專案開發:C ++製作經典連連看小遊戲,學習程式設計的你不能忽視

0表示空格,不顯示圖片。初始化時的空格或消除後的空格,都會被設定為0。

C ++專案開發:C ++製作經典連連看小遊戲,學習程式設計的你不能忽視

接下來要初始化資料,我打算用8種不一樣的圖片,每種6張,隨機放入矩陣中,矩陣最外一圈是空的。這個演算法可以用標準庫函式 std::random_shuffle 來完成。std::random_shuffle 用於把容器內的資料隨機打亂,因此按順序把資料放入陣列中,然後呼叫 std::random_shuffle 就可以完成初始化。

C ++專案開發:C ++製作經典連連看小遊戲,學習程式設計的你不能忽視

斷點執行觀察陣列資料,和我們設計的一樣:

C ++專案開發:C ++製作經典連連看小遊戲,學習程式設計的你不能忽視

貼上圖片看起來還不錯:

C ++專案開發:C ++製作經典連連看小遊戲,學習程式設計的你不能忽視

現在來分析遊戲玩法。這個遊戲的難點是兩個

圖片連線

的判定演算法,要求連線線只能轉折兩次。

我的第一反應這是一個尋路演算法,要求找到轉折兩次以下的最短路徑。教科書上常見的廣度優先搜尋、深度優先搜尋、DijKstra演算法或是遊戲中常用的A星演算法,稍作修改加上兩次轉折的限制都能解決這個問題。

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

多玩幾次遊戲,把不同種類的連線記錄下來,總結後可以發現總共有3種連線型別,分別是不轉折連線、轉折一次和轉折兩次。

還是從最簡單的情況開始考慮。這是解決難題的通用方法:

從最簡單的情況開始考慮,再逐步增加複雜的條件。

最簡單的不轉折連線,有兩種情況,橫向連線和縱向連線:

C ++專案開發:C ++製作經典連連看小遊戲,學習程式設計的你不能忽視

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

C ++專案開發:C ++製作經典連連看小遊戲,學習程式設計的你不能忽視

最後把這兩個合併就是不轉折的情況下:

C ++專案開發:C ++製作經典連連看小遊戲,學習程式設計的你不能忽視

轉折一次:

C ++專案開發:C ++製作經典連連看小遊戲,學習程式設計的你不能忽視

轉折一次的演算法也是比較明顯的,像上圖中的兩種情況,找到綠色點的位置,如果這個點可以不轉折連到兩個紅色的圖片,那麼這兩個紅色的圖片就可以透過一次轉折連線。

綠點的位置是由兩個紅點決定的,只有上圖中的兩種可能。

C ++專案開發:C ++製作經典連連看小遊戲,學習程式設計的你不能忽視

轉折兩次的情況就多了,下圖同樣是連線紅色圖片,要繞過綠色圖片。

C ++專案開發:C ++製作經典連連看小遊戲,學習程式設計的你不能忽視

轉折兩次的情況很多,這裡無法一一列舉,但是仔細思考可以發現和轉折一次本質上是一樣的,就是找到兩個點,這兩個點可以分別和紅色圖片無轉折連線,並且這兩個點也可以無轉折連線。

這兩個點需要位於經過紅色圖片的十字線上,並且只要確定一個了其中一個點,就能對應地找到另一個點:

C ++專案開發:C ++製作經典連連看小遊戲,學習程式設計的你不能忽視

因此只要遍歷其中一個圖片的兩條十字線經過的所有的點,並計算出另一個圖片十字線上對應點的位置,檢查這兩個點和兩個紅色圖片是否可以無轉折連線:

C ++專案開發:C ++製作經典連連看小遊戲,學習程式設計的你不能忽視

程式碼碼完了,添上圖片和滑鼠檢測的程式碼跑一跑試試。

C ++專案開發:C ++製作經典連連看小遊戲,學習程式設計的你不能忽視

右邊顯示臨時顯示字元用於測試連通性,多次測試沒有問題。

最後加上連線,並清除被點選的兩個格子,就完成了連連看的核心邏輯。你學會了嗎?

最後,想要成為一個優秀的程式設計師,最最重要的是儘可能的提升自己的程式設計能力以及程式設計思維,並且,與其想著怎麼去提升,不如從現在開始動手動腦,如果對於C/C++感興趣的話,可以加q。569,268,376,學習不怕從零開始,就怕從不開始。

頂部