扫雷周

作者: 天涯无情 @ 04/02 2007, 22:16

  已经第六周了,要根据windows API 写个与操作系统提供的扫雷游戏一致的游戏,现在雷区已经做的差不多了,增加对菜单的响应就ok了,贴2个界面上来展示一下。以后有谁想要单击版的扫雷游戏可以找我要,呵呵。

写到这,主要做了以下一些工作:

1。学会了从系统自带的扫雷提取用到的资源:如数字,雷,方块等;

2。做了一个需求分析,不过是参照别人的;

3。利用画线技术,定时器,贴图进行界面的设计;

4。对鼠标事件进行响应,同时写了连续翻雷的递归算法:

 

/**
  @brief    掀开周围没有雷数的方块
    
   利用递归算法
  @param   hwnd 窗口句柄
  @param   iRow 方块行值
  @param   iCol 方块列值
  @return   无返回值
*/
void SettleNoneMine(HWND hwnd, int iRow, int iCol)
{
 RECT newRect;
 if (iRow>=0 && iRow=0 && iCol {
  MineInfo[iRow][iCol].flag = OPEN;
  newRect.left = MINEFLD_LEFTPOS + iCol*MINE_BITMAP_WIDTH;
  newRect.top = MINEFLD_TOPPOS + iRow*MINE_BITMAP_HEIGHT;
  newRect.bottom = newRect.top + MINE_BITMAP_HEIGHT;
  newRect.right = newRect.left + MINE_BITMAP_WIDTH;
  InvalidateRect(hwnd, &newRect, TRUE);
  
  //掀开周边8个方格
  if (MineInfo[iRow][iCol].mineNum == 0)
  {
   if((MineInfo[iRow-1][iCol-1].flag==UNFLAG || MineInfo[iRow-1][iCol-1].flag==QUESTION
    && MineInfo[iRow-1][iCol-1].mineNum!=-1) && (iRow-1>=0 && iCol-1>=0)) //左上角
   {
    SettleNoneMine(hwnd, iRow-1, iCol-1);
   }
   if((MineInfo[iRow-1][iCol].flag==UNFLAG || MineInfo[iRow-1][iCol].flag==QUESTION
    && MineInfo[iRow-1][iCol].mineNum!=-1) && (iRow-1>=0 )) //正上方
   {
    SettleNoneMine(hwnd, iRow-1, iCol);
   }
   if((MineInfo[iRow-1][iCol+1].flag==UNFLAG || MineInfo[iRow-1][iCol+1].flag==QUESTION
    && MineInfo[iRow-1][iCol+1].mineNum!=-1) && (iRow-1>=0 && iCol+1   {
    SettleNoneMine(hwnd, iRow-1, iCol+1);
   }
   if((MineInfo[iRow][iCol-1].flag==UNFLAG || MineInfo[iRow][iCol-1].flag==QUESTION
    && MineInfo[iRow][iCol-1].mineNum!=-1) && (iCol-1>=0)) //正左方
   {
    SettleNoneMine(hwnd, iRow, iCol-1);
   }
   if((MineInfo[iRow][iCol+1].flag==UNFLAG || MineInfo[iRow][iCol+1].flag==QUESTION
    && MineInfo[iRow][iCol+1].mineNum!=-1) && (iCol+1   {
    SettleNoneMine(hwnd, iRow, iCol+1);
   }
   if((MineInfo[iRow+1][iCol-1].flag==UNFLAG || MineInfo[iRow+1][iCol-1].flag==QUESTION
    && MineInfo[iRow+1][iCol-1].mineNum!=-1) && (iRow+1=0)) //左下方
   {
    SettleNoneMine(hwnd, iRow+1, iCol-1);
   }
   if((MineInfo[iRow+1][iCol].flag==UNFLAG || MineInfo[iRow+1][iCol].flag==QUESTION
    && MineInfo[iRow+1][iCol].mineNum!=-1) && (iRow+1   {
    SettleNoneMine(hwnd, iRow+1, iCol);
   }
   if((MineInfo[iRow+1][iCol+1].flag==UNFLAG || MineInfo[iRow+1][iCol+1].flag==QUESTION
    && MineInfo[iRow+1][iCol+1].mineNum!=-1) && (iRow+1   {
    SettleNoneMine(hwnd, iRow+1, iCol+1);
   }
    
  }
 }

}



  © 感知世界,感知未来, All rights reserved.