使用WPF教你一步一步实现连连看(三)

简介: 这次首先对以前的结构进行了调整: 第一步:把MyButton按钮的属性独立成一个类,放在一个单独的MyButton.cs中,把图片的初始化也放到里面。 调整代码如下:   public class MyButton : Button     {         //图...

这次首先对以前的结构进行了调整:

第一步:把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 != 0) 
               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 = 0; n < Count / Amount; n++) 
               ran.Add(rand.Next(Min, Max)); 
           for (int i = 1; i < Amount; i++) 
           { 
               List<int> temp = new List<int>(); 
               temp.AddRange(ran); 
               for (int n = 0; n < Count / Amount; n++) 
               { 
                   int r = rand.Next(0, temp.Count); 
                   ran.Insert(rand.Next(0, ran.Count), temp[r]); 
                   temp.RemoveAt(r); 
               } 
           } 
           return ran; 
       } 
   } 

 

第三步:对Add方法进行了调整,为了方便理解将变量i,j,调整为r,c(对应行列),同时根据上述变化做了其他一些调整,内容如下:

MyButton[,] maps = new MyButton[10, 10]; 
      
       int Count; 
       public void Add() 
       { 
           for (int i = 0; i < 10; i++) 
           { 
               RowDefinition rowDef = new RowDefinition(); 
               GridGame.RowDefinitions.Add(rowDef);

               ColumnDefinition colDef = new ColumnDefinition(); 
               GridGame.ColumnDefinitions.Add(colDef); 
           } 
           Count = 8;

           Amount = 32; 
           List<int> ran = (new MyRandom(64, 2, 1, Count)).Get(); 
           for (int r = 0; r < 10; r++) 
           { 
               for (int c = 0; c < 10; c++) 
               { 
                   MyButton btn;

                   if (r == 0 || r == 9 || c == 0 || c == 9) 
                   { 
                       btn = new MyButton(0, r, c); 
                       btn.Visibility = System.Windows.Visibility.Hidden; 
                   } 
                   else 
                       btn = new MyButton((int)ran[(r - 1) * 8 + c - 1], r, c);

                   btn.Click += btn_Click;

                   maps[r, c] = btn;

                   Grid.SetColumn(btn, c); 
                   Grid.SetRow(btn, r ); 
                   GridGame.Children.Add(btn); 
               } 
           } 
       } 

 


         好了,到目前为止,我们得到了一个可以玩的连连看了。这一篇虽然比起上一篇没有多大的进度,只是对结构进行了调整,代码进行了优化。这样结构也稍微清晰了许多,也便于理解。

倒计时我大概已经有了思路,也基本已经成型了,但连线还没想好怎么弄,有志同道合的朋友可以讨论下。

最后,如果感觉对您有所帮助,请帮忙推荐下……感谢!

源代码下载

目录
相关文章
|
C#
WPF 界面实现多语言支持 中英文切换 动态加载资源字典
原文:WPF 界面实现多语言支持 中英文切换 动态加载资源字典 1、使用资源字典,首先新建两个字典文件en-us.xaml、zh-cn.xaml。定义中英文的字符串在这里面【注意:添加xmlns:s="clr-namespace:System;assembly=mscorlib】 zh-cn.
3190 0
|
IDE C# 开发工具
WPF钟表效果实现
中WPF中的RotateTransform实现UI元素的旋转,并模拟钟表的秒针、分针和时针。
1197 0
WPF钟表效果实现
|
IDE 编译器 C#
WPF实现强大的动态公式计算
数据库可以定义表不同列之间的计算公式,进行自动公式计算,但如何实现行上的动态公式计算呢?行由于可以动态扩展,在某些应用场景下将能很好的解决实际问题。本文就探讨一下如何在WPF中实现一种基于行字段的动态公式计算。
1067 0
WPF实现强大的动态公式计算
|
网络协议 C# 移动开发
C# WPF上位机实现和下位机TCP通讯
C# WPF上位机实现和下位机TCP通讯下位机使用北京大华程控电源DH1766-1,上位机使用WPF。实现了电压电流实时采集,曲线显示。上午在公司调试成功,手头没有程控电源,使用TCP服务端模拟。昨天写的TCP服务端正好排上用场。
2403 0
|
C#
WPF中获取TreeView以及ListView获取其本身滚动条的方法,可实现自行调节scoll滚动的位置(可相应获取任何控件中的内部滚动条)
原文:WPF中获取TreeView以及ListView获取其本身滚动条的方法,可实现自行调节scoll滚动的位置(可相应获取任何控件中的内部滚动条) 对于TreeView而言: TreeViewAutomationPeer lvap = new TreeViewAuto...
2399 0
|
XML 自然语言处理 C#
WPF 多语言实现
原文:WPF 多语言实现 很多国际化的程序都提供了多语言的选项,这样方便不同国家的使用者更方便的使用软件。这篇博客中将介绍在WPF中实现多语言的方式。 方式一,使用WPF动态资源的方式实现。先简单介绍下StaticResource和DynamicResource,这两者的区别在于动态资源改变后会实时的体现出来,而静态资源只加载一次,后面对资源的任何改变都不会体现出来。
1578 0
|
C#
WPF实现三星手机充电界面
原文:WPF实现三星手机充电界面 GitHub地址:https://github.com/ptddqr/wpf-samsung-phone-s5-charging-ui/tree/master 先上效果图 这个效果来自于三星S5的充电界面,版权归三星所有,这里仅仅是技术实现.
1709 0
|
C# vr&ar
WPF实现物理效果 拉一个小球
原文:WPF实现物理效果 拉一个小球 一直以来都对物理效果有神秘感,完全不知道怎么实现的.直到看到了周银辉在老早前写的一篇博客:http://www.cnblogs.com/zhouyinhui/archive/2007/06/23/793724.
972 0
|
C#
WPF实现Twitter按钮效果
原文:WPF实现Twitter按钮效果 最近上网看到这个CSS3实现的Twitter按钮,感觉很漂亮,于是想用WPF来实现下. 实现这个效果,参考了CSS3 原文地址:http://www.html5tricks.
1244 0
|
C# UED 自然语言处理
在WPF中实现图片一边下载一边显示
原文 在WPF中实现图片一边下载一边显示 当我们上网查看一个较大的图片时,浏览器能一边下载一边显示,这样用户体验是比较好的,但在WPF程序中,当我们通过如下方式显示一幅图片时:     img.Source = new BitmapImage(new Uri("http://localhost:8000/www/test.jpg")); 只能等到图片下载完成时才能显示出来,当图片较大时需要等待很久,即使在旁边放个进度条给人的感觉仍然不好。
1069 0