本节主要讲解俄罗斯方块,代码如下
编辑器界面
<Window x:Class="CubeCube.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" WindowStyle="None"
Title="MainWindow" Height="800" Width="600" AllowsTransparency="False" Loaded="Window_Loaded" Background="Aquamarine" Top="200">
<Canvas Name="back" Margin="0,0,200,0" Background="Honeydew">
<Button Content="开始游戏" Canvas.Left="452" Canvas.Top="90" Width="103" Height="25" Background="Beige" Click="Start"></Button>
<Button Content="暂停游戏" Canvas.Left="452" Canvas.Top="146" Width="103" Height="25" Background="Azure" Click="Stop"></Button>
<Button Content="结束游戏" Canvas.Left="452" Canvas.Top="211" Width="103" Height="25" Background="Firebrick" Click="Over"></Button>
<Button Content="下一关" Canvas.Left="452" Canvas.Top="278" Width="103" Height="25" Background="DarkSlateGray" Click="Button_Click" RenderTransformOrigin="0.456,2.08"></Button>
<Canvas Name="show" Width="122" Height="122" Background="LawnGreen" Canvas.Left="433" Canvas.Top="499"></Canvas>
<Label Name="goal" Content="0" Canvas.Left="503" Canvas.Top="373"/>
<Label Content="得分:" Canvas.Left="452" Canvas.Top="373" RenderTransformOrigin="0.15,0.12"/>
</Canvas>
</Window>
主题代码
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;
using System.Windows.Threading;
using System.Media;
namespace CubeCube
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
//几个全局变量
Image pic = new Image();
int score = 0;
Random Type = new Random();
DispatcherTimer t1 = new DispatcherTimer();
DispatcherTimer t2 = new DispatcherTimer();
List<MyCube> list = new List<MyCube>();
List<Mycube1> slist = new List<Mycube1>();
int speed = 20;
//加载事件
private void Window_Loaded(object sender, RoutedEventArgs e)
{
SoundPlayer player = new SoundPlayer(System.Environment.CurrentDirectory + @"\Resources\Audio\music.wav");
player.PlayLooping();
pic.Width = 400;
pic.Height = 800;
pic.Source = new BitmapImage(new Uri("Image/1738430_0.jpg",UriKind.Relative));
pic.Stretch = Stretch.Fill;
back.Children.Add(pic);
KeyDown += MainWindow_KeyDown;
}
//按键事件
void MainWindow_KeyDown(object sender, KeyEventArgs e)
{
if (!IsPrease)
{
return;
}
foreach (MyCube cube in list)
{
if (e.Key == Key.W)
{
double kx = Canvas.GetLeft(cube);
Canvas.SetLeft(cube, Canvas.GetTop(cube) - y0 + x0);
Canvas.SetTop(cube, x0 - kx + y0);
}
}
if (e.Key == Key.A)
{
foreach (MyCube cube1 in list)
{
if (Canvas.GetLeft(cube1)<=10)
{
return;
}
}
foreach (MyCube cube in list)
{
Canvas.SetLeft(cube, Canvas.GetLeft(cube) - speed);
}
}
if (e.Key == Key.S)
{
foreach (MyCube cube1 in list)
{
if (Canvas.GetTop(cube1) >= 750)
{
return;
}
}
foreach (MyCube cube in list)
{
Canvas.SetTop(cube, Canvas.GetTop(cube) + speed);
}
}
if (e.Key == Key.D)
{
foreach (MyCube cube1 in list)
{
if (Canvas.GetLeft(cube1) >= 370)
{
return;
}
}
foreach (MyCube cube in list)
{
Canvas.SetLeft(cube, Canvas.GetLeft(cube) + speed);
}
}
if (e.Key == Key.A)
{
x0 -= speed;
}
if (e.Key == Key.S)
{
y0 += speed;
}
if (e.Key == Key.D)
{
x0 += speed;
}
if (e.Key == Key.W)
{
foreach (MyCube cube in list)
{
if (((MyCube)cube).Tag != "alone")
{
if (Canvas.GetTop(cube) / 20 != 0&&k!=3)
{
foreach (MyCube cube1 in list)
{
Canvas.SetTop(cube1, Canvas.GetTop(cube1) + 10);
Canvas.SetLeft(cube1, Canvas.GetLeft(cube1) + 10);
}
y0 += 10;
x0 += 10;
return;
}
}
}
}
IsPrease = false;
}
bool IsStart = false;
bool IsMade = false;
//游戏开始
private void Start(object sender, RoutedEventArgs e)
{
back.Children.Remove(pic);
if (IsStart)
{
return;
}
if (!IsMade)
{
nextk = Type.Next(1,9);
MakeCube();
}
t2.Tick += t2_Tick;
t2.Interval = TimeSpan.FromSeconds(0.5);
t2.Start();
IsStart = true;
t1.Tick += t1_Tick;
t1.Interval = TimeSpan.FromMilliseconds(1);
t1.Start();
}
//显示下一个
void t1_Tick(object sender, EventArgs e)
{
if (nextk==0)
{
return;
}
switch (nextk)
{
case 1:
Mycube1 cube1 = new Mycube1(4);
back.Children.Add(cube1); slist.Add(cube1);
break;
case 2:
Mycube1 cube2 = new Mycube1(3);
Mycube1 cube3 = new Mycube1(4);
Mycube1 cube4 = new Mycube1(5);
Mycube1 cube5 = new Mycube1(6);
back.Children.Add(cube2); slist.Add(cube2);
back.Children.Add(cube3); slist.Add(cube3);
back.Children.Add(cube4); slist.Add(cube4);
back.Children.Add(cube5); slist.Add(cube5);
break;
case 3:
Mycube1 cube7 = new Mycube1(2);
Mycube1 cube8 = new Mycube1(3);
Mycube1 cube9 = new Mycube1(4);
back.Children.Add(cube7); slist.Add(cube7);
back.Children.Add(cube8); slist.Add(cube8);
back.Children.Add(cube9); slist.Add(cube9);
break;
case 4:
Mycube1 cube10 = new Mycube1(3);
Mycube1 cube11 = new Mycube1(4);
Mycube1 cube12 = new Mycube1(7);
Mycube1 cube13 = new Mycube1(6);
back.Children.Add(cube10); slist.Add(cube10);
back.Children.Add(cube11); slist.Add(cube11);
back.Children.Add(cube12); slist.Add(cube12);
back.Children.Add(cube13); slist.Add(cube13);
break;
case 5:
Mycube1 cube14 = new Mycube1(3);
Mycube1 cube15 = new Mycube1(4);
Mycube1 cube16 = new Mycube1(5);
Mycube1 cube17 = new Mycube1(7);
back.Children.Add(cube14); slist.Add(cube14);
back.Children.Add(cube15); slist.Add(cube15);
back.Children.Add(cube16); slist.Add(cube16);
back.Children.Add(cube17); slist.Add(cube17);
break;
case 6:
Mycube1 cube18 = new Mycube1(3);
Mycube1 cube19 = new Mycube1(4);
Mycube1 cube20 = new Mycube1(2);
Mycube1 cube21 = new Mycube1(6);
back.Children.Add(cube18); slist.Add(cube18);
back.Children.Add(cube19); slist.Add(cube19);
back.Children.Add(cube20); slist.Add(cube20);
back.Children.Add(cube21); slist.Add(cube21);
break;
case 7:
Mycube1 cube22 = new Mycube1(3);
Mycube1 cube23 = new Mycube1(4);
Mycube1 cube24 = new Mycube1(2);
Mycube1 cube25 = new Mycube1(5);
back.Children.Add(cube22); slist.Add(cube22);
back.Children.Add(cube23); slist.Add(cube23);
back.Children.Add(cube24); slist.Add(cube24);
back.Children.Add(cube25); slist.Add(cube25);
break;
case 8:
Mycube1 cube26 = new Mycube1(3);
Mycube1 cube27 = new Mycube1(4);
Mycube1 cube28 = new Mycube1(6);
Mycube1 cube29 = new Mycube1(9);
back.Children.Add(cube26); slist.Add(cube26);
back.Children.Add(cube27); slist.Add(cube27);
back.Children.Add(cube28); slist.Add(cube28);
back.Children.Add(cube29); slist.Add(cube29);
break;
default:
break;
}
}
//方块移动
bool IsPrease = false;
void t2_Tick(object sender, EventArgs e)
{
IsPrease = true;
foreach (UIElement cube in list)
{
if (Canvas.GetTop(cube) >= 770)
{
for (int i = list.Count - 1; i >= 0; i--)
{
list[i].Tag = "Over";
list.Remove(list[i]);
}
MakeCube();
for (int i = slist.Count - 1; i >= 0; i--)
{
back.Children.Remove(slist[i]);
}
return;
}
foreach (UIElement cube0 in back.Children)
{
if (cube0.GetType().Name == "MyCube" && ((MyCube)cube0).Tag == "Over")
{
if (Canvas.GetTop(cube) + 20 == Canvas.GetTop(cube0) && Canvas.GetLeft(cube) == Canvas.GetLeft(cube0))
{
for (int i = list.Count - 1; i >= 0; i--)
{
list[i].Tag = "Over";
list.Remove(list[i]);
}
MakeCube();
for (int i = slist.Count-1; i >=0; i--)
{
back.Children.Remove(slist[i]);
}
return;
}
}
}
}
foreach (MyCube cube in list)
{
Canvas.SetTop(cube, Canvas.GetTop(cube) + speed);
}
y0 += speed;
for (int i = 0; i < 20; i++)
{
int s = 0;
List<MyCube> count = new List<MyCube>();
foreach (UIElement cube in back.Children)
{
if (cube.GetType().Name=="MyCube"&&((MyCube)cube).Tag=="Over"&&(int)Canvas.GetTop(cube)/20-20==i)
{
s++;
count.Add((MyCube)cube);
}
}
if (s>=18)
{
for (int j = 0; j < count.Count; j++)
{
back.Children.Remove(count[j]);
}
foreach (UIElement cube1 in back.Children)
{
if (cube1.GetType().Name=="MyCube"&&Canvas.GetTop(cube1)/20-20<=i&&((MyCube)cube1).Tag=="Over")
{
Canvas.SetTop(cube1,Canvas.GetTop(cube1)+20);
}
}
score++;
goal.Content = score.ToString();
}
}
}
//造方块
int x0, y0, k, nextk;
void MakeCube()
{
k = nextk;
nextk = Type.Next(1,9);
switch (k)
{
case 1:
MyCube cube1 = new MyCube(4);
cube1.Tag = "alone";
back.Children.Add(cube1); list.Add(cube1);
x0 = 190; y0 = -10;
break;
case 2:
MyCube cube2 = new MyCube(3);
MyCube cube3 = new MyCube(4);
MyCube cube4 = new MyCube(5);
MyCube cube5 = new MyCube(6);
back.Children.Add(cube2); list.Add(cube2);
back.Children.Add(cube3); list.Add(cube3);
back.Children.Add(cube4); list.Add(cube4);
back.Children.Add(cube5); list.Add(cube5);
x0 = 190; y0 = -20;
break;
case 3:
MyCube cube7 = new MyCube(2);
MyCube cube8 = new MyCube(3);
MyCube cube9 = new MyCube(4);
back.Children.Add(cube7); list.Add(cube7);
back.Children.Add(cube8); list.Add(cube8);
back.Children.Add(cube9); list.Add(cube9);
x0 = 190; y0 = -30;
break;
case 4:
MyCube cube10 = new MyCube(3);
MyCube cube11 = new MyCube(4);
MyCube cube12 = new MyCube(7);
MyCube cube13 = new MyCube(6);
back.Children.Add(cube10); list.Add(cube10);
back.Children.Add(cube11); list.Add(cube11);
back.Children.Add(cube12); list.Add(cube12);
back.Children.Add(cube13); list.Add(cube13);
x0 = 200; y0 = -20;
break;
case 5:
MyCube cube14 = new MyCube(3);
MyCube cube15 = new MyCube(4);
MyCube cube16 = new MyCube(5);
MyCube cube17 = new MyCube(7);
back.Children.Add(cube14); list.Add(cube14);
back.Children.Add(cube15); list.Add(cube15);
back.Children.Add(cube16); list.Add(cube16);
back.Children.Add(cube17); list.Add(cube17);
x0 = 190; y0 = -20;
break;
case 6:
MyCube cube18 = new MyCube(3);
MyCube cube19 = new MyCube(4);
MyCube cube20 = new MyCube(2);
MyCube cube21 = new MyCube(6);
back.Children.Add(cube18); list.Add(cube18);
back.Children.Add(cube19); list.Add(cube19);
back.Children.Add(cube20); list.Add(cube20);
back.Children.Add(cube21); list.Add(cube21);
x0 = 200; y0 = -30;
break;
case 7:
MyCube cube22 = new MyCube(3);
MyCube cube23 = new MyCube(4);
MyCube cube24 = new MyCube(2);
MyCube cube25 = new MyCube(5);
back.Children.Add(cube22); list.Add(cube22);
back.Children.Add(cube23); list.Add(cube23);
back.Children.Add(cube24); list.Add(cube24);
back.Children.Add(cube25); list.Add(cube25);
x0 = 180; y0 = -30;
break;
case 8:
MyCube cube26 = new MyCube(3);
MyCube cube27 = new MyCube(4);
MyCube cube28 = new MyCube(6);
MyCube cube29 = new MyCube(9);
back.Children.Add(cube26); list.Add(cube26);
back.Children.Add(cube27); list.Add(cube27);
back.Children.Add(cube28); list.Add(cube28);
back.Children.Add(cube29); list.Add(cube29);
x0 = 190; y0 = -20;
break;
default:
break;
}
}
//游戏结束
private void Over(object sender, RoutedEventArgs e)
{
this.Close();
}
//游戏暂停
private void Stop(object sender, RoutedEventArgs e)
{
t2.Stop();
IsStart = false;
IsMade = true;
}
//下一关
private void Button_Click(object sender, RoutedEventArgs e)
{
Window1 gg = new Window1();
gg.Show();
this.Close();
}
}
}
引入类MyCube来定义不同位置的方块
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows;
namespace CubeCube
{
//通过不同位置的方块的组合实现了不同图形,同事需要导入命名空间
class MyCube:System.Windows.Controls.Border
{
int CubeSize = 20;
public string Tag;
Random r = new Random();
public MyCube(int index)
{
this.Width = this.Height = CubeSize;
this.Background = new RadialGradientBrush(Color.FromRgb((byte)r.Next(0, 256), (byte)r.Next(0, 256), (byte)r.Next(0, 256)), Color.FromRgb((byte)r.Next(0, 256), (byte)r.Next(0, 256), (byte)r.Next(0, 256)));
this.BorderThickness = new Thickness(0.5);
switch(index){
case 1:
this.Tag = "1";
Canvas.SetLeft(this, 190);
Canvas.SetTop(this, -70);
break;
case 2:
this.Tag = "2";
Canvas.SetLeft(this, 190);
Canvas.SetTop(this, -50);
break;
case 3:
this.Tag = "3";
Canvas.SetLeft(this, 190);
Canvas.SetTop(this, -30);
break;
case 4:
this.Tag = "4";
Canvas.SetLeft(this, 190);
Canvas.SetTop(this, -10);
break;
case 5:
this.Tag = "5";
Canvas.SetLeft(this, 170);
Canvas.SetTop(this, -10);
break;
case 6:
this.Tag = "6";
Canvas.SetLeft(this, 210);
Canvas.SetTop(this, -10);
break;
case 7:
this.Tag = "7";
Canvas.SetLeft(this, 210);
Canvas.SetTop(this, -30);
break;
case 8:
this.Tag = "8";
Canvas.SetLeft(this, 210);
Canvas.SetTop(this, -50);
break;
case 9:
this.Tag = "8";
Canvas.SetLeft(this, 170);
Canvas.SetTop(this, -30);
break;
default:
break;
}
}
}
}
引入类MyCube1来显示下一个要出现的图形
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows;
namespace CubeCube
{
//主要用来显示下一个出出现的图形
class Mycube1:System.Windows.Controls.Border
{
int CubeSize = 20;
Random r = new Random();
public Mycube1(int index)
{
this.Width = this.Height = CubeSize;
this.Background = Brushes.Black;
this.BorderThickness = new Thickness(1);
switch(index){
case 1:
Canvas.SetLeft(this, 480);
Canvas.SetTop(this, 520);
break;
case 2:
Canvas.SetLeft(this, 480);
Canvas.SetTop(this, 540);
break;
case 3:
Canvas.SetLeft(this, 480);
Canvas.SetTop(this, 560);
break;
case 4:
Canvas.SetLeft(this, 480);
Canvas.SetTop(this, 580);
break;
case 5:
Canvas.SetLeft(this, 460);
Canvas.SetTop(this, 580);
break;
case 6:
Canvas.SetLeft(this, 500);
Canvas.SetTop(this, 580);
break;
case 7:
Canvas.SetLeft(this, 500);
Canvas.SetTop(this, 560);
break;
case 8:
Canvas.SetLeft(this, 500);
Canvas.SetTop(this, 540);
break;
case 9:
Canvas.SetLeft(this, 460);
Canvas.SetTop(this, 560);
break;
default:
break;
}
}
}
}
因篇幅问题不能全部显示,请点此查看更多更全内容