滑鼠邏輯是掃雷最核心的部分。我們需要根據當先前滑鼠位置,所在方塊的狀態和曆史狀態,遊戲狀態等等來綜合考慮介面的體現
所需要的狀態量:
雷狀態:正常STATE_NORMAL,空STATE_EMPTY,未知STATE_DECKY,未知按下狀態STATE_DECKY_DOWN 紅旗STATE_FLAG 遊戲狀態:等待GS_WAIT 運行GS_RUN 失敗GS_DEAD 成功GS_VICTORY 為了實現方塊體現狀態(未知 正常 紅旗 等)和方塊內部狀態(方塊是否為雷)的獨立 需要分別用兩個量來表示 為了實現滑鼠移動時的動態變化,每一個雷方塊有兩個狀態 原本狀態 和 現在狀態 以下是方塊結構定義
這一塊不是很複雜 但是很繁雜 不知道怎麼整理 做的時候是一點一點的改動和修正累積的。 主要就是在實現滑鼠邏輯的時候,會有很多分支: 滑鼠的點擊地區(笑臉地區, 雷地區, 其他地區) 遊戲的狀態(等待開始,運行中,失敗,成功) 當前滑鼠所在的位置的雷方塊m_pNewMine狀態(標識,正常,未知,等) 上一刻滑鼠所在位置的雷方塊m_pOldMine狀態
這些都涉及到分支,使得程式很難控制每一個分支的流程都能夠得到正確效果,分支的跳出是用break,continue,還是return 以及分支該跳出到哪一層,都會影響到整個程式的結構是否複雜淩亂 由於滑鼠每一次點擊都會對應笑臉的響應 因此改動分支後經常會遇到笑臉狀態異常或者不能恢複等情形。 My Code在整體上肯定是很糟糕淩亂的,很多該劃分的子模組沒有劃分,以及對整個分支流程的控制也很差。 具體滑鼠邏輯可以參見原始碼。原始碼點擊這裡(本人資源分寥寥無幾了,所以...咳 別說我不厚道啊。如果哪位和我一樣窮的話,就留言吧,我發給他,) http://download.csdn.net/detail/wudaijun/4709630 接下來 我總結一下在滑鼠邏輯控制時遇到的一些問題和得到的教訓 1.如果實現滑鼠對方塊的動態選擇: 每個雷快設定兩個標識域(uState,uOldState)用於恢複 設定兩個成員變數用於表示此刻(m_pNewMine)和上一刻(m_pOldMine)的選取方塊 當滑鼠移動時 按下m_pNewMine並且鬆開m_pOldMine 2.如何擴充雷: 當選中的方塊周圍沒有雷時,對該方塊周圍的方塊進行擴充 如果周圍有雷 則繪製雷的數目 如果沒有 再遞迴擴充該方塊周圍 3.如何得到或相應滑鼠左右鍵同步選取: 在OnLButtonDown或OnRButtonDown中如果nFlags==(MK_LBUTTON|MK_RBUTTON)即可識別。如果要響應其中任何一個鍵鬆開的訊息。可以通過設定一個成員變數m_bLRBtnDown實現,在OnMouseMove中直接判斷並且做相應的事情。而在OnL(R)ButtonUp中 需要立即將其置為假 if(m_bLRBtnDown) { m_bLRBtnDown = FALSE;//避免在放開一個鍵後 還在響應雙鍵移動訊息 。。。。 }
以上所的m_bLRBtnDown的設定與恢複均需要在左鍵和右鍵中同時實現,因為左右鍵的按下和放開不會是絕對同時的,只有在一個左鍵按下後立即按右鍵 才能在右鍵的RButtonDown中得到nFlags==(MK_LBUTTON|MK_RBUTTON) 反之亦然 4.其他一些比較小的邏輯 如邊界處理 勝利與失敗的判定 等等 在雷方塊結構體和一些必要的資訊擷取的函數確認之後都比較簡單 本身不涉及什麼演算法。此處省略