仿Windows內建掃雷的小程式

來源:互聯網
上載者:User

一直感覺Windows內建的掃雷程式挺有意思的。學習VC也有很長的時間了,一直沒有真正的用心作過什麼東西。決定先做個掃雷練練手。由於對MFC掌握的不是很好,程式中的小臭蟲還希望各位兄弟們多多指教,共同進步。

一、主要思路及實現方法

對於介面部分:採取的是貼圖技術即在視窗上設定上各種背景圖片。在有滑鼠以及鍵盤操作的時候進行相應的替換。此處主要用到的都是對於後台部分:在第一次點擊雷區的時候埋下所有的雷,同時開始計時。然後在每一次滑鼠點擊的時候進行判斷,若觸雷或標記錯誤的展開則失敗,若成功挖出最後一顆雷則勝利。為記錄每一個表示雷的小表單的資訊,程式中定義了一個MINEWND的結構體,儲存了小表單的行,列,是否為雷,初始狀態和最終狀態的資訊。然後在主表單類CMineWnd中定義了一個二維數組m_pMines[24][30]儲存最大雷區的小表單數組。每次點擊滑鼠的時候,首先獲得小表單的指標,然後對相應的數組中的元素進行操作。

二、代碼說明:

布下所有的雷:

void CMineWnd::LayMines(UINT row, UINT col)
{
  srand( (unsigned)time( NULL ) );
  UINT i, j;
  for(UINT index = 0; index < m_uMineNum;) {
   i = rand() % m_uYNum;
   j = rand() % m_uXNum;
   if (i == row && j == col) continue;
   if(m_pMines[i][j].uAttrib != ATTRIB_MINE) {
     m_pMines[i][j].uAttrib = ATTRIB_MINE;
     index++;
   }
  } 
}

此處的srand( (unsigned)time( NULL ) );是為了每次產生的隨機數都不相同。展開空白表單周圍的地區:

void CMineWnd::ExpandMines(UINT row, UINT col)
{
  UINT i, j;
  UINT minRow = (row == 0) ? 0 : row - 1;
  UINT maxRow = row + 2;
  UINT minCol = (col == 0) ? 0 : col - 1;
  UINT maxCol = col + 2;
  UINT around = GetAroundNum(row, col);
  m_pMines[row][col].uState = 15 - around;
  m_pMines[row][col].uOldState = 15 - around;
  // redraw special MINEWND
  DrawSpecialMine(row, col);
  if (around == 0) {
    for (i = minRow; i < maxRow; i++) {
      for (j = minCol; j < maxCol; j++) {
        if (!(i == row && j == col) && m_pMines[i][j].uState == STATE_NORMAL
          && m_pMines[i][j].uAttrib != ATTRIB_MINE) {
          if (!IsInMineArea(i, j)) continue;
          ExpandMines(i, j);
        }
      }
    }
  }
}

此處為一個遞迴函式,尋找需要展開的小表單周圍的8個小表單,若再次尋找到空白,再進行尋找,直到把能展開的全部展開。其他的幾個主要的函數代碼量比較大,各位可以到附帶的執行個體代碼中去看,就不在這裡祥述了 。

四、結束語

程式碼參考了lpq9907的掃雷程式的代碼。在此對lpq9907表示感謝:) 另外,程式實現代碼中的注釋都是用的英文,本人英文水平不高,純屬練習,若有什麼錯誤還望不要笑我同時希望能告訴我改正。

本文配套源碼

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.