练手WPF(三)——扫雷小游戏的简易实现(中)
八、随机布雷
/// <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(三)——扫雷小游戏的简易实现(中)相关推荐
- C实现扫雷小游戏(简易版)
你知道,有些鸟儿是注定不会被关在牢笼里的,它们的每一片羽毛都闪耀着自由的光辉.--<肖申克的救赎> 目录 1.设计框架 2.设计流程 2.1菜单 2.2初始化雷阵 2.3生成雷 2.4玩家 ...
- 扫雷小游戏(简易版)
写个小游戏娱乐娱乐! 目录:1.简要分析 2.实现扫雷游戏细节 3.总代码 1.简要分析 一般写这种小游戏要分为两个模块:头文件,源文件.头文件中声明各种 ...
- 怎么用python编简单游戏大全_适合新手练手的三个python简单小游戏
学Python之前我们先来几个简单的小游戏练练手,这三个小游戏一个比一个复杂,建议新手慢慢来: 1.猜拳: import random #导入随机模块 num = 1 yin_num = 0 shu_ ...
- 适合新手练手的三个python简单小游戏
学Python之前我们先来几个简单的小游戏练练手,这三个小游戏一个比一个复杂,建议新手慢慢来: 1.猜拳: import random #导入随机模块num = 1 yin_num = 0 shu_n ...
- 一个扫雷小游戏带你初识VUE3和typescript
一个扫雷小游戏带你初识VUE3和typescript 阅读本文你会了解到: vue3的部分新特性 typescript的基本使用 部分es6语法 基础部分 为什么要使用ref和reactive来声明变 ...
- 【java游戏开发】教你用java做出扫雷小游戏
扫雷是一款大众类的益智小游戏.根据点击格子出现的数字找出所有非雷格子,同时避免踩雷,踩到一个雷即全盘皆输. 本课程详细讲解一个扫雷游戏的开发过程.只要90分钟就可以完成一个你自己亲手开发出来的Java ...
- 用C语言实现扫雷小游戏(附上思路+项目展示+源代码)
文章目录 前言 一.扫雷小游戏整体思路讲解. 二.game.c各游戏功能函数的讲解 1.InitBoard 初始化数组函数讲解 2.DisplayBoard 打印格子函数讲解 3.Setmine 电脑 ...
- 如何开发一个扫雷小游戏?
如何用C#开发一个扫雷小游戏? 十分自豪的说,计算机编程就是变魔术,每一个coder都是一个魔术师. 初学C#的时候,我相信很多人都和我一样,学会了基本语法,掌握了基本的数据结构,也见过了不少微软提供 ...
- 用C语言实现一个简单的扫雷小游戏(附全代码及教程)
本文实例为大家分享了C语言实现扫雷游戏的具体代码,供大家参考,具体内容如下: 首先,创建一个text.c文件: 编写主函数: int main() {test();return 0; } 定义test ...
最新文章
- jQuery选择器 (详解)
- android api文档中文版_什么骚操作,用Android能写后台服务?
- 爬虫库之BeautifulSoup学习(五)
- dell 服务器r410装系统,dell r410安装windows2003系统
- USB杀手上Indigogo众筹 可以毁坏电脑USB接口
- SQL进阶教程PDF下载
- Android应用实现开机自启动
- PCB六层板如何分层最好?
- qq邮箱显示服务器连接错误,为什么我的QQ邮箱显示网络错误
- c java多态_浅谈Java多态
- WebDAV之葫芦儿·派盘+小书匠
- Screen Wonders for Mac (3D动态视频壁纸) v1.9.1
- 小程序之 一个方法中的值怎么传递到另一个方法中
- 雷军:何以英雄背骂名!
- 实例004:这天第几天 输入某年某月某日,判断这一天是这一年的第几天?
- 傅里叶变换后信号的频谱分析中相位角的求法
- python发微信提醒天气冷了注意保暖_提醒人注意保暖的句子 天气冷了注意保暖句子...
- 零基础自学python?大专生靠python涨薪8K,成功上岸,分享全套学习方法及经验
- python下载网页上的文件_用Python下载一个网页保存为本地的HTML文件实例
- 【新书推荐】【2019.05】财务诡计:如何识别财务报告中的会计诡计和舞弊(原书第4版)...
热门文章
- *27.硬实时和软实时
- 用蛾子触角当天线,用气味导航!美国博士发明奇特生物技术无人机
- Elasticsearch集群部署的相关问题记录
- oracle终止dbms调度,Oracle使用DBMS_JOB创建的数据库作业,遇到数据库关闭状态的调度...
- java任务_Java 任务处理
- IDEA创建maven JavaWeb工程
- python解析库beautifulsoup_12_Python_解析库_BeautifulSoup的使用
- 031_vue编程式导航
- 008_html属性
- mysql导入数据表大小限制,解除phpMyAdmin导入大型MySQL数据库文件大小限制