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

100行C#代码实现经典扫雷游戏

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

北京

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

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

看不清楚,换张图片

免费获取短信验证码

100行C#代码实现经典扫雷游戏

布局

布局效果如下,下面每个“网格”都是一个按钮,点击按钮,就会有相应的事件发生。

由于UniformGrid中每个Grid的尺寸相等,所以作为雷区的容器。

    <DockPanel>
        <DockPanel.Resources>
            <Style TargetType="TextBlock">
                <Setter Property="Margin" Value="5"/>
            </Style>
            <Style TargetType="TextBox">
                <Setter Property="Margin" Value="5"/>
                <Setter Property="InputMethod.IsInputMethodEnabled" Value="False"/>
            </Style>

        </DockPanel.Resources>
        <ToolBar DockPanel.Dock="Top">
            <TextBlock Text="雷区尺寸"/>
            <TextBox Width="40" Text="20" x:Name="txtNumX"/>
            <TextBlock Text="×"/>
            <TextBox Width="40" Text="20" x:Name="txtNumY"/>
            <TextBlock Text="雷数"/>
            <TextBox Width="40" Text="20" x:Name="txtNumMine"/>
            <Button Content="?" Click="btnNewGame_Click"/>
        </ToolBar>
        <UniformGrid Name="ugMine">
        </UniformGrid>

生成雷区

值得一提的是,由于随机数可能在生成过程中产生重复的值,所以这里通过概率的方式来生成雷。

假设按钮数为N,雷数为n,那么在][0,N]之间随机生成一个数x,如果x<n,则判定当前按钮为雷。按钮是否为雷的标志作为布尔型存放在btn.tag中。

由于通过遍历的方法生成雷,所以一旦剩余雷的个数和剩余按钮的个数相等,就说明剩余的按钮全都是雷。这种情况发生,则不必进行随机数的判定。

private void newGame()
{
   x = int.Parse(txtNumX.Text);
   y = int.Parse(txtNumY.Text);
   var nBtns = x * y;
   nMark = 0;
   nRes = int.Parse(txtNumMine.Text);
   if (nRes > nBtns)
       nRes = nBtns;

   pMine = new List<int>();

   ugMine.Rows = y;
   ugMine.Columns = x;
   ugMine.Children.Clear();

   Random rd = new Random();
   int numSetMine = 0;         //已经布置的雷的个数

   for (int i = 0; i < nBtns; i++)
   {
       var btn = new Button();
       ugMine.Children.Add(btn);
       btn.Click += Btn_Click;
       btn.MouseRightButtonDown += Btn_MouseRightButtonDown;
       btn.Content = "";
       btn.Tag = false;
       if ((nRes - numSetMine) == (nBtns - i) ||       //如果剩余的雷数刚好等于剩余的按钮数,则剩下的按钮都是雷
           (numSetMine < nRes && rd.Next(0, nBtns) < nRes))
       {
           btn.Tag = true;
           numSetMine += 1;
           pMine.Add(i);
       }
   }
}

左键扫雷和右键标记

左键点击,则类似于一个翻面的动作;右键点击,则相当于是标记,而且在标记之后,不能再通过左键进行翻面。

//左键单击
private void Btn_Click(object sender, RoutedEventArgs e)
{
   var btn = sender as Button;
   int index = ugMine.Children.IndexOf(btn);
   flipButton(index);
   if(nMark == pMine.Count || nRes == pMine.Count)
       MessageBox.Show("您赢了!");
}
//右键单击
private void Btn_MouseRightButtonDown(object sender, MouseButtonEventArgs e)
{
   var btn = sender as Button;
   var flag = btn.Content.ToString() != "?";
   if (flag)
       btn.Click -= Btn_Click;	//如果已经标记,则卸载左键的功能
   else
       btn.Click += Btn_Click;	//如果取消标记,则重新挂载左键的功能

   btn.Content = flag ? "?" : "";
   btn.Foreground = flag ? Brushes.Red : Brushes.Gray;
   nMark += flag ? 1 : -1;
}

右键单击效果如下

翻面功能

在翻面的时候,如果当前按钮为雷,则雷炸了,游戏结束。

如果当前按钮不是雷,那么判断该按钮周围是否有雷。如果有雷,则当前按钮显示周围雷的个数;如果没雷,则将周围的雷全部翻面——需要调用自身。

