您的位置:首页 > 编程语言 > C#

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# WPF XMAL 反重力落叶