扫雷周
已经第六周了,要根据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);
}
}
}
}


