八、随机布雷

/// <summary>
/// 随机布地雷
/// </summary>
/// <param name="mineNum">地雷数</param>
private void SetRndMine(int mineNum)
{for (int k = 0; k < mineNum; k++){int nullnum = 0;for (int j = 0; j < _gameLevel._colGrid; j++){for (int i = 0; i < _gameLevel._rowGrid; i++){if (_backData[j, i] == (int)BackState.BLANK)nullnum++;}}if (nullnum < 1)return;int index = rnd.Next(1, nullnum);nullnum = 0;for (int j = 0; j < _gameLevel._colGrid; j++){for (int i = 0; i < _gameLevel._rowGrid; i++){if (_backData[j, i] == 0){nullnum++;if (nullnum != index)continue;_backData[j, i] = (int)BackState.MINE;        // 设置为地雷
                }}}}
}

这个方法是不是很熟悉,我们在2048游戏中用到过,这里就不再多说了。

九、设置地雷旁边的格子标注的地雷数值原理就是读取地雷位置,然后分别给不是地雷的格子数值+1。
/// <summary>
/// 设置地雷周围格子雷数
/// </summary>
private void SetCellMineNumber()
{for (int y = 0; y < _gameLevel._colGrid; y++){for (int x = 0; x < _gameLevel._rowGrid; x++){if (_backData[y, x] == (int)BackState.MINE)       // 遇到地雷则周围8格分别+1
            {if (x - 1 > -1 && y - 1 > -1 && _backData[y - 1, x - 1] != (int)BackState.MINE)_backData[y - 1, x - 1]++;if (y - 1 > -1 && _backData[y - 1, x] != (int)BackState.MINE)_backData[y - 1, x]++;if (y - 1 > -1 && x + 1 < _gameLevel._rowGrid && _backData[y - 1, x + 1] != (int)BackState.MINE)_backData[y - 1, x + 1]++;if (x - 1 > -1 && _backData[y, x - 1] != (int)BackState.MINE)_backData[y, x - 1]++;if (x + 1 < _gameLevel._rowGrid && _backData[y, x + 1] != (int)BackState.MINE)_backData[y, x + 1]++;if (y + 1 < _gameLevel._colGrid && x - 1 > -1 && _backData[y + 1, x - 1] != (int)BackState.MINE)_backData[y + 1, x - 1]++;if (y + 1 < _gameLevel._colGrid && _backData[y + 1, x] != (int)BackState.MINE)_backData[y + 1, x]++;if (y + 1 < _gameLevel._colGrid && x + 1 < _gameLevel._rowGrid && _backData[y + 1, x + 1] != (int)BackState.MINE)_backData[y + 1, x + 1]++;}}}
}

十、设置背景区图片组

循环读取背景区数据,根据数值设置对应的图片源。

private void SetBackCellImage()
{BackCanvas.Children.Clear();for (int y=0; y<_gameLevel._colGrid; y++){for (int x=0; x<_gameLevel._rowGrid; x++){_backImage[y, x] = new Image();if (_backData[y, x] == (int)BackState.BLANK){_backImage[y, x].Source = ImageHelper.CutImage(_bmpSpace, new Int32Rect(0, 0, _cellSize.Width, _cellSize.Height));}else if (_backData[y, x] == (int)BackState.MINE){_backImage[y, x].Source = ImageHelper.CutImage(_bmpMine, new Int32Rect(0, 0, _cellSize.Width, _cellSize.Height));}else{for (int i = 0; i < 8; i++){if (_backData[y, x] == (i+1)){_backImage[y, x].Source = ImageHelper.CutImage(_bmpNum1_8, new Int32Rect(i * _cellSize.Width, 0, _cellSize.Width, _cellSize.Height));break;}}}_backImage[y, x].SetValue(Canvas.LeftProperty, x * (double)_cellSize.Width);_backImage[y, x].SetValue(Canvas.TopProperty, y * (double)_cellSize.Height);BackCanvas.Children.Add(_backImage[y, x]);}}
}

十一、开始游戏准备

根据游戏级别分别调用随机布雷、设置雷边数值方法,同时添加背景图片数组到游戏背景区。

private void ResetGame()
{InitialGameState();InitGameData(_level);textBlockMineNum.Text = _gameLevel._mineNum.ToString();SetRndMine(_gameLevel._mineNum);SetCellMineNumber();SetBackCellImage();
}

