我的编程空间,编程开发者的网络收藏夹
学习永远不晚

C#实现扫雷游戏

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

C#实现扫雷游戏

本文实例为大家分享了C#实现扫雷游戏的具体代码,供大家参考,具体内容如下

一、实验目的:

1、掌握c#窗体和控件的常用属性和功能
2、完成扫雷游戏的基本功能

二、实验要求:

1、游戏基本功能必须实现。鼠标左键点非雷点,否则游戏结束;鼠标右键一次标记雷点,邮件两次标记上问号,右键三次取消标记。
2、可以对游戏选择难度,分为初级、中级和高级,按笑脸按钮重新开始游戏
3、符合游戏逻辑。每个点周围的雷的个数必须正确
4、点开雷点,显示游戏结束,并且显示各个点的情况
5、点开所有非雷点或者标记完所有雷点时,能够显示游戏胜利
6、不接受键盘操作,只接受鼠标操作

三、实验内容:

1、构建菜单栏,添加开始栏、帮助栏,开始栏用于游戏难度的选择,帮助栏用于游戏规则的介绍
2、创建雷区,使用buttonarray模拟雷区,start按钮用于重新开始游戏
3、鼠标左键时,分三种情况:
    (1)鼠标点击雷点时,直接显示游戏结束
    (2)鼠标点击空白点时,周围没雷,则显示周围点的情况,周围有雷,只显示此点的雷数
    (3)鼠标左键点了一个大于0的数字,显示周围雷点的情况,若周围雷点标错,直接显示游戏结束
4、鼠标右键时,第一次标记为雷点,第二次标记为疑问,第三次取消标记。
5、显示周围点的情况时,因为周围点的雷点数也可能为0,还需要显示此点周围的情况,需用递归,完成此项功能。
6、点击笑脸按钮时,如果不是第一次开始,就删除原有按钮,否则直接初始化长度、宽度和雷数,重新构建button按钮
7、点击菜单栏的难度选择按钮时,如果不是第一次开始,就删除原有按钮,否则直接初始化长度、宽度和雷数,重新构建button按钮

