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