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

第一步:

  问题,怎样动态的建立一个10*10的grid(布局)

第二步:

  问题,怎样将button放到上边那个布局中(这个是我查资料才知道的,一般都是用Grid在前台布局)

for (int i = 0; i < 10; i++)
{
  for (int j = 0; j < 10; j++)
  {
  Button btn = new Button();

  btn.Content = i + "," + j;
  Grid.SetColumn(btn, j);
  Grid.SetRow(btn, i);

  GridGame.Children.Add(btn);
}
}

效果如图1

第三步:

  问题3,怎样将Button的内容换成随机图片呢?

Random random = new Random();


for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 10; j++)
{
int imgName = random.Next(1, 10);//生成一个>=1,<10的随机数

Image img = new Image();
img.Source = new BitmapImage(new Uri("images/" + imgName + ".png", UriKind.Relative));


Button btn = new Button();
btn.Content = img;

Grid.SetColumn(btn, j);
Grid.SetRow(btn, i);

GridGame.Children.Add(btn);
}
}

效果如图

  这里需要注意一点,不要把Random random = new Random();这句放到循环里面,不然会变成这样 图

第四步:

  上面我们已经完成了LLK的布局,下面咱们实现Button的点击事件,并实现点击

两个相同背景的button进行消除。问题又来,我们怎么判断两个button是相同背景呢。

我们来重写Button,给它增加几个属性:

 public class MyButton : Button
    {
        //button标示,用于判断两个按钮是否为同一个
        public int Flag { get; set; }

        //Button所在行
        public int RowNum { get; set; }

        //所在列
        public int ColNum { get; set; }

        public MyButton(int flag,int rowNum,int colNum)
        {
            this.Flag = flag;
            this.RowNum = romNum;
            this.ColNum = colNum;
        }
    }

好了,有了判断依据,我们就可以写点击事件了

 MyButton btn1;
        MyButton btn2;
        int ClickCount = 0;
        void btn_Click(object sender, RoutedEventArgs e)
        {
            ++ClickCount;
            if (ClickCount == 1)
            {
                btn1 = sender as MyButton;
            }
            else if(ClickCount==2)
            {
                btn2 = sender as MyButton;

                if (btn1 != null && btn2 != null)
                {
                    if (btn1.Flag == btn2.Flag&&!(btn1.ColNum==btn2.ColNum&&btn1.RowNum==btn2.RowNum))
                    {
                        btn1.Visibility = Visibility.Hidden;
                        btn2.Visibility = Visibility.Hidden;
                    }

                }
                btn1 =null;
                btn2 = null;
                ClickCount = 0;
            }
        }

好了,我们现在完成了最基本点击消除功能

运行效果如下:

完整代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace llk
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            Add();
        }
        public void Add()
        {
            Random random = new Random();

            for (int i = 0; i < 10; i++)
            {
                RowDefinition rowDef = new RowDefinition();
                GridGame.RowDefinitions.Add(rowDef);

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

            for (int i = 0; i < 10; i++)
            {
                for (int j = 0; j < 10; j++)
                {
                    int imgName = random.Next(1, 10);//生成一个>=1,<21的随机数

                    Image img = new Image();
                    img.Source = new BitmapImage(new Uri("images/" + imgName + ".png", UriKind.Relative));


                    MyButton btn = new MyButton(imgName,i,j);
                    btn.Content = img;
                    btn.Click += btn_Click;
                    Grid.SetColumn(btn, j);
                    Grid.SetRow(btn, i);

                    GridGame.Children.Add(btn);
                }
            }
        }

        MyButton btn1;
        MyButton btn2;
        int ClickCount = 0;
        void btn_Click(object sender, RoutedEventArgs e)
        {
            ++ClickCount;
            if (ClickCount == 1)
            {
                btn1 = sender as MyButton;
            }
            else if(ClickCount==2)
            {
                btn2 = sender as MyButton;

                if (btn1 != null && btn2 != null)
                {
                    if (btn1.Flag == btn2.Flag&&!(btn1.ColNum==btn2.ColNum&&btn1.RowNum==btn2.RowNum))
                    {
                        btn1.Visibility = Visibility.Hidden;
                        btn2.Visibility = Visibility.Hidden;
                    }

                }
                btn1 =null;
                btn2 = null;
                ClickCount = 0;
            }
        }

      
    }
    public class MyButton : Button
    {
        //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.RomNum = romNum;
            this.ColNum = colNum;
        }
    }
}

 是不是很简单啊,下一步我们加入规则算法……

  ----- 未完待续……------

 另外谁能告诉我怎么上传源代码吗,直接发出来太占篇幅了……

哈,知道怎么上传了,现把图片发一下,资源图片,便于你们试验用……

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏深度学习自然语言处理

matplotlib--python的数据可视化入门

在平时做实验的时候,往往为了让数据更直接的表达一个趋势或为了描绘一种关系,经常会用到画图,再加上我们经常用的语言是pyhon居多,所以,作为python中的画图...

31710
来自专栏用户2442861的专栏

【Qt编程】基于QWT的曲线绘制及图例显示操作

http://blog.csdn.net/tengweitw/article/details/41911035

5921
来自专栏程序员的碎碎念

GD实战开发验证码

GD GD库是php处理图形的扩展库,GD库提供了一系列用来处理图片的API,在网站上GD库通常用来生成缩略图,或者用来对图片加水印,或者用来生成汉字验证码,或...

3806
来自专栏DannyHoo的专栏

iOS 开发中Masonry和SnapKit在使用上的一些区别

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010105969/article/details/...

1952
来自专栏iOS开发攻城狮的集散地

水波进度、加载动画、文字进度

2453
来自专栏Golang语言社区

GO语言利用K近邻算法实现小说鉴黄

Usuage: go run kNN.go --file="data.txt" 关键是向量点的选择和阈值的判定 样本数据来自国家新闻出版总署发布通知公布的《...

2915
来自专栏邵靖的专栏

使用 plotly 绘制数据图表

不少小伙伴在开发过程中都有对模块进行压测的经历,压测结束后大家往往喜欢使用Excel处理压测数据并绘制数据可视化视图,但这样不能很方便的使用web页面进行数据展...

1.1K6
来自专栏GIS讲堂

Arcgis for Js实现Spline插值、区域裁剪以及页面的轮播效果

本文讲述如何利用Arcgis 的Gp服务实现Spline插值,并将插值的结果按照指定的区域进行裁剪,最后将裁剪的结果根据特定的样式渲染,并在页面实现多期轮播的这...

2482
来自专栏DannyHoo的专栏

iOS中将字体设置成斜体且加粗

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010105969/article/details/...

2021
来自专栏Python数据科学

Python十分钟制作属于你自己的个性logo

词云的使用相信大家已经不陌生了,使用很简单,直接调用wordcloud包就可以了。它的主要功能是根据文本词汇和词汇频率生成图片,从中可以直观的看出各个词汇所占比...

822

扫码关注云+社区