四、实验源代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            Size s = new Size(250,300);
            this.MaximumSize = this.MinimumSize = s;
            this.Size = s;
        }


        Button start = new Button();
        Button[,] buttonarray;
        int[,] MileState;
        int Miles = 10;
        int widths = 9, heights = 9;
        int remain;//剩余雷数
        int notMiles;//剩余非雷数
        int isfirst = 1;//是否是第一次
        int[,] sign;//表示各点是否输出
        private void Form1_Load(object sender, EventArgs e)
        {
            
            MenuStrip ms = new MenuStrip();
            ToolStripMenuItem tsmione = new ToolStripMenuItem("开始");
            ToolStripMenuItem tsmi1 = new ToolStripMenuItem("初级");
            ToolStripMenuItem tsmi2 = new ToolStripMenuItem("中级");
            ToolStripMenuItem tsmi3 = new ToolStripMenuItem("高级");
            ToolStripMenuItem tsmi4 = new ToolStripMenuItem("退出");
            tsmione.DropDownItems.Add(tsmi1);
            tsmione.DropDownItems.Add(tsmi2);
            tsmione.DropDownItems.Add(tsmi3);
            tsmione.DropDownItems.Add(tsmi4);
            ms.Items.Add(tsmione);
            tsmi1.Click += new EventHandler(tsmi1_Click);
            tsmi2.Click += new EventHandler(tsmi2_Click);
            tsmi3.Click += new EventHandler(tsmi3_Click);
            tsmi4.Click += new EventHandler(tsmi4_Click);
            ToolStripMenuItem tsmitwo = new ToolStripMenuItem("帮助");
            ToolStripMenuItem tsmi5 = new ToolStripMenuItem("游戏规则");
            tsmi5.Click += new EventHandler(tsmi5_Click);
            tsmitwo.DropDownItems.Add(tsmi5);
            ms.Items.Add(tsmitwo);
            this.Controls.Add(ms);
            //笑脸按钮
            start.Text = "?";
            start.Location = new Point(75, 25);
            start.Click += new EventHandler(start_Click);
            this.Controls.Add(start);

        }
        private void tsmi1_Click(object sender, EventArgs e)
        {
            Size s = new Size(250, 300);
            this.MaximumSize = this.MinimumSize = s;
            this.Size = s;
            if (isfirst == 1)
            {
                widths = 9; heights = 9; Miles = 10;
                Initialize_button(sender, e);
                start.Location = new Point((buttonarray[0, 0].Location.X
                + buttonarray[0, widths - 1].Location.X + 20 - start.Size.Width) / 2, 25);
                isfirst = 0;
                return;
            }
            delete();
            widths = 9; heights = 9; Miles = 10;
            Initialize_button(sender, e);
            start.Location = new Point((buttonarray[0, 0].Location.X
                + buttonarray[0, widths - 1].Location.X + 20 - start.Size.Width) / 2, 25);
        }
        private void tsmi2_Click(object sender, EventArgs e)
        {
            Size s = new Size(400, 450);
            this.MaximumSize = this.MinimumSize = s;
            this.Size = s;
            if (isfirst == 1)
            {
                widths = 16; heights = 16; Miles = 40;
                Initialize_button(sender, e);
                start.Location = new Point((buttonarray[0, 0].Location.X
                + buttonarray[0, widths - 1].Location.X + 20 - start.Size.Width) / 2, 25);
                isfirst = 0;
                return;
            }
            delete();
            widths = 16; heights = 16; Miles = 40;
            Initialize_button(sender, e);
            start.Location = new Point((buttonarray[0, 0].Location.X
                + buttonarray[0, widths - 1].Location.X + 20 - start.Size.Width) / 2, 25);
        }
        private void tsmi3_Click(object sender, EventArgs e)
        {
            Size s = new Size(650, 450);
            this.MaximumSize = this.MinimumSize = s;
            this.Size = s;
            if (isfirst == 1)
            {
                widths = 30; heights = 16; Miles = 99;
                Initialize_button(sender, e);
                start.Location = new Point((buttonarray[0, 0].Location.X
                + buttonarray[0, widths - 1].Location.X + 20 - start.Size.Width) / 2, 25);
                isfirst = 0;
                return;
            }
            delete();
            widths = 30; heights = 16; Miles = 99;
            Initialize_button(sender, e);
            start.Location = new Point((buttonarray[0, 0].Location.X
                + buttonarray[0, widths - 1].Location.X + 20 - start.Size.Width) / 2, 25);
        }
        //删除控件
        public void delete()
        {
            int i, j;
            for (i = 0; i < heights; i++)
                for (j = 0; j < widths; j++)
                    this.Controls.Remove(buttonarray[i, j]);
        }
        private void tsmi4_Click(object sender, EventArgs e)
        {
            Close();
        }
        private void tsmi5_Click(object sender, EventArgs e)
        {
            string str = "鼠标左键点开非雷点继续游戏,点开雷点游戏结束\r\n";
            str += "鼠标右键一次标记雷点,右键两次标记问号,右键三次取消标记";
            MessageBox.Show(str);
        }
        //设计扫雷界面,布雷
        private void Initialize_button(object sender, EventArgs e)
        {
            //初始化游戏界面
            //创建扫雷按钮,设计游戏界面
            buttonarray = new Button[heights, widths];
            MileState = new int[heights, widths];
            notMiles = widths * heights - Miles;
            remain = Miles;
            int i, j;
            for (i = 0; i < heights; i++)
            {
                for (j = 0; j < widths; j++)
                {
                    buttonarray[i, j] = new System.Windows.Forms.Button();
                    buttonarray[i, j].Location = new System.Drawing.Point(20 + 20 * j, 60 + 20 * i);
                    buttonarray[i, j].Size = new System.Drawing.Size(20, 20);
                    buttonarray[i, j].UseVisualStyleBackColor = true;
                    buttonarray[i, j].Text = "";
                    buttonarray[i, j].MouseDown += new MouseEventHandler(but_MouseDown);
                    this.Controls.Add(buttonarray[i, j]);
                }
            }
            int count = 0;
            //雷区初始化,鼠标右键次数初始化
            for (i = 0; i < heights; i++)
                for (j = 0; j < widths; j++)
                    MileState[i, j] = 0;
            //设置雷的位置
            while (count < Miles)
            {
                Random r = new Random();
                i = r.Next(heights);
                j = r.Next(widths);
                if (MileState[i, j] != -1)
                {
                    MileState[i, j] = -1;
                    count++;
                    //雷点周围非雷的点各加1
                    if (i - 1 >= 0 && j - 1 >= 0 && MileState[i - 1, j - 1] != -1) MileState[i - 1, j - 1] += 1;
                    if (i - 1 >= 0 && MileState[i - 1, j] != -1) MileState[i - 1, j] += 1;
                    if (i - 1 >= 0 && j + 1 < widths && MileState[i - 1, j + 1] != -1) MileState[i - 1, j + 1] += 1;
                    if (j - 1 >= 0 && MileState[i, j - 1] != -1) MileState[i, j - 1] += 1;
                    if (j + 1 < widths && MileState[i, j + 1] != -1) MileState[i, j + 1] += 1;
                    if (i + 1 < heights && j - 1 >= 0 && MileState[i + 1, j - 1] != -1) MileState[i + 1, j - 1] += 1;
                    if (i + 1 < heights && MileState[i + 1, j] != -1) MileState[i + 1, j] += 1;
                    if (i + 1 < heights && j + 1 < widths && MileState[i + 1, j + 1] != -1) MileState[i + 1, j + 1] += 1;
                }
            }
        }
        //点击笑脸按钮
        private void start_Click(object sender, EventArgs e)
        {
            if (isfirst == 1)
            {
                Initialize_button(sender, e);
                start.Location = new Point((buttonarray[0, 0].Location.X
                + buttonarray[0, widths - 1].Location.X + 20 - start.Size.Width) / 2, 25);
                isfirst = 0;
                return;
            }
            delete();
            remain = Miles;
            notMiles = widths * heights - Miles;
            start.Text = "?";
            Initialize_button(sender, e);
            start.Location = new Point((buttonarray[0, 0].Location.X
                + buttonarray[0, widths - 1].Location.X + 20 - start.Size.Width) / 2, 25);
        }
        //按下鼠标键时
        private void but_MouseDown(object sender, MouseEventArgs e)
        {
            //获取按钮坐标
            int x = (this.PointToClient(MousePosition).Y - 60) / 20;
            int y = (this.PointToClient(MousePosition).X - 20) / 20;
            sign = new int[heights, widths];
            //递归时表示是否访问
            for (int i = 0; i < heights; i++)
                for (int j = 0; j < widths; j++)
                    sign[i, j] = 0;
            //鼠标左键点了一个大于0的数字
            if (e.Button == MouseButtons.Left && buttonarray[x, y].Text != "" && buttonarray[x, y].Text != "×"
                && buttonarray[x, y].Text != "?" && buttonarray[x, y].Text != "-1")
            {
                int num = 0;
                bool issigned = false;
                //周围标记的地雷个数
                if (x - 1 >= 0 && y - 1 >= 0)
                {
                    if (buttonarray[x - 1, y - 1].Text == "×") num++;
                    else if (buttonarray[x - 1, y - 1].Text == "-1") issigned = true;
                }
                if (x - 1 >= 0)
                {
                    if (buttonarray[x - 1, y].Text == "×") num++;
                    else if (buttonarray[x - 1, y].Text == "-1") issigned = true;
                }
                if (x - 1 >= 0 && y + 1 < widths)
                {
                    if (buttonarray[x - 1, y + 1].Text == "×") num++;
                    else if (buttonarray[x - 1, y + 1].Text == "-1") issigned = true;
                }
                if (y - 1 >= 0)
                {
                    if (buttonarray[x, y - 1].Text == "×") num++;
                    else if (buttonarray[x, y - 1].Text == "-1") issigned = true;
                }
                if (y + 1 < widths)
                {
                    if (buttonarray[x, y + 1].Text == "×") num++;
                    else if (buttonarray[x, y + 1].Text == "-1") issigned = true;
                }
                if (x + 1 < heights && y - 1 >= 0)
                {
                    if (buttonarray[x + 1, y - 1].Text == "×") num++;
                    else if (buttonarray[x + 1, y - 1].Text == "-1") issigned = true;
                }
                if (x + 1 < heights)
                {
                    if (buttonarray[x + 1, y].Text == "×") num++;
                    else if (buttonarray[x + 1, y].Text == "-1") issigned = true;
                }
                if (x + 1 < heights && y + 1 < widths)
                {
                    if (buttonarray[x + 1, y + 1].Text == "×") num++;
                    else if (buttonarray[x + 1, y + 1].Text == "-1") issigned = true;
                }
                if (buttonarray[x, y].Text == Convert.ToString(num))
                {
                    if (issigned == false) { print(x, y, sign); notMiles++; }
                    else MessageBox.Show("哎呀,点错了,重新开始吧");
                }
            }
            //鼠标左键,周围没雷
            if (e.Button == MouseButtons.Left && MileState[x, y] == 0)
            {
                if (sign[x, y] == 0) print(x, y, sign);
                if (notMiles == 0)
                    MessageBox.Show("恭喜你,扫雷成功,回去领赏吧", "成功");
            }
            //鼠标左键,周围有雷
            if (e.Button == MouseButtons.Left && MileState[x, y] > 0)
            {
                if (sign[x, y] == 0 && --notMiles == 0)
                    MessageBox.Show("恭喜你,扫雷成功,回去领赏吧", "成功");
                sign[x, y] = 1;
                buttonarray[x, y].FlatStyle = FlatStyle.Popup;
                buttonarray[x, y].Text = Convert.ToString(MileState[x, y]);
            }
            //鼠标左键,错误
            if (e.Button == MouseButtons.Left && MileState[x, y] == -1)
            {
                for (x = 0; x < heights; x++)
                    for (y = 0; y < widths; y++)
                    {
                        if (MileState[x, y] != 0)
                            buttonarray[x, y].Text = Convert.ToString(MileState[x, y]);
                        else
                            buttonarray[x, y].FlatStyle = FlatStyle.Popup;
                    }
                start.Text = "?";
                MessageBox.Show("哎呀,点错了,重新开始吧!");
            }
            //鼠标右键
            if (e.Button == MouseButtons.Right)
            {
                //第一次鼠标右键
                if (buttonarray[x, y].Text == "" && sign[x, y] == 0)
                {
                    //用X表示雷
                    buttonarray[x, y].Text = "×";
                    sign[x, y] = 1;
                    if (MileState[x, y] == -1)
                    {
                        if (--remain == 0) MessageBox.Show("恭喜你,扫雷成功,回去领赏吧", "成功");
                    }
                }
                //第二次鼠标右键
                else if (buttonarray[x, y].Text == "×")
                {
                    buttonarray[x, y].Text = "?";
                    remain++;
                }
                //第三次鼠标右键
                else if (buttonarray[x, y].Text == "?")
                {
                    buttonarray[x, y].Text = "";
                    sign[x, y] = 0;
                }
            }
        }

        //显示周围雷区的情况,递归
        private void print(int x, int y, int[,] sign)
        {
            buttonarray[x, y].FlatStyle = FlatStyle.Popup;
            sign[x, y] = 1;
            notMiles--;
            if (x - 1 >= 0 && y - 1 >= 0 && sign[x - 1, y - 1] == 0)
                if (MileState[x - 1, y - 1] > 0)
                {
                    buttonarray[x - 1, y - 1].Text = Convert.ToString(MileState[x - 1, y - 1]);
                    buttonarray[x - 1, y - 1].FlatStyle = FlatStyle.Popup;
                    sign[x - 1, y - 1] = 1;
                }
                else if (MileState[x - 1, y - 1] == 0) print(x - 1, y - 1, sign);
            if (x - 1 >= 0 && sign[x - 1, y] == 0)
                if (MileState[x - 1, y] > 0)
                {
                    buttonarray[x - 1, y].Text = Convert.ToString(MileState[x - 1, y]);
                    buttonarray[x - 1, y].FlatStyle = FlatStyle.Popup;
                    sign[x - 1, y] = 1;
                }
                else if (MileState[x - 1, y] == 0) print(x - 1, y, sign);
            if (x - 1 >= 0 && y + 1 < widths && sign[x - 1, y + 1] == 0)
                if (MileState[x - 1, y + 1] > 0)
                {
                    buttonarray[x - 1, y + 1].Text = Convert.ToString(MileState[x - 1, y + 1]);
                    buttonarray[x - 1, y + 1].FlatStyle = FlatStyle.Popup;
                    sign[x - 1, y + 1] = 1;
                }
                else if (MileState[x - 1, y + 1] == 0) print(x - 1, y + 1, sign);
            if (y - 1 >= 0 && sign[x, y - 1] == 0)
                if (MileState[x, y - 1] > 0)
                {
                    buttonarray[x, y - 1].Text = Convert.ToString(MileState[x, y - 1]);
                    buttonarray[x, y - 1].FlatStyle = FlatStyle.Popup;
                    sign[x, y - 1] = 1;
                }
                else if (MileState[x, y - 1] == 0) print(x, y - 1, sign);
            if (y + 1 < widths && sign[x, y + 1] == 0)
                if (MileState[x, y + 1] > 0)
                {
                    buttonarray[x, y + 1].Text = Convert.ToString(MileState[x, y + 1]);
                    buttonarray[x, y + 1].FlatStyle = FlatStyle.Popup;
                    sign[x, y + 1] = 1;
                }
                else if (MileState[x, y + 1] == 0) print(x, y + 1, sign);
            if (x + 1 < heights && y - 1 >= 0 && sign[x + 1, y - 1] == 0)
                if (MileState[x + 1, y - 1] > 0)
                {
                    buttonarray[x + 1, y - 1].Text = Convert.ToString(MileState[x + 1, y - 1]);
                    buttonarray[x + 1, y - 1].FlatStyle = FlatStyle.Popup;
                    sign[x + 1, y - 1] = 1;
                }
                else if (MileState[x + 1, y - 1] == 0) print(x + 1, y - 1, sign);
            if (x + 1 < heights && sign[x + 1, y] == 0)
                if (MileState[x + 1, y] > 0)
                {
                    buttonarray[x + 1, y].Text = Convert.ToString(MileState[x + 1, y]);
                    buttonarray[x + 1, y].FlatStyle = FlatStyle.Popup;
                    sign[x + 1, y] = 1;
                }
                else if (MileState[x + 1, y] == 0) print(x + 1, y, sign);
            if (x + 1 < heights && y + 1 < widths && sign[x + 1, y + 1] == 0)
                if (MileState[x + 1, y + 1] > 0)
                {
                    buttonarray[x + 1, y + 1].Text = Convert.ToString(MileState[x + 1, y + 1]);
                    buttonarray[x + 1, y + 1].FlatStyle = FlatStyle.Popup;
                    sign[x + 1, y + 1] = 1;
                }
                else if (MileState[x + 1, y + 1] == 0) print(x + 1, y + 1, sign);
        }

    }
}

