广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >100行C#代码实现经典扫雷游戏
  • 485
分享到

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

C#实现扫雷游戏C#扫雷游戏C#扫雷C#游戏 2023-02-27 11:02:14 485人浏览 薄情痞子
摘要

目录布局生成雷区左键扫雷和右键标记翻面功能布局 布局效果如下,下面每个“网格”都是一个按钮,点击按钮,就会有相应的事件发生。 由于UnifORMGrid中每

布局

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

由于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#扫雷游戏的资料请关注编程网其它相关文章!

--结束END--

本文标题: 100行C#代码实现经典扫雷游戏

本文链接: https://www.lsjlt.com/news/197621.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • 100行C#代码实现经典扫雷游戏
    目录布局生成雷区左键扫雷和右键标记翻面功能布局 布局效果如下,下面每个“网格”都是一个按钮,点击按钮,就会有相应的事件发生。 由于UniformGrid中每...
    99+
    2023-02-27
    C#实现扫雷游戏 C#扫雷游戏 C#扫雷 C#游戏
  • 怎么使用C#代码实现经典扫雷游戏
    这篇文章主要介绍“怎么使用C#代码实现经典扫雷游戏”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么使用C#代码实现经典扫雷游戏”文章能帮助大家解决问题。布局布局效果如下,下面每个“网格”都是一个按...
    99+
    2023-07-05
  • C语言实现扫雷经典游戏
    C语言实现扫雷游戏,供大家参考,具体内容如下 实现扫雷游戏 与三子棋游戏类似,为了便于后期对于代码的阅读、理解与地图大小和地雷的数量变更,先用#define定义一个标识符表示一个常量...
    99+
    2022-11-12
  • js实现经典扫雷游戏
    本文实例为大家分享了js实现经典扫雷游戏的具体代码,供大家参考,具体内容如下 项目结构 实现效果 思路流程 1、写出基本的布局 2、利用js生成扫雷的table表格 3、利用随...
    99+
    2022-11-12
  • JAVA实现经典扫雷游戏的示例代码
    目录前言主要设计功能截图代码实现总结前言 windows自带的游戏《扫雷》是陪伴了无数人的经典游戏,本程序参考《扫雷》的规则进行了简化,用java语言实现,采用了swing技术进行了...
    99+
    2022-11-13
  • C语言实现经典windows游戏扫雷的示例代码
    目录1. 前言2. 准备工作3. 设计思路4. 定义数组5. 初始化6. 打印7. 布置雷8. 排查雷9. 完整代码game.hgame.ctest.c1. 前言 大家好,我是努力学...
    99+
    2022-11-13
    C语言扫雷游戏 C语言 扫雷 C语言 游戏
  • C语言实现经典扫雷小游戏的示例代码
    目录一、游戏简介二、游戏实现1.初始化棋盘2.打印棋盘3.布置雷4.排查雷三、源文件1.game.h2.game.c3.Test.c一、游戏简介 游戏初始界面有两个选择,选项&ldq...
    99+
    2022-11-13
    C语言扫雷游戏 C语言 扫雷 C语言 游戏
  • C语言实现经典扫雷游戏流程
    目录扫雷小游戏简介一、分析与实现1.设计棋盘2.放置雷以及排雷二、扫雷小游戏演示三、源码总结扫雷小游戏简介 想必很多人小时候电脑没网的时候都玩儿过这个经典的小游戏,也都被它折磨过。其...
    99+
    2022-11-12
  • 怎么用C语言实现扫雷经典游戏
    本篇内容介绍了“怎么用C语言实现扫雷经典游戏”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!C语言实现扫雷游戏,供大家参考,具体内容如下实现扫...
    99+
    2023-06-20
  • c++实现扫雷小游戏代码分享
    分成两个源文件和一个头文件 注意:这串代码并不完整,不能够实现当所查坐标周围雷的数量为0时,直接展开周围坐标; 头文件:game.h #include <stdio.h>...
    99+
    2022-11-13
  • 微信小程序实现经典window扫雷游戏
    前言 打开手机游戏列表发现了一款经典的扫雷游戏,在玩的过程中发现游戏逻辑应该不难,想着是不是能自己写写这个游戏,后来用了1天实现了整体游戏开发,于是有了这篇文章来总结整体的游戏开发思...
    99+
    2022-11-13
  • C#实现扫雷游戏
    目录一、实验目的:二、实验要求:三、实验内容:四、实验源代码:五、实验结果:六、总结本文实例为大家分享了C#实现扫雷游戏的具体代码,供大家参考,具体内容如下 一、实验目的: 1、掌握...
    99+
    2022-11-13
  • 怎么用c++代码实现扫雷小游戏
    这篇文章主要介绍了怎么用c++代码实现扫雷小游戏的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么用c++代码实现扫雷小游戏文章都会有所收获,下面我们一起来看看吧。分成两个源文件和一个头文件注意:这串代码并不完...
    99+
    2023-06-29
  • C语言实现经典扫雷小游戏完整代码(递归展开 + 选择标记)
    目录游戏介绍游戏整体框架游戏具体功能及实现1、雷盘的定义2、雷盘的初始化3、布置雷4、排查雷5、递归式展开一片6、获取周围雷的个数7、标记特定位置8、打印雷盘游戏完整代码 ...
    99+
    2022-11-13
  • C语言实现扫雷小游戏详细代码
    前言 扫雷是一款很经典的电脑小游戏,扫雷就是要把所有非地雷的格子找出即为胜利,输入到地雷格子就算失败。游戏主区域由很多个方格组成,输入一个方格坐标,方格即被打开并显示出方格中的数字,...
    99+
    2022-11-12
  • C#实现经典飞行棋游戏的示例代码
    目录效果展示主函数  场景类型枚举控制台基础设置开始及结束场景逻辑游戏场景逻辑固定打印的信息格子类型枚举和格子结构体  地图结构体玩家和电脑结...
    99+
    2022-11-13
  • 用C语言实现扫雷小游戏实例代码
    本篇内容主要讲解“用C语言实现扫雷小游戏实例代码”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“用C语言实现扫雷小游戏实例代码”吧!本文实例为大家分享了C语言版扫雷小游戏的具体代码,供大家参考,具...
    99+
    2023-06-20
  • c语言扫雷小游戏源代码
    这期内容当中小编将会给大家带来有关c语言扫雷小游戏源代码,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。说明:该游戏的实现需要建立三个文件test2.c:整个游戏,开始游戏/退出游戏的大体执行流程game2...
    99+
    2023-06-06
  • C#如何实现扫雷游戏
    今天小编给大家分享一下C#如何实现扫雷游戏的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、实验目的:掌握c#窗体和控件的常...
    99+
    2023-07-02
  • C++实现趣味扫雷游戏
    本文实例为大家分享了C++实现趣味扫雷游戏的具体代码,供大家参考,具体内容如下 流程设计 1.初始化阵列。 2.输入坐标点。 3.选择:挖掘,标记,取消标记,重启,退出游戏。 如果选...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作