예제 #1
0
파일: frmMain.cs 프로젝트: horacn/ClearBomb
        //创建游戏表格
        public void NewGame(int row, int col, int bombs)
        {
            //播放开始游戏的声音
            this.Media.URL = "Music\\开始游戏.wav";
            //初始化前先清空集合
            cells.Clear();
            cs.Clear();
            this.panelCells.Controls.Clear();

            //随机创建一定数量的雷
            int         count      = 0;//已经创建出的雷的数量
            List <bool> isBombList = new List <bool>();
            //随机数
            Random r = new Random(DateTime.Now.Year * 1000000 + DateTime.Now.Month * 10000 + DateTime.Now.Day * 1000 + DateTime.Now.Millisecond);

            for (int i = 0; i < row * col; i++)
            {
                bool isBomb = Convert.ToBoolean(r.Next(0, 2));
                if (count < bombs && isBomb)
                {
                    isBombList.Add(isBomb);
                    count++;
                }
                else
                {
                    isBombList.Add(false);
                }
            }
            //格子的坐标
            int x = 0, y = 0;
            //uc对象
            UcCell uc = null;

            //创建游戏界面
            for (int i = 0; i < row; i++)
            {
                for (int j = 0; j < col; j++)
                {
                    //创建CELL对象
                    Cell c = null;
                    //随机产生有雷或者没雷的对象

                    int num = r.Next(0, isBombList.Count);
                    //如果num是1创建一个雷,如果时2的话,创建一个不是雷
                    if (isBombList[num])
                    {
                        c = new Bomb(i, j);
                    }
                    else
                    {
                        c = new NoBomb(i, j);
                    }
                    isBombList.RemoveAt(num);
                    //每一次创建出一个格子控件对象,将格子放到panel中
                    uc = new UcCell();
                    uc.btn.MouseDown += btn_MouseDown;
                    uc.cell           = c;
                    uc.Location       = new Point(x, y); //设置这个控件在panel中的坐标
                    this.panelCells.Controls.Add(uc);    //将这个控件放置到panel中
                    //将下一个的x坐标+格子宽度
                    x += uc.Width;
                    this.cells.Add(uc.cell.Key, uc);
                    this.cs.Add(c.Key, c);
                }
                //将y坐标+=格子的高度
                y += uc.Height;
                x  = 0;
            }
            //计算窗体此时应该时什么宽高
            this.Width  = uc.Width * col + this.Width - this.panelCells.Width;
            this.Height = uc.Height * row + this.Height + this.panel1.Height - this.panelCells.Height;
            //初始化每一个格子周围的雷数
            foreach (Cell c in cs.Values)
            {
                if (c is Bomb)
                {
                    continue;
                }
                c.GetNearBombs(cs);
            }
            //开始计算雷数显示到窗体上
            this.timer2.Start();
        }
예제 #2
0
 //如果打开的这个格子是空,则打开它周围的非雷格子
 public void ShowNearNoBombs(UcCell uc)
 {
     if (uc.btn.Image != null)
     {
         return;
     }
     if (uc.lbl.Text == string.Empty && uc.cell is NoBomb)
     {
         int    cols = uc.cell.Col;                 //y
         int    rows = uc.cell.Row;                 //x
         string LC   = rows - 1 + "_" + (cols);     //上
         string CL   = rows + "_" + (cols - 1);     //左
         string CR   = rows + "_" + (cols + 1);     //右
         string UM   = rows + 1 + "_" + (cols);     //下
         string LT   = rows - 1 + "_" + (cols - 1); //左上
         string LR   = rows - 1 + "_" + (cols + 1); //右上
         string UL   = rows + 1 + "_" + (cols - 1); //左下
         string UR   = rows + 1 + "_" + (cols + 1); //右下
         //集合中存在则打开
         if (cells.ContainsKey(LC))
         {
             //判断是否打开过,如未打开过,则一并打开
             if (cells[LC].IsOpen == false)
             {
                 cells[LC].Open();    //上
                 uc = cells[LC];
                 ShowNearNoBombs(uc); //递归
             }
         }
         if (cells.ContainsKey(CL))
         {
             if (cells[CL].IsOpen == false)
             {
                 cells[CL].Open();//左
                 uc = cells[CL];
                 ShowNearNoBombs(uc);
             }
         }
         if (cells.ContainsKey(CR))
         {
             if (cells[CR].IsOpen == false)
             {
                 cells[CR].Open();//右
                 uc = cells[CR];
                 ShowNearNoBombs(uc);
             }
         }
         if (cells.ContainsKey(UM))
         {
             if (cells[UM].IsOpen == false)
             {
                 cells[UM].Open();//下
                 uc = cells[UM];
                 ShowNearNoBombs(uc);
             }
         }
         if (cells.ContainsKey(LT))
         {
             if (cells[LT].IsOpen == false)
             {
                 cells[LT].Open();//左上
                 uc = cells[LT];
                 ShowNearNoBombs(uc);
             }
         }
         if (cells.ContainsKey(LR))
         {
             if (cells[LR].IsOpen == false)
             {
                 cells[LR].Open();//右上
                 uc = cells[LR];
                 ShowNearNoBombs(uc);
             }
         }
         if (cells.ContainsKey(UL))
         {
             if (cells[UL].IsOpen == false)
             {
                 cells[UL].Open();//左下
                 uc = cells[UL];
                 ShowNearNoBombs(uc);
             }
         }
         if (cells.ContainsKey(UR))
         {
             if (cells[UR].IsOpen == false)
             {
                 cells[UR].Open();//右下
                 uc = cells[UR];
                 ShowNearNoBombs(uc);
             }
         }
     }
 }