将该方法添加到开始游戏菜单中,并计时器打开。

private void MenuGameStart_Click(object sender, RoutedEventArgs e)
{ResetGame();_gameState = GameState.START;//  开始计时
    _stopWatchGame.Start();_timerSetTimeText.Start();
}

重复点击开始菜单,看看效果。

十二、调整游戏级别

根据菜单设置的当前级别值设置菜单选择状态。

/// <summary>
/// 设置级别菜单状态
/// </summary>
/// <param name="level"></param>
private void SetMenuLevelState(Level level)
{switch (level){case Level.SIMPLE:MenuLowLevel.IsChecked = true;MenuMiddleLevel.IsChecked = false;MenuHighLevel.IsChecked = false;break;case Level.NORMAL:MenuLowLevel.IsChecked = false;MenuMiddleLevel.IsChecked = true;MenuHighLevel.IsChecked = false;break;case Level.HARD:MenuLowLevel.IsChecked = false;MenuMiddleLevel.IsChecked = false;MenuHighLevel.IsChecked = true;break;}
}

/// <summary>
/// 初级级别菜单
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void MenuLowLevel_Click(object sender, RoutedEventArgs e)
{if (_level == Level.SIMPLE)return;if (MessageBox.Show("将用新难度级别重置游戏,确认要继续吗?", "警告", MessageBoxButton.YesNo, MessageBoxImage.Asterisk)== MessageBoxResult.Yes){_level = Level.SIMPLE;SetMenuLevelState(_level);ResetGame();}
}/// <summary>
/// 中级级别菜单
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void MenuMiddleLevel_Click(object sender, RoutedEventArgs e)
{if (_level == Level.NORMAL)return;if (MessageBox.Show("将用新难度级别重置游戏,确认要继续吗?", "警告", MessageBoxButton.YesNo, MessageBoxImage.Asterisk)== MessageBoxResult.Yes){_level = Level.NORMAL;SetMenuLevelState(_level);ResetGame();}
}/// <summary>
/// 高级级别菜单
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void MenuHighLevel_Click(object sender, RoutedEventArgs e)
{if (_level == Level.HARD)return;if (MessageBox.Show("将用新难度级别重置游戏,确认要继续吗?", "警告", MessageBoxButton.YesNo, MessageBoxImage.Asterisk)== MessageBoxResult.Yes){_level = Level.HARD;SetMenuLevelState(_level);ResetGame();}
}

十三、设置前景区图片组

/// <summary>
/// 设置前景图片数组
/// </summary>
private void SetForeCellImages()
{ForeCanvas.Children.Clear();for (int y = 0; y < _gameLevel._colGrid; y++){for (int x = 0; x < _gameLevel._rowGrid; x++){if (_foreData[y, x] > (int)ForeState.NONE){_foreImage[y, x] = new Image();_foreImage[y, x].Source = ImageHelper.CutImage(_bmpForeground, new Int32Rect(0, 0, _cellSize.Width, _cellSize.Height));_foreImage[y, x].SetValue(Canvas.LeftProperty, x * (double)_cellSize.Width);_foreImage[y, x].SetValue(Canvas.TopProperty, y * (double)_cellSize.Height);ForeCanvas.Children.Add(_foreImage[y, x]);}}}
}

在ResetGame()方法最后位置加入对该方法的调用。
 运行程序,看看效果。

转载于:https://www.cnblogs.com/moonblogcore/p/10944619.html

