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
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
List<Border> lstBorder = new List<Border>();
List<Border> lstBlackBorder = new List<Border>();
Random rd = new Random();
int num1, num2;
int clickNum;
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()
{
for (int i = 19; i >= 0; i--)
{
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, (i / 4 - 2) * (back.Height / 4));
Canvas.SetLeft(bd, (i % 4) * (back.Width / 4));
if (i % 4 == 3)
{
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.Children.Add(bd);
}
}
void bd_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
Border bd = (Border)sender;
if (bd.Background == Brushes.Black)
{
bd.Background = Brushes.Gray;
clickNum++;
if (clickNum==2)
{
clickNum = 0;
for (int i = 0; i < 4; i++)
{
lstBlackBorder[i].PreviewMouseDown -= new MouseButtonEventHandler(bd_PreviewMouseDown);
}
lstBlackBorder.RemoveRange(0,4);
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);
if (Canvas.GetTop(lstBlackBorder[0]) > back.Height - back.Height / 4)
{
FailGame();
}
if (Canvas.GetTop(lstBorder[0]) > back.Height-back.Height/4)
{
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
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);
}
}
private void lblRestart_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
speed = 1;
lstBlackBorder.Clear();
lstBorder.Clear();
back.Children.Clear();
CanStart.Visibility = System.Windows.Visibility.Visible;
InitialGame();
bdRestart.Visibility = System.Windows.Visibility.Hidden;
bdStart.Visibility = System.Windows.Visibility.Visible;
}
private void lblStart_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
dtm.Start();
bdStart.Visibility = System.Windows.Visibility.Hidden;
CanStart.Visibility = System.Windows.Visibility.Hidden;
}
}
}