private void flipButton(int index)
{
   var btn = ugMine.Children[index] as Button;
   if (!btn.IsEnabled)
       return;
   if ((bool)btn.Tag)
   {
       foreach (var i in pMine)
       {
           var mine = ugMine.Children[i] as Button;
           mine.Content = "?";
           mine.Foreground = Brushes.Red;
       }
       MessageBox.Show("您输了");
       return;
   }
   nRes -= 1;
   btn.IsEnabled = false;
   int numMines = 0;

   var nears = setNear(index);
   foreach (var i in nears)
   {
       var near = ugMine.Children[i] as Button;
       if ((bool)near.Tag) 
           numMines += 1;
   }
   if (numMines != 0)
       btn.Content = numMines;
   else
       foreach (var i in nears)
           flipButton(i);
}

其中setNear是用于获取当前按周围按钮的序号,这里分别需要考虑四个角、四个边以及中间区域。

private int[] setNear(int index)
{
   if (index == 0)
       return new int[3] { 1, x, x + 1 };
   if (index == x * y - 1)
       return new int[3] { index - 1, index - x, index - x - 1 };
   if (index == x - 1)
       return new int[3] { x - 2, 2 * x - 1, 2 * x - 2 };
   if (index == x * y - x)
       return new int[3] { index + 1, index - x, index - x + 1 };
   if (index % x == 0)
       return new int[5] { index - x, index - x + 1, index + 1, index + x, index + x + 1 };
   if (index % x == (x - 1))
       return new int[5] { index - x - 1, index - x, index - 1, index + x - 1, index + x };
   if (index < x)
       return new int[5] { index - 1, index + 1, index + x - 1, index + x, index + x + 1 };
   if (index > x * (y - 1))
       return new int[5] { index - x - 1, index - x, index - x + 1, index - 1, index + 1 };
   return new int[8] { index - 1, index + 1, index - x, index-x-1,
       index-x+1,index + x,index+x-1,index+x+1 };
}

效果如下

以上就是100行C#代码实现经典扫雷游戏的详细内容,更多关于C#扫雷游戏的资料请关注编程网其它相关文章!

免责声明:

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

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

100行C#代码实现经典扫雷游戏

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

下载Word文档

猜你喜欢

100行C#代码实现经典扫雷游戏

这篇文章主要为大家详细介绍了如何用100行C#代码实现经典的扫雷游戏,文中的示例代码讲解详细,具有一定的借鉴价值,需要的可以参考一下
2023-02-27

怎么使用C#代码实现经典扫雷游戏

这篇文章主要介绍“怎么使用C#代码实现经典扫雷游戏”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么使用C#代码实现经典扫雷游戏”文章能帮助大家解决问题。布局布局效果如下,下面每个“网格”都是一个按
2023-07-05

C语言实现经典windows游戏扫雷的示例代码

今天我们会用C语言实现一个经典的windows小游戏:扫雷。扫雷是一款单机小游戏,每次通关最高难度的关卡都会开心好一阵。现在学会了C语言,总算可以自己实现扫雷了。话不多说,咱们开始吧
2022-11-13

C语言实现经典扫雷小游戏的示例代码

扫雷游戏是在一个指定的二维空间里,随机布置雷,把不是雷的位置都找出来,在你点一个位置的时候它会显示它周围全部雷的个数,根据这个线索去找,会更容易赢。本文将用C语言实现这一经典游戏,感兴趣的可以尝试一下
2022-11-13

怎么用C语言实现扫雷经典游戏

本篇内容介绍了“怎么用C语言实现扫雷经典游戏”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!C语言实现扫雷游戏,供大家参考,具体内容如下实现扫
2023-06-20

怎么用c++代码实现扫雷小游戏

这篇文章主要介绍了怎么用c++代码实现扫雷小游戏的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么用c++代码实现扫雷小游戏文章都会有所收获,下面我们一起来看看吧。分成两个源文件和一个头文件注意:这串代码并不完
2023-06-29

用C语言实现扫雷小游戏实例代码

本篇内容主要讲解“用C语言实现扫雷小游戏实例代码”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“用C语言实现扫雷小游戏实例代码”吧!本文实例为大家分享了C语言版扫雷小游戏的具体代码,供大家参考,具
2023-06-20

Android 实现扫雷小游戏实例代码

Android 实现扫雷小游戏实例 最近学习Android 应用编程,抽空做个小应用,大家熟悉的扫雷应用,练手用, 以下是实现代码: MainActivity 类public class MainActivit
2022-06-06

C语言实现扫雷小游戏的示例代码

这篇文中主要为大家详细介绍了如何利用C语言实现经典的扫雷小游戏。扫雷小游戏主要是利用字符数组、循环语句和函数实现,感兴趣的小伙伴可以了解一下
2022-11-13

C#如何实现扫雷游戏

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

编程热搜

  • 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动态编译

目录