使用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 条评论
登录 后参与评论

相关文章

来自专栏一个会写诗的程序员的博客

Spring Reactor 项目核心库Reactor Core

Non-Blocking Reactive Streams Foundation for the JVM both implementing a Reactiv...

2182
来自专栏飞扬的花生

jsencrypt参数前端加密c#解密

      写程序时一般是通过form表单或者ajax方式将参数提交到服务器进行验证,如何防止提交的请求不被抓包后串改,虽然无法说绝对安全却给非法提交提高了难度...

3869
来自专栏张善友的专栏

Mix 10 上的asp.net mvc 2的相关Session

Beyond File | New Company: From Cheesy Sample to Social Platform Scott Hansel...

2577
来自专栏张善友的专栏

LINQ via C# 系列文章

LINQ via C# Recently I am giving a series of talk on LINQ. the name “LINQ via C...

2645
来自专栏一个爱瞎折腾的程序猿

sqlserver使用存储过程跟踪SQL

USE [master] GO /****** Object: StoredProcedure [dbo].[sp_perfworkload_trace_s...

2070
来自专栏C#

DotNet加密方式解析--非对称加密

    新年新气象,也希望新年可以挣大钱。不管今年年底会不会跟去年一样,满怀抱负却又壮志未酬。(不过没事,我已为各位卜上一卦,卦象显示各位都能挣钱...)...

4888
来自专栏闻道于事

js登录滑动验证,不滑动无法登陆

js的判断这里是根据滑块的位置进行判断,应该是用一个flag判断 <%@ page language="java" contentType="text/html...

6848
来自专栏pangguoming

Spring Boot集成JasperReports生成PDF文档

由于工作需要,要实现后端根据模板动态填充数据生成PDF文档,通过技术选型,使用Ireport5.6来设计模板,结合JasperReports5.6工具库来调用渲...

1.2K7
来自专栏我和未来有约会

Silverlight第三方控件专题

这里我收集整理了目前网上silverlight第三方控件的专题,若果有所遗漏请告知我一下。 名称 简介 截图 telerik 商 RadC...

4025
来自专栏跟着阿笨一起玩NET

c#实现打印功能

2782

扫码关注云+社区