掃雷___核心鼠標邏輯

鼠標邏輯是掃雷最核心的部分。我們需要根據當先前鼠標位置,所在方塊的狀態和歷史狀態,遊戲狀態等等來綜合考慮界面的體現
     所需要的狀態量:

     雷狀態:正常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 以及分支該跳出到哪一層,都會影響到整個程序的結構是否複雜凌亂
     由於鼠標每一次點擊都會對應笑臉的響應 因此改動分支後經常會遇到笑臉狀態異常或者不能恢復等情形。
    我的代碼在整體上肯定是很糟糕凌亂的,很多該劃分的子模塊沒有劃分,以及對整個分支流程的控制也很差。
     具體鼠標邏輯可以參見源代碼。
源代碼下載地址點擊這裏(本人資源分寥寥無幾了,所以...咳 別說我不厚道啊。如果哪位和我一樣窮的話,就留言吧,我發給他,)
     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.其他一些比較小的邏輯 如邊界處理 勝利與失敗的判定 等等 在雷方塊結構體和一些必要的信息獲取的函數確認之後都比較簡單 本身不涉及什麼算法。此處省略
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章