C#中的俄罗斯方块

本节主要讲解俄罗斯方块,代码如下
编辑器界面

<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;
            }
        }
    }
}

运行结果
本节难点在于图形的旋转的,同时学习了如何导入声音

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值