C#中的俄罗斯方块
来源:互联网 发布:厂价直销淘宝怎么设置 编辑:程序博客网 时间:2024/06/04 19:33
本节主要讲解俄罗斯方块,代码如下
编辑器界面
<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; } } }}
本节难点在于图形的旋转的,同时学习了如何导入声音
1 0
- C#中的俄罗斯方块
- C#俄罗斯方块
- c#俄罗斯方块源代码
- 又一个c#俄罗斯方块
- C#版俄罗斯方块
- C#制作俄罗斯方块
- 俄罗斯方块c#版
- c#俄罗斯方块程序
- C#俄罗斯方块游戏
- C# 俄罗斯方块的实现
- c# 小游戏 俄罗斯方块
- C#实现俄罗斯方块
- PyQt4 中的俄罗斯方块
- shell中的俄罗斯方块小游戏
- C#实现俄罗斯方块的基本功能
- C#程序设计分析之俄罗斯方块
- C#之四十八 俄罗斯方块设计
- c#经典俄罗斯方块 vs2012开发
- Qt 自定义信号与槽
- 拓扑排序——有向无环图(湖南省第十二届大学生计算机程序设计竞赛 B)
- Android 开发中一些你不知道但很有用的类和方法
- BZOJ 3676 & UOJ 103 [Apio2014]回文串
- 关于myeclipse 10 新建Filter,listener接口的问题
- C#中的俄罗斯方块
- Python3.x和Python2.x的区别
- POJ 2081——Recaman's Sequence
- 【opencv练习15 - 腐蚀膨胀】
- First Missing Positive
- 深入研究JavaScript的事件机制
- C语言 由拼音字串获取拼音数量
- Acute Stroke
- J2SE--线程