public MineAreaManage(int gRow, int gCol, int gMineCount) { //设置双缓冲 this.SetStyle(ControlStyles.DoubleBuffer | ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint, true); this.UpdateStyles(); //支持设置透明度 SetStyle(ControlStyles.SupportsTransparentBackColor, true); leftMousePressStat = false; areaRow = gRow; areaCol = gCol; mineCount = gMineCount; //控件高度与宽度 Width = gCol * mineCell; Height = gRow * mineCell; mouseHoverFlag = false; leftMousePressStat = false; rightMousePressStat = false; leftAndRightMousePressStat = false; //将游戏状态设置为开始 tStatus = TotalStatus.haveStart; //初始化雷区 initMines(gRow, gCol, gMineCount); }
//检测所有雷块,并设置全局状态 private void checkAllMines() { int count = 0; //当前状态不为爆炸状态 if (tStatus != TotalStatus.exploding) { for (int r = 0; r < areaRow; r++) { for (int c = 0; c < areaCol; c++) { //如果仍存在normalStatus,doubtStatus和标记错误的块,则表示游戏仍未结束 if (mines[r, c].getMineStatus() == MineStatus.NormalStatus || mines[r, c].getMineStatus() == MineStatus.DoubtMarkStatus || mines[r, c].getMark() == Mark.FlagMarkWrong) { tStatus = TotalStatus.notHaveFinished; return; } count++; } } if (count == areaCol * areaRow) { //游戏成功 tStatus = TotalStatus.haveFinished; } } }
//表情状态按钮点击事件 public void StusButton_Click(object sender, EventArgs e) { //初始化雷区 initMines(areaRow, areaCol, mineCount); tStatus = TotalStatus.haveStart; mPanel.TmCount.Start(); mPanel.TimePanel.Number = 0; mPanel.LftMinePanel.Number = mineCount; mPanel.StatusFace(1); // mPanel.TmCount Invalidate(); }
protected override void OnMouseUp(MouseEventArgs e) { base.OnMouseUp(e); //只有当游戏按下开始键后才开始 if (tStatus != TotalStatus.notHaveStart && tStatus != TotalStatus.haveFinished && tStatus != TotalStatus.exploding) { mPanel.StatusFace(1); //左键弹开 //if (e.Button == MouseButtons.Left) if (leftMousePressStat && !leftAndRightMousePressStat) { leftMousePressStat = false; //判定雷块未被打开 if (!mines[rMouse, cMouse].IsOpened) { //判定雷块未被标记(带问号的块或正常块) if (!mines[rMouse, cMouse].IsMarked) { //若该雷块有雷,则游戏失败 if (mines[rMouse, cMouse].IsMine) { rExploding = rMouse; cExploding = cMouse; tStatus = TotalStatus.exploding; } //若无雷 else { //若相邻有雷块数大于0 if (mines[rMouse, cMouse].MineAdjoinCount > 0) { //设置 mines[r, c]为能被展开 mines[rMouse, cMouse].setMineStatus(MineStatus.DeloyedStatus); mines[rMouse, cMouse].IsOpened = true; } //若相邻有雷块数为0 else if (mines[rMouse, cMouse].MineAdjoinCount == 0) { //设置当前块的状态为被挖开状态,但打开标志IsOpen未设置(在雷块周围地雷数为0时,会出现这种情况) mines[rMouse, cMouse].setMineStatus(MineStatus.DeloyedStatus); //递归判断相邻雷块 recurJudge(rMouse, cMouse); } } } } } //右键弹开 // else if (e.Button == MouseButtons.Right) else if (rightMousePressStat && !leftAndRightMousePressStat) { if (!mines[rMouse, cMouse].IsOpened) { //如果已被标记 if (mines[rMouse, cMouse].IsMarked) { mines[rMouse, cMouse].setMark(Mark.DoubtMark); mines[rMouse, cMouse].setMineStatus(MineStatus.DoubtMarkStatus); mines[rMouse, cMouse].IsMarked = false; mPanel.LftMinePanel.Number++; } else { //如果是疑问标记 if (mines[rMouse, cMouse].getMark() == Mark.DoubtMark) { mines[rMouse, cMouse].setMark(Mark.NormalMark); mines[rMouse, cMouse].setMineStatus(MineStatus.NormalStatus); } else //如果是正常情况 { //已被挖开或打开标志已设置的不用进行标记 if (!(mines[rMouse, cMouse].getMineStatus() == MineStatus.DeloyedStatus)) { //若该块有地雷,则表示标记正确 if (mines[rMouse, cMouse].IsMine) { mines[rMouse, cMouse].setMark(Mark.FlagMarkRight); mines[rMouse, cMouse].setMineStatus(MineStatus.FlagMarkStatus); mines[rMouse, cMouse].IsMarked = true; mPanel.LftMinePanel.Number--; } else { mines[rMouse, cMouse].setMark(Mark.FlagMarkWrong); mines[rMouse, cMouse].setMineStatus(MineStatus.FlagMarkStatus); mines[rMouse, cMouse].IsMarked = true; mPanel.LftMinePanel.Number--; } } } } } rightMousePressStat = false; } //同时弹开 //else if (e.Button == (MouseButtons.Left| MouseButtons.Right)) else if (leftAndRightMousePressStat) { //该雷块已打开 if (mines[rMouse, cMouse].IsOpened) { //求取块周围已标记的块数 int markedCounts = haveMarkedCount(rMouse, cMouse); //如果周围的已标记块数与周围的雷数相同 if (markedCounts == mines[rMouse, cMouse].MineAdjoinCount) { //如果有标记错误的块 if (ifHaveMarkedWrongMine(rMouse, cMouse)) { tStatus = TotalStatus.exploding; } else//没有标记错误的块,则递归展开 { //递归判断周围雷块 recurJudge(rMouse, cMouse); } } } leftMousePressStat = false; rightMousePressStat = false; leftAndRightMousePressStat = false; } //检测所有的雷块,并设置全局状态 checkAllMines(); Invalidate(); } }