五、实验结果:

1、用”×”标记雷点,用”?”标记疑问点,空白点表示周围无雷点或者该点还未点开,根据颜色区别二者。

2、游戏胜利和游戏结束显示messagebox。

3、第一次开始点击笑脸按钮,重新开始点击哭脸按钮。

4、点击开始菜单栏的子菜单栏选择游戏难度,初级、中级、高级的雷点分别为10、40、99个
(初级)
(中级)
(高级)
点击雷点,显示游戏错误,游戏结束

六、总结

通过本次实验,对c#控件和窗体有了更深入的了解,懂得如何根据各个控件的特点实现扫雷对应的功能,希望在以后能更加熟练地使用各个控件。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

C#实现扫雷游戏

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

C#如何实现扫雷游戏

今天小编给大家分享一下C#如何实现扫雷游戏的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、实验目的:1、掌握c#窗体和控件
2023-07-02

C语言怎样实现扫雷游戏

这篇文章主要介绍了C语言怎样实现扫雷游戏,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。概述扫雷是一款大众类的益智小游戏。游戏目标是根据点击格子出现的数字找出所有非雷格子,同时
2023-06-15

使用C语言实现扫雷游戏

这篇文章主要为大家详细介绍了使用C语言实现扫雷游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
2022-11-13

如何使用C++实现扫雷游戏

这篇文章主要介绍了如何使用C++实现扫雷游戏,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。扫雷最原始的版本可以追溯到1973年一款名为“方块”的游戏。 不久,“方块”被改写成
2023-06-25

C++怎么实现趣味扫雷游戏

这篇文章主要介绍C++怎么实现趣味扫雷游戏,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!流程设计1.初始化阵列。2.输入坐标点。3.选择:挖掘,标记,取消标记,重启,退出游戏。如果选了挖掘,判断坐标点是地雷则游戏结束
2023-06-15

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录