使用WPF教你一步一步实现连连看(三)
这次首先对以前的结构进行了调整:
第一步:把MyButton按钮的属性独立成一个类,放在一个单独的MyButton.cs中,把图片的初始化也放到里面。
调整代码如下:
public class MyButton : Button
{
//图片的名称,用于判断两个按钮是否为同一个
public int Flag { get; set; }//Button所在行
public int RowNum { get; set; }//所在列
public int ColNum { get; set; }public MyButton(int flag, int romNum, int colNum)
{
this.Flag = flag;
this.RowNum = romNum;
this.ColNum = colNum;if (flag != 0)
{
Image img = new Image();
img.Source = new BitmapImage(new Uri(@"images\" + flag + ".png", UriKind.Relative));
this.Content = img;
}
}
}
第二步:将设置随机数独立成MyRandom.cs,这里将图片个数等一些属性都设置成了可变的,调整内容如下
public class MyRandom
{
private int Count; //产生多少个数字
private int Amount; //产生几份
private int Max; //最大数(不包含)
private int Min; //最小数
/// <summary>
///
/// </summary>
/// <param name="count">产生多少个数字</param>
/// <param name="amount">产生几份(须为count的约数)</param>
/// <param name="min">最小数</param>
/// <param name="max">最大数(不包含)</param>
public MyRandom(int count, int amount, int min, int max)
{
if (count % amount != )
throw new Exception("count须为amount的整数倍");
if (min > max)
throw new Exception("min必须小于等于max");
Count = count;
Amount = amount;
Max = max;
Min = min;
}
public List<int> Get()
{
Random rand = new Random();
List<int> ran = new List<int>();
for (int n = ; n < Count / Amount; n++)
ran.Add(rand.Next(Min, Max));
for (int i = ; i < Amount; i++)
{
List<int> temp = new List<int>();
temp.AddRange(ran);
for (int n = ; n < Count / Amount; n++)
{
int r = rand.Next(, temp.Count);
ran.Insert(rand.Next(, ran.Count), temp[r]);
temp.RemoveAt(r);
}
}
return ran;
}
}
第三步:对Add方法进行了调整,为了方便理解将变量i,j,调整为r,c(对应行列),同时根据上述变化做了其他一些调整,内容如下:
MyButton[,] maps = new MyButton[, ]; int Count;
public void Add()
{
for (int i = ; i < ; i++)
{
RowDefinition rowDef = new RowDefinition();
GridGame.RowDefinitions.Add(rowDef); ColumnDefinition colDef = new ColumnDefinition();
GridGame.ColumnDefinitions.Add(colDef);
}
Count = ; Amount = ;
List<int> ran = (new MyRandom(, , , Count)).Get();
for (int r = ; r < ; r++)
{
for (int c = ; c < ; c++)
{
MyButton btn; if (r == || r == || c == || c == )
{
btn = new MyButton(, r, c);
btn.Visibility = System.Windows.Visibility.Hidden;
}
else
btn = new MyButton((int)ran[(r - ) * + c - ], r, c); btn.Click += btn_Click; maps[r, c] = btn; Grid.SetColumn(btn, c);
Grid.SetRow(btn, r );
GridGame.Children.Add(btn);
}
}
}
好了,到目前为止,我们得到了一个可以玩的连连看了。这一篇虽然比起上一篇没有多大的进度,只是对结构进行了调整,代码进行了优化。这样结构也稍微清晰了许多,也便于理解。
倒计时我大概已经有了思路,也基本已经成型了,但连线还没想好怎么弄,有志同道合的朋友可以讨论下。
最后,如果感觉对您有所帮助,请帮忙推荐下……感谢!
使用WPF教你一步一步实现连连看(三)的更多相关文章
- 使用WPF教你一步一步实现连连看
使用WPF教你一步一步实现连连看(一) 第一步: 问题,怎样动态的建立一个10*10的grid(布局) for (int i = 0; i < 10; i++){ RowDefinition r ...
- 一步一步教你如何在linux下配置apache+tomcat(转)
一步一步教你如何在linux下配置apache+tomcat 一.安装前准备. 1. 所有组件都安装到/usr/local/e789目录下 2. 解压缩命令:tar —vxzf 文件名(. ...
- 一步一步教你将普通的wifi路由器变为智能广告路由器
一步一步教你将普通的wifi路由器变为智能广告路由器 相信大家对WiFi智能广告路由器已经不再陌生了,现在很多公共WiFi上网,都需要登录并且验证,这也就是WiFi广告路由器的最重要的功能.大致就是下 ...
- 一步一步教你使用Git
一步一步教你使用Git 互联网给我们带来方便的同时,也时常让我们感到困惑.随便搜搜就出一大堆结果,然而总是有大量的重复和错误.小妖发出的内容,都是自己实测过的,有问题请留言. 现在,你已经安装了Git ...
- 一步一步教你用 Vue.js + Vuex 制作专门收藏微信公众号的 app
一步一步教你用 Vue.js + Vuex 制作专门收藏微信公众号的 app 转载 作者:jrainlau 链接:https://segmentfault.com/a/1190000005844155 ...
- Ace教你一步一步做Android新闻客户端(一)
复制粘贴了那么多博文很不好意思没点自己原创的也说不出去,现在写一篇一步一步教你做安卓新闻客户端,借此机会也是让自己把相关的技术再复习一遍,大神莫笑,专门做给新手看. 手里存了两篇,一个包括软件视图 和 ...
- 一步一步教你实现iOS音频频谱动画(二)
如果你想先看看最终效果再决定看不看文章 -> bilibili 示例代码下载 第一篇:一步一步教你实现iOS音频频谱动画(一) 本文是系列文章中的第二篇,上篇讲述了音频播放和频谱数据计算,本篇讲 ...
- 一步一步教你实现iOS音频频谱动画(一)
如果你想先看看最终效果再决定看不看文章 -> bilibili 示例代码下载 第二篇:一步一步教你实现iOS音频频谱动画(二) 基于篇幅考虑,本次教程分为两篇文章,本篇文章主要讲述音频播放和频谱 ...
- 通过Dapr实现一个简单的基于.net的微服务电商系统(四)——一步一步教你如何撸Dapr之订阅发布
之前的章节我们介绍了如何通过dapr发起一个服务调用,相信看过前几章的小伙伴已经对dapr有一个基本的了解了,今天我们来聊一聊dapr的另外一个功能--订阅发布 目录:一.通过Dapr实现一个简单的基 ...
- 通过Dapr实现一个简单的基于.net的微服务电商系统(三)——一步一步教你如何撸Dapr
目录:一.通过Dapr实现一个简单的基于.net的微服务电商系统 二.通过Dapr实现一个简单的基于.net的微服务电商系统(二)--通讯框架讲解 三.通过Dapr实现一个简单的基于.net的微服务电 ...
随机推荐
- codefirst数据迁移技术,在保留数据库数据下实现对模型的修改并映射到数据库
一前言 这是我的处女作,写的不好的地方还望指出共同讨论.EF的数据访问方式有三种DbFirst,ModelFirst,还有本文要提到的CodeFirst 三者都是以ORM的方式建立.本人之前学习的.n ...
- Android开发教程 - 使用Data Binding(一) 介绍
本系列目录 使用Data Binding(一)介绍 使用Data Binding(二)集成与配置 使用Data Binding(三)在Activity中的使用 使用Data Binding(四)在Fr ...
- AJPFX:外汇的点差和点值
外汇“点差”就是交易商买卖货币之间产生的差值. 要了解点差我们先解释一下“点”的含义:为了精确和方便地表示汇价,一般用5位数字表示,其中最小变化的单位就称为"点".例如:英镑美元货 ...
- iOS-项目开发1
FFPageControl 由于UIPageControl不能设置图片,而在实际开发中又经常遇到需要使用图片的情况,故仿照系统UIPageControl,重写了FFPageControl,以支持图片的 ...
- spring cloud学习(四) 动态路由
Zuul的主要功能是路由和过滤器.路由功能是微服务的一部分,zuul实现了负载均衡. 1.1 新建模块zuul pom.xml <?xml version="1.0" enc ...
- java变量初始化顺序
第一次实例化一个类时,初始化优先顺序为: 1.父类中的静态成员变量和静态代码块初始化 2.本类中的静态成员变量和静态代码块初始化 3.父类中的实例成员初始化 4.父类中的构造方法 5.本类中的实例成员 ...
- Docker Compose模板文件介绍
模板文件是使用 Compose 的核心,涉及到的指令关键字也比较多,这里面大部分指令跟 docker run 相关参数的含义都是类似的.默认的模板文件名称为 docker-compose.yml ,格 ...
- 将python打包为.exe文件
第一步:在https://pypi.python.org/pypi/PyInstaller/2.1 下载pyinstaller. 第二步:解压缩,在该目录下命令行中执行python setup.py ...
- xamarin android 实现二维码带logo生成效果
MultiFormatWriter writer = new MultiFormatWriter(); Dictionary<EncodeHintType, object> hint = ...
- RVM的安装和使用过程中碰到的问题
Ruby Version Manager简称RVM,是一款非常好用的ruby版本管理以及安装工具. 关于rvm的安装,可以参考以下文章: use rvm install and manage ruby ...