回 帖 发 新 帖 刷新版面

主题:[原创]C#扫雷

这个扫雷,也是我自己做的,中间碰到了一些问题,比如最让我气愤的是,不知道怎么获得鼠标点击控件的LOCATION坐标,在此感谢,网上的同志,教会了我如果获得鼠标点击控件的句柄,从而解决了这个最大的难题.因为本程序没有给出详细的代码解释,我也正在给每个需要解释的代码段进行解释,在此仅仅将已经做好的程序发表上来//游戏整体思想没有抄袭他人.主要设计步奏没有抄袭他人.
昨天发了个贪吃蛇的,今天再发个扫雷的,准备做个RPG的游戏呢,但是还没有完全的规划好,等做出来了,一定再发过来给大家分享.

回复列表 (共16个回复)

11 楼

private void button1_Click(object sender, EventArgs e)
        {//重新开始按钮,将所有的数据都初始化
            for (int i = 0; i < 20; i++)
            {for (int j = 0; j < 20; j++)
                   { panel1 .Controls .Remove (lei[i,j]);}}
                alsoflag = new int[20, 20];
            alsoopennum = 0;
            lei = new PictureBox[20, 20];
            image = new Image[20, 20];
            abc = null;
            boolwin = false;
            havedead = false;
            rightdown = false;
            leftdown = false;
            initializemap();
            initializeleimap();
            this.label4.Text = "本难度总共有" + sbnum.ToString() + "雷";
            this.label3.Text = "您已经标记了0个雷";
        }
        private void openthispic(int x, int y)
           { int noopen = 0;//获得你双击或者中键点的图片周围有几个旗帜,初始为0个
            for (int i = x - 1; i <= x + 1; i++)//通过计算获得周围的旗帜总数
               { for (int j = y - 1; j <= y + 1; j++)
                   { if (i >= 0 && i < 20 && j >= 0 && j < 20)
                       { if(!(i==x&&j==y))
                            { if (alsoflag[i, j] == 1)
                                {noopen=noopen +1;//获取当前点击位置的图片周围有几个旗帜
                             }}}}}
            
            for (int i = x - 1; i <= x + 1; i++){
                for (int j = y - 1; j <= y + 1; j++){
                    if (i >= 0 && i < 20 && j >= 0 && j < 20)//这里就采用了第三种方法来判断,看看,不用那么多代码了吧
                        {if (!(i == x && j == y))
                          {  if (noopen ==lnum [x,y])//如果旗帜总数等于这个点的数据,那么就启用他的双击打开事件
                                {if (!(lei[i, j].Visible))
                                    {lei[i, j].Visible = true;
                                    if (dead(i, j))//首先你双击打开的时候可能你并没有标记对,那么你就得判断下是否死亡
                                        {havedead = dead(i, j);//已经死了
                                        MessageBox.Show("游戏结束", "游戏结束", MessageBoxButtons.OK);
                                        for (int a = 0; a < 20; a++)//将所有的图片都显示
                                        {
                                            for (int b = 0; b < 20; b++)
                                               { lei[a, b].Visible = true;
                                                lei[a, b].Image = image[a, b];}}}
                                    else//如果没有死,那么就打开其周围图片。
                                       { alsoopennum++;
                                        iswin();
                                        if (lnum[i, j] == 0)//如果它周围的图片有一个是空白的,就启用空白打开函数
                                        {this.openpicturebox(i, j);   
                                        }}}}}}}}}

12 楼

private void Form1_MouseUp(object sender, MouseEventArgs e)
        {
            //可以不用定义
        }
        private void panel1_MouseUp(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                this.leftdown = false;//如果左键抬起,则左键是否按下就是假了
            }
            if (e.Button == MouseButtons.Right)
            {
                this.rightdown = false;//同上.
            }//最后说下鼠标双击的实现,如果鼠标双击了,那么一定是左键也按下,右键也按下了,不管你是先按下左键,还是先按下右键。因为鼠标双击事件我们
            //是在图片中才启用的,所以不用担心在PANEL中启用,所以不需用在MOUSE_UP这个事件中定义,但是如果以后不是这种情况了,那么我们就要
            //根据不同的需要来改变
        }
    }
}

13 楼

以上为所有代码,以及解释,所有功能都给实现了,欢迎大家指出错误地方,以及bug问题.或者您有更好的办法也请在此说下,有疑问请MQQ253105052

14 楼

能不能把文件夹直接发给我啊?是用2005写的吗?

15 楼

呵呵,扫雷我写过。不过我是用自己写的类和事件,没有用到图片

16 楼

mark

我来回复

您尚未登录,请登录后再回复。点此登录或注册