主题:[原创]C#扫雷
qiock
[专家分:50] 发布于 2008-12-19 10:54:00
这个扫雷,也是我自己做的,中间碰到了一些问题,比如最让我气愤的是,不知道怎么获得鼠标点击控件的LOCATION坐标,在此感谢,网上的同志,教会了我如果获得鼠标点击控件的句柄,从而解决了这个最大的难题.因为本程序没有给出详细的代码解释,我也正在给每个需要解释的代码段进行解释,在此仅仅将已经做好的程序发表上来//游戏整体思想没有抄袭他人.主要设计步奏没有抄袭他人.
昨天发了个贪吃蛇的,今天再发个扫雷的,准备做个RPG的游戏呢,但是还没有完全的规划好,等做出来了,一定再发过来给大家分享.
最后更新于:2008-12-19 16:54:00
回复列表 (共16个回复)
11 楼
qiock [专家分:50] 发布于 2008-12-19 17:21:00
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 楼
qiock [专家分:50] 发布于 2008-12-19 17:21:00
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 楼
qiock [专家分:50] 发布于 2008-12-19 17:23:00
以上为所有代码,以及解释,所有功能都给实现了,欢迎大家指出错误地方,以及bug问题.或者您有更好的办法也请在此说下,有疑问请MQQ253105052
14 楼
superxiaosong [专家分:0] 发布于 2009-03-03 21:31:00
能不能把文件夹直接发给我啊?是用2005写的吗?
15 楼
我编故我在 [专家分:810] 发布于 2009-03-05 09:44:00
呵呵,扫雷我写过。不过我是用自己写的类和事件,没有用到图片
16 楼
jzyray [专家分:20610] 发布于 2009-03-07 15:03:00
mark
我来回复