예제 #3
0
파일: frmMain.cs 프로젝트: horacn/ClearBomb
        //打开格子的事件
        void btn_MouseDown(object sender, MouseEventArgs e)
        {
            //按下的按钮
            Button btn = (Button)sender;
            //打开的格子对象
            UcCell uc = (UcCell)btn.Parent;

            //如果按下的是左键
            if (e.Button == MouseButtons.Left)
            {
                uc.cells = this.cells;
                //如果打开的是空格,就播放声音
                string url = uc.Open();
                if (url != string.Empty)
                {
                    this.Media.URL = url;
                }

                //如果点到雷,游戏结束
                if (uc.IsGameOver == true)
                {
                    //时间计时器停止
                    this.timer1.Stop();
                    this.time = 0;
                    //播放声音
                    this.Media.URL = "Music\\爆炸.WAV";
                    //把所有得雷显示出来
                    foreach (UcCell ucell in cells.Values)
                    {
                        if (ucell.cell is Bomb)
                        {
                            ucell.Open();
                        }
                    }
                    //弹出游戏结束窗体
                    frmGameOver fg = new frmGameOver();
                    fg.fm = this;
                    fg.ShowDialog();
                    //开始新游戏
                    if (this.NewGameStr == "输了重新开始")
                    {
                        this.Media.URL = "Music\\开始游戏.wav";
                        foreach (UcCell u in this.cells.Values)
                        {
                            u.BeginAgianGame();
                        }
                        this.ClickCount = 0;
                        this.timer2.Start();
                    }
                    else if (this.NewGameStr == "输了再玩一局")
                    {
                        NewGame(Rows, Cols, Bombs);
                        this.ClickCount = 0;
                    }
                    uc.IsGameOver     = false;
                    this.lblTime.Text = "0";
                    return;
                }
                //打开空格所有周围不是雷的格子
                uc.ShowNearNoBombs(uc);
                //打开的非雷的数量
                int openNoBombs = 0;
                //计算所有打开的不是雷的格子数量
                foreach (UcCell IsOk in cells.Values)
                {
                    if (IsOk.cell is NoBomb)
                    {
                        if (IsOk.cell.IsOpen)
                        {
                            openNoBombs++;
                        }
                    }
                }
                //如果打开的所有不是雷的数量加上雷的数量等于格子总数,那么游戏胜利
                if (openNoBombs + this.Bombs == this.Rows * this.Cols)
                {
                    this.timer1.Stop();
                    this.time = 0;
                    //把所有雷显示出来
                    foreach (UcCell ucell in cells.Values)
                    {
                        if (ucell.cell is Bomb)
                        {
                            ucell.btn.Image = null;
                            ucell.Open();
                        }
                    }
                    frmWin fw = new frmWin();
                    fw.fm   = this;
                    fw.time = Convert.ToInt32(this.lblTime.Text);
                    fw.ShowDialog();
                    if (this.NewGameStr == "赢了退出")
                    {
                        return;
                    }
                    //开始新游戏
                    NewGame(Rows, Cols, Bombs);
                    //把点击次数清零
                    this.ClickCount   = 0;
                    uc.IsGameOver     = false;
                    this.lblTime.Text = "0";
                    return;
                }
                //把点击次数加一
                this.ClickCount++;
                //加时间,每秒加一
                if (this.ClickCount == 1)
                {
                    this.timer1.Start();
                }
            }
            //如果按下的是右键,那么就做标记
            else if (e.Button == MouseButtons.Right)
            {
                //插小旗子
                if (uc.btn.Image == null && uc.btn.Text == string.Empty)
                {
                    uc.btn.Image = this.imageList1.Images[0];
                    return;
                }
                //标问号
                if (uc.btn.Image != null && uc.btn.Text == string.Empty)
                {
                    uc.btn.Text      = "?";
                    uc.btn.ForeColor = Color.White;
                    uc.btn.Font      = new Font(uc.btn.Name, 12, FontStyle.Regular | FontStyle.Bold);
                    uc.btn.Image     = null;
                    return;
                }
                //还原
                if (uc.btn.Text != string.Empty && uc.btn.Image == null)
                {
                    uc.btn.Text  = string.Empty;
                    uc.btn.Image = null;
                }
            }
        }