练手WPF(三)——扫雷小游戏的简易实现(中)相关推荐

  1. C实现扫雷小游戏(简易版)

    你知道,有些鸟儿是注定不会被关在牢笼里的,它们的每一片羽毛都闪耀着自由的光辉.--<肖申克的救赎> 目录 1.设计框架 2.设计流程 2.1菜单 2.2初始化雷阵 2.3生成雷 2.4玩家 ...

  2. 扫雷小游戏(简易版)

    写个小游戏娱乐娱乐! 目录:1.简要分析            2.实现扫雷游戏细节             3.总代码 1.简要分析 一般写这种小游戏要分为两个模块:头文件,源文件.头文件中声明各种 ...

  3. 怎么用python编简单游戏大全_适合新手练手的三个python简单小游戏

    学Python之前我们先来几个简单的小游戏练练手,这三个小游戏一个比一个复杂,建议新手慢慢来: 1.猜拳: import random #导入随机模块 num = 1 yin_num = 0 shu_ ...

  4. 适合新手练手的三个python简单小游戏

    学Python之前我们先来几个简单的小游戏练练手,这三个小游戏一个比一个复杂,建议新手慢慢来: 1.猜拳: import random #导入随机模块num = 1 yin_num = 0 shu_n ...

  5. 一个扫雷小游戏带你初识VUE3和typescript

    一个扫雷小游戏带你初识VUE3和typescript 阅读本文你会了解到: vue3的部分新特性 typescript的基本使用 部分es6语法 基础部分 为什么要使用ref和reactive来声明变 ...

  6. 【java游戏开发】教你用java做出扫雷小游戏

    扫雷是一款大众类的益智小游戏.根据点击格子出现的数字找出所有非雷格子,同时避免踩雷,踩到一个雷即全盘皆输. 本课程详细讲解一个扫雷游戏的开发过程.只要90分钟就可以完成一个你自己亲手开发出来的Java ...

  7. 用C语言实现扫雷小游戏(附上思路+项目展示+源代码)

    文章目录 前言 一.扫雷小游戏整体思路讲解. 二.game.c各游戏功能函数的讲解 1.InitBoard 初始化数组函数讲解 2.DisplayBoard 打印格子函数讲解 3.Setmine 电脑 ...

  8. 如何开发一个扫雷小游戏?

    如何用C#开发一个扫雷小游戏? 十分自豪的说,计算机编程就是变魔术,每一个coder都是一个魔术师. 初学C#的时候,我相信很多人都和我一样,学会了基本语法,掌握了基本的数据结构,也见过了不少微软提供 ...

  9. 用C语言实现一个简单的扫雷小游戏(附全代码及教程)

    本文实例为大家分享了C语言实现扫雷游戏的具体代码,供大家参考,具体内容如下: 首先,创建一个text.c文件: 编写主函数: int main() {test();return 0; } 定义test ...

最新文章

  1. jQuery选择器 (详解)
  2. android api文档中文版_什么骚操作,用Android能写后台服务?
  3. 爬虫库之BeautifulSoup学习(五)
  4. dell 服务器r410装系统,dell r410安装windows2003系统
  5. USB杀手上Indigogo众筹 可以毁坏电脑USB接口
  6. SQL进阶教程PDF下载
  7. Android应用实现开机自启动
  8. PCB六层板如何分层最好?
  9. qq邮箱显示服务器连接错误,为什么我的QQ邮箱显示网络错误
  10. c java多态_浅谈Java多态
  11. WebDAV之葫芦儿·派盘+小书匠
  12. Screen Wonders for Mac (3D动态视频壁纸) v1.9.1
  13. 小程序之 一个方法中的值怎么传递到另一个方法中
  14. 雷军:何以英雄背骂名!
  15. 实例004:这天第几天 输入某年某月某日,判断这一天是这一年的第几天?
  16. 傅里叶变换后信号的频谱分析中相位角的求法
  17. python发微信提醒天气冷了注意保暖_提醒人注意保暖的句子 天气冷了注意保暖句子...
  18. 零基础自学python?大专生靠python涨薪8K,成功上岸,分享全套学习方法及经验
  19. python下载网页上的文件_用Python下载一个网页保存为本地的HTML文件实例
  20. 【新书推荐】【2019.05】财务诡计:如何识别财务报告中的会计诡计和舞弊(原书第4版)...

热门文章

  1. *27.硬实时和软实时
  2. 用蛾子触角当天线,用气味导航!美国博士发明奇特生物技术无人机
  3. Elasticsearch集群部署的相关问题记录
  4. oracle终止dbms调度,Oracle使用DBMS_JOB创建的数据库作业,遇到数据库关闭状态的调度...
  5. java任务_Java 任务处理
  6. IDEA创建maven JavaWeb工程
  7. python解析库beautifulsoup_12_Python_解析库_BeautifulSoup的使用
  8. 031_vue编程式导航
  9. 008_html属性
  10. mysql导入数据表大小限制,解除phpMyAdmin导入大型MySQL数据库文件大小限制