WPF版的别踩白块
2015-11-07 04:13
429 查看
1.先看前台代码(代码下载)
<Window x:Class="WpfApplication35.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="635" Width="620" Loaded="Window_Loaded" Background="White" > <Window.Resources> <Style x:Key="lblFontStyle" TargetType="{x:Type Label}"> <Style.Triggers> <Trigger Property="IsMouseOver" Value="true" > <Setter Property="Background" Value="Gray"></Setter> <Setter Property="Cursor" Value="Hand"></Setter> </Trigger> </Style.Triggers> </Style> </Window.Resources> <Canvas> <Canvas Name="back" Width="600" Height="600"> </Canvas> <Border Panel.ZIndex="1" Name="bdRestart" CornerRadius="20" Width="200" Height="150" Background="Black" Opacity="0.5" Visibility="Hidden" Margin="200,175"> <Label Style="{StaticResource lblFontStyle}" FontSize="30" VerticalAlignment="Center" HorizontalAlignment="Center" Foreground="White" Name="lblRestart" PreviewMouseDown="lblRestart_PreviewMouseDown">重新开始</Label> </Border> <Border Name="bdStart" CornerRadius="15" Height="50" Width="100" Background="Black" Opacity="0.5" Margin="250,500"> <Label Style="{StaticResource lblFontStyle}" HorizontalAlignment="Center" Foreground="White" VerticalAlignment="Center" FontSize="20" Name="lblStart" PreviewMouseDown="lblStart_PreviewMouseDown">开始</Label> </Border> <Canvas Background="Black" Width="600" Height="494" Opacity="0.00001" Name="CanStart"></Canvas> </Canvas> </Window>
2.后台代码的实现
using System; using System.Collections.Generic; using System.Linq; using System.Text; 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; using System.Windows.Threading; namespace WpfApplication35 { /// <summary> /// MainWindow.xaml 的交互逻辑 /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } //保存border的一个链表 List<Border> lstBorder = new List<Border>(); //保存背景黑色行的所有border List<Border> lstBlackBorder = new List<Border>(); Random rd = new Random(); //保存每一行背景色为黑色的编号0,1,2,3 int num1, num2; //记录是否连续正确数点击了再次 int clickNum; //border移动速度 double speed=1; //时间 DispatcherTimer dtm = new DispatcherTimer(); private void Window_Loaded(object sender, RoutedEventArgs e) { dtm.Interval = TimeSpan.FromMilliseconds(1); dtm.Tick += new EventHandler(dtm_Tick); InitialGame(); } private void InitialGame() { //先产生5行,4列的border共20个,把两个先隐藏在上面 for (int i = 19; i >= 0; i--) { Border bd = new Border(); //添加到list,按照从下往上的顺序添加进去 lstBorder.Add(bd); //保存背景黑色行的所有border lstBlackBorder.Add(bd); bd.Width = back.Width / 4; bd.Height = back.Height / 4; bd.BorderBrush = Brushes.Gray; bd.BorderThickness = new Thickness(1); //设置位置 Canvas.SetTop(bd, (i / 4 - 2) * (back.Height / 4)); Canvas.SetLeft(bd, (i % 4) * (back.Width / 4)); //设置背景色 if (i % 4 == 3) {//每行开始重新设置随机数,保证每行两个黑色的背景border位置不确定 SetNum(); } if (num1 == i % 4 || num2 == i % 4) { bd.Background = Brushes.Black; } else { //注意,如果设置颜色,事件不挂接不了 bd.Background = Brushes.White; } //最下面一行添加单击事件 if (i > 15) { bd.PreviewMouseDown += new MouseButtonEventHandler(bd_PreviewMouseDown); } //添加进画布back back.Children.Add(bd); } //dtm.Start(); } void bd_PreviewMouseDown(object sender, MouseButtonEventArgs e) { Border bd = (Border)sender; if (bd.Background == Brushes.Black) { bd.Background = Brushes.Gray; clickNum++; //说明最下面的一行的黑色背景的border被点击 if (clickNum==2) { //重新记录 clickNum = 0; //从lstBlackBorder链表移除连续两个点击的那一行的border对象 //并且移除下面一行的事件 for (int i = 0; i < 4; i++) { lstBlackBorder[i].PreviewMouseDown -= new MouseButtonEventHandler(bd_PreviewMouseDown); } lstBlackBorder.RemoveRange(0,4); //给当前点击后的上一行添加事件,也就是lstBlackBorder前面0,1,2,3索引对象 for (int i = 0; i < 4; i++) { //先确定链表里面要有东西 if (lstBlackBorder.Count > 0) { lstBlackBorder[i].PreviewMouseDown += new MouseButtonEventHandler(bd_PreviewMouseDown); } } } } else if(bd.Background==Brushes.White) { clickNum = 0; FailGame(); } } private void FailGame() { //时间停止 dtm.Stop(); //点击错误除去最后一行对象 lstBlackBorder.RemoveRange(0, 4); bdRestart.Visibility = System.Windows.Visibility.Visible; } void dtm_Tick(object sender, EventArgs e) { #region 让border向下移动 for (int i = 0; i < 20; i++) { Canvas.SetTop(lstBorder[i], Canvas.GetTop(lstBorder[i]) + speed); //当最后一行bottom大于back.height 游戏失败, if (Canvas.GetTop(lstBlackBorder[0]) > back.Height - back.Height / 4) { FailGame(); } //因为是从下往上添加的,所以索引最小的在下面,如果下面的top超出name.height //name是前面canvas画布的名字标识 //判断背景黑色的是否出了区域,后面再释放 if (Canvas.GetTop(lstBorder[0]) > back.Height-back.Height/4) { //移出在lstBorder中最下面的一层 lstBorder.RemoveRange(0, 4); #region 给最上面的添加层 for (int j = 3; j >= 0; j--) { //增加速度 speed+=0.2; Border bd = new Border(); lstBorder.Add(bd); lstBlackBorder.Add(bd); bd.Width = back.Width / 4; bd.Height = back.Height / 4; bd.BorderBrush = Brushes.Gray; bd.BorderThickness = new Thickness(1); Canvas.SetTop(bd, -2*back.Height / 4); Canvas.SetLeft(bd, j * (back.Width / 4)); //设置新加行的背景色 if (j == 3) { SetNum(); } if (num1 == j || num2 == j) { bd.Background = Brushes.Black; } else { bd.Background = Brushes.White; } back.Children.Add(bd); } #endregion } } #endregion //消除在back里面的走出区域的border foreach (UIElement item in back.Children) { if (item.GetType().Name=="Border"&&Canvas.GetTop(item as Border)>back.Height) { back.Children.Remove(item); } } } void SetNum() { num1 = rd.Next(4); num2 = rd.Next(4); while (num1==num2) { num2 = rd.Next(4); } } /// <summary> /// 游戏重新开始 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void lblRestart_PreviewMouseDown(object sender, MouseButtonEventArgs e) { //设置速度 speed = 1; //清除游戏前的记录 lstBlackBorder.Clear(); lstBorder.Clear(); back.Children.Clear(); //开始屏障 CanStart.Visibility = System.Windows.Visibility.Visible; //游戏初始化 InitialGame(); //隐藏重新开始border bdRestart.Visibility = System.Windows.Visibility.Hidden; //显示开始border bdStart.Visibility = System.Windows.Visibility.Visible; } /// <summary> /// 游戏开始 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void lblStart_PreviewMouseDown(object sender, MouseButtonEventArgs e) { dtm.Start(); bdStart.Visibility = System.Windows.Visibility.Hidden; //我在前台设置了Canvas屏障,防止事件被触发 CanStart.Visibility = System.Windows.Visibility.Hidden; } } }
相关文章推荐
- c#调用COM组件
- C#实现把指定数据写入串口
- C#动态创建button的方法
- C#中抽象方法与虚拟方法的区别
- c#中虚函数的相关使用方法
- C#使用加边法计算行列式的值
- C#实现多线程的同步方法实例分析
- C#中尾递归的使用、优化及编译器优化
- C#实现子窗体与父窗体通信方法实例总结
- C#通用邮件发送类分享
- C#中this的用法集锦
- C#.NET获取拨号连接的宽带连接方法
- C#异步绑定数据实现方法
- C#实现AddRange为数组添加多个元素的方法
- C#中Equality和Identity浅析
- C#生成饼形图及添加文字说明实例代码
- C#判等对象是否相等的方法汇总
- C#简单的向量用法实例教程
- C#实现基于链表的内存记事本实例
- C#托管堆对象实例包含内容分析