控制台《俄罗斯方块》小游戏,Copy代码可直接运行!

涉及到C#中各个方面的语法知识,在熟悉C#的同时,也可以锻炼自己的逻辑思维!

效果演示:在这里插入图片描述

刚开始我们输入方块下落的时间(单位:毫秒 ms),然后通过上下左右的光标键来控制 方块的变形与移动,希望对你有所帮助 ^ _ ^

.


代码如下所示:

using System;
using System.Threading;

namespace FowerDreams
{
    class Program
    {
        static void Main()
        {
            WelcomeMyFriend.SayWelcome();       // 欢迎界面
            WelcomeMyFriend.SayExplain();       // 游戏说明

            // 引用实例
            var tetrisPrimary = new TetrisPrimary(new InitTetrisSize(), new Diamonds());

            // 制作定时器(下落)
            Timer timer = new Timer(new TimerCallback((object state) => { tetrisPrimary.drawMapForOutput.UpdateDrop(); }));
            timer.Change(0, Diamonds.speed);

            // 绑定事件处理器 ( 左、右、下 )
            tetrisPrimary.Left += tetrisPrimary.LeftMove;
            tetrisPrimary.Right += tetrisPrimary.RightMove;
            tetrisPrimary.Down += tetrisPrimary.DownMove;
            tetrisPrimary.Up += tetrisPrimary.UpChange;

            while (true)
            {
                tetrisPrimary.drawMapForOutput.DrawMap();       // 画地图   

                if (Console.KeyAvailable)           // 判断是否从键盘按下了键
                {
                    var inputKey = Console.ReadKey().Key;
                    tetrisPrimary.MoveDiamonds(inputKey);
                }
            }
        }
    }


    class TetrisPrimary
    {
        public int Speed { get; set; }

        public static int Flag = 0;     // 标记方块转到了哪种形式

        public DrawMapForOutput drawMapForOutput;   // 画地图

        private IMapSizeAndArray _mapSizeAndArray;  // 大小与地图
        private IMapSizeAndArray _mapSizeAndDiamonds;   // 方块

        public event EventHandler Left;
        public event EventHandler Right;
        public event EventHandler Down;
        public event EventHandler Up;

        // 整体框架 和 方块
        public TetrisPrimary(IMapSizeAndArray mapSizeAndArray, IMapSizeAndArray mapSizeAndDiamonds)
        {
            _mapSizeAndArray = mapSizeAndArray;
            _mapSizeAndDiamonds = mapSizeAndDiamonds;

            drawMapForOutput = new DrawMapForOutput(mapSizeAndArray, mapSizeAndDiamonds);
        }

        internal void MoveDiamonds(ConsoleKey inputKey)
        {
            switch (inputKey)
            {
                case ConsoleKey.LeftArrow:
                    Left?.Invoke(this, null);
                    break;
                case ConsoleKey.RightArrow:
                    Right?.Invoke(this, null);
                    break;
                case ConsoleKey.UpArrow:
                    Up?.Invoke(this, null);
                    break;
                case ConsoleKey.DownArrow:
                    Down?.Invoke(this, null);
                    break;
            }
        }

        internal void LeftMove(object sender, EventArgs e)
        {
            for (int i = 0; i < 4; i++)
            {
                var x = DrawMapForOutput.flagPos[i, 0];
                var y = DrawMapForOutput.flagPos[i, 1];

                if (_mapSizeAndArray._array[x, y - 1] == 2)
                {
                    return;
                }
            }

            for (int i = 0; i < 4; i++)
            {
                var x = DrawMapForOutput.flagPos[i, 0];
                var y = DrawMapForOutput.flagPos[i, 1];

                _mapSizeAndArray._array[x, y] = 0;
                _mapSizeAndArray._array[x, y - 1] = 1;

                --DrawMapForOutput.flagPos[i, 1];
            }
        }

        internal void RightMove(object sender, EventArgs e)
        {
            for (int i = 0; i < 4; i++)
            {
                var x = DrawMapForOutput.flagPos[i, 0];
                var y = DrawMapForOutput.flagPos[i, 1];

                if (_mapSizeAndArray._array[x, y + 1] == 2)
                {
                    return;
                }
            }

            for (int i = 3; i >= 0; i--)
            {
                var x = DrawMapForOutput.flagPos[i, 0];
                var y = DrawMapForOutput.flagPos[i, 1];

                _mapSizeAndArray._array[x, y] = 0;
                _mapSizeAndArray._array[x, y + 1] = 1;

                ++DrawMapForOutput.flagPos[i, 1];
            }
        }

        internal void DownMove(object sender, EventArgs e)
        {
            drawMapForOutput.UpdateDrop();
        }

        internal void UpChange(object sender, EventArgs e)
        {
            Change(((Diamonds)_mapSizeAndDiamonds).SevenStyle);
        }

        private void Change(int n)
        {
            switch (n)
            {
                case 1:     // 第一种方块
                    switch (Flag % 4)
                    {
                        case 0:
                            try
                            {
                                var x = DrawMapForOutput.flagPos[0, 0];
                                var y = DrawMapForOutput.flagPos[0, 1];
                                if (_mapSizeAndArray._array[x, y - 1] == 0 && _mapSizeAndArray._array[x - 1, y - 1] == 0)
                                {
                                    // 先将所有方块置 0
                                    _mapSizeAndArray._array[x, y] = _mapSizeAndArray._array[x + 1, y - 1] =
                                        _mapSizeAndArray._array[x + 1, y] = _mapSizeAndArray._array[x + 1, y + 1] = 0;

                                    // 改变方块的下标
                                    DrawMapForOutput.flagPos[0, 0] -= 1; DrawMapForOutput.flagPos[0, 1] -= 1;
                                    DrawMapForOutput.flagPos[1, 0] -= 1;
                                    DrawMapForOutput.flagPos[2, 0] -= 1;
                                    DrawMapForOutput.flagPos[3, 1] -= 2;

                                    x = DrawMapForOutput.flagPos[0, 0];
                                    y = DrawMapForOutput.flagPos[0, 1];

                                    // 设置方块下标对应数组中的元素的值
                                    _mapSizeAndArray._array[x, y] = _mapSizeAndArray._array[x + 1, y] =
                                        _mapSizeAndArray._array[x + 1, y + 1] = _mapSizeAndArray._array[x + 2, y] = 1;

                                    ++Flag;     // 标记第一种已经变过形了
                                }
                                else
                                    return;
                            }
                            catch
                            {
                                return;
                            }

                            break;

                        case 1:
                            try
                            {
                                var x = DrawMapForOutput.flagPos[0, 0];
                                var y = DrawMapForOutput.flagPos[0, 1];
                                if (_mapSizeAndArray._array[x, y + 1] == 0 && _mapSizeAndArray._array[x, y + 2] == 0)
                                {
                                    // 先将所有方块置 0
                                    _mapSizeAndArray._array[x, y] = _mapSizeAndArray._array[x + 1, y] =
                                        _mapSizeAndArray._array[x + 1, y + 1] = _mapSizeAndArray._array[x + 2, y] = 0;


                                    // 改变方块的下标
                                    DrawMapForOutput.flagPos[1, 0] -= 1; DrawMapForOutput.flagPos[1, 1] += 1;
                                    DrawMapForOutput.flagPos[2, 0] -= 1; DrawMapForOutput.flagPos[2, 1] += 1;
                                    DrawMapForOutput.flagPos[3, 0] -= 1; DrawMapForOutput.flagPos[3, 1] += 1;

                                    x = DrawMapForOutput.flagPos[0, 0];
                                    y = DrawMapForOutput.flagPos[0, 1];

                                    // 设置方块下标对应数组中的元素的值
                                    _mapSizeAndArray._array[x, y] = _mapSizeAndArray._array[x, y + 1] =
                                        _mapSizeAndArray._array[x, y + 2] = _mapSizeAndArray._array[x + 1, y + 1] = 1;

                                    ++Flag;     // 标记第一种已经变过形了
                                }
                                else
                                    return;
                            }
                            catch
                            {
                                return;
                            }


                            break;

                        case 2:
                            try
                            {
                                var x = DrawMapForOutput.flagPos[0, 0];
                                var y = DrawMapForOutput.flagPos[0, 1];
                                if (_mapSizeAndArray._array[x + 1, y + 2] == 0 && _mapSizeAndArray._array[x + 2, y + 2] == 0)
                                {
                                    // 先将所有方块置 0
                                    _mapSizeAndArray._array[x, y] = _mapSizeAndArray._array[x, y + 1] =
                                        _mapSizeAndArray._array[x, y + 2] = _mapSizeAndArray._array[x + 1, y + 1] = 0;


                                    // 改变方块的下标
                                    DrawMapForOutput.flagPos[0, 1] += 2;
                                    DrawMapForOutput.flagPos[1, 0] += 1;
                                    DrawMapForOutput.flagPos[2, 0] += 1;
                                    DrawMapForOutput.flagPos[3, 0] += 1; DrawMapForOutput.flagPos[3, 1] += 1;

                                    x = DrawMapForOutput.flagPos[0, 0];         // 获取最新的第一个小方格 
                                    y = DrawMapForOutput.flagPos[0, 1];

                                    // 设置方块下标对应数组中的元素的值
                                    _mapSizeAndArray._array[x, y] = _mapSizeAndArray._array[x + 1, y - 1] =
                                        _mapSizeAndArray._array[x + 1, y] = _mapSizeAndArray._array[x + 2, y] = 1;

                                    ++Flag;     // 标记第一种已经变过形了
                                }
                                else
                                    return;
                            }
                            catch
                            {
                                return;
                            }

                            break;

                        case 3:
                            try
                            {
                                var x = DrawMapForOutput.flagPos[0, 0];
                                var y = DrawMapForOutput.flagPos[0, 1];
                                if (_mapSizeAndArray._array[x + 2, y - 2] == 0 && _mapSizeAndArray._array[x + 2, y - 1] == 0)
                                {
                                    // 先将所有方块置 0
                                    _mapSizeAndArray._array[x, y] = _mapSizeAndArray._array[x + 1, y - 1] =
                                        _mapSizeAndArray._array[x + 1, y] = _mapSizeAndArray._array[x + 2, y] = 0;


                                    // 改变方块的下标
                                    DrawMapForOutput.flagPos[0, 0] += 1; DrawMapForOutput.flagPos[0, 1] -= 1;
                                    DrawMapForOutput.flagPos[1, 0] += 1; DrawMapForOutput.flagPos[1, 1] -= 1;
                                    DrawMapForOutput.flagPos[2, 0] += 1; DrawMapForOutput.flagPos[2, 1] -= 1;

                                    x = DrawMapForOutput.flagPos[0, 0];         // 获取最新的第一个小方格 
                                    y = DrawMapForOutput.flagPos[0, 1];

                                    // 设置方块下标对应数组中的元素的值
                                    _mapSizeAndArray._array[x, y] = _mapSizeAndArray._array[x + 1, y - 1] =
                                        _mapSizeAndArray._array[x + 1, y] = _mapSizeAndArray._array[x + 1, y + 1] = 1;

                                    ++Flag;     // 标记第一种已经变过形了
                                }
                                else
                                    return;
                            }
                            catch
                            {
                                return;
                            }

                            break;
                    }
                    break;

                case 2:
                    switch (Flag % 4)
                    {
                        case 0:
                            try
                            {
                                var x = DrawMapForOutput.flagPos[0, 0];
                                var y = DrawMapForOutput.flagPos[0, 1];
                                if (_mapSizeAndArray._array[x - 1, y] == 0 && _mapSizeAndArray._array[x - 1, y + 1] == 0)
                                {
                                    // 先将所有方块置 0
                                    _mapSizeAndArray._array[x, y] = _mapSizeAndArray._array[x + 1, y] =
                                        _mapSizeAndArray._array[x + 1, y + 1] = _mapSizeAndArray._array[x + 1, y + 2] = 0;


                                    // 改变方块的下标
                                    DrawMapForOutput.flagPos[0, 0] -= 1;
                                    DrawMapForOutput.flagPos[1, 0] -= 2; DrawMapForOutput.flagPos[1, 1] += 1;
                                    DrawMapForOutput.flagPos[2, 0] -= 1; DrawMapForOutput.flagPos[2, 1] -= 1;
                                    DrawMapForOutput.flagPos[3, 1] -= 2;


                                    x = DrawMapForOutput.flagPos[0, 0];
                                    y = DrawMapForOutput.flagPos[0, 1];

                                    // 设置方块下标对应数组中的元素的值
                                    _mapSizeAndArray._array[x, y] = _mapSizeAndArray._array[x, y + 1] =
                                        _mapSizeAndArray._array[x + 1, y] = _mapSizeAndArray._array[x + 2, y] = 1;

                                    ++Flag;     // 标记第一种已经变过形了
                                }
                                else
                                    return;
                            }
                            catch
                            {
                                return;
                            }

                            break;

                        case 1:
                            try
                            {
                                var x = DrawMapForOutput.flagPos[0, 0];
                                var y = DrawMapForOutput.flagPos[0, 1];
                                if (_mapSizeAndArray._array[x + 1, y + 1] == 0 && _mapSizeAndArray._array[x + 1, y + 2] == 0
                                     && _mapSizeAndArray._array[x + 2, y + 2] == 0)
                                {
                                    // 先将所有方块置 0
                                    _mapSizeAndArray._array[x, y] = _mapSizeAndArray._array[x, y + 1] =
                                        _mapSizeAndArray._array[x + 1, y] = _mapSizeAndArray._array[x + 2, y] = 0;


                                    // 改变方块的下标
                                    DrawMapForOutput.flagPos[0, 0] += 1;
                                    DrawMapForOutput.flagPos[1, 0] += 1;
                                    DrawMapForOutput.flagPos[2, 1] += 2;
                                    DrawMapForOutput.flagPos[3, 1] += 2;


                                    x = DrawMapForOutput.flagPos[0, 0];
                                    y = DrawMapForOutput.flagPos[0, 1];

                                    // 设置方块下标对应数组中的元素的值
                                    _mapSizeAndArray._array[x, y] = _mapSizeAndArray._array[x, y + 1] =
                                        _mapSizeAndArray._array[x, y + 2] = _mapSizeAndArray._array[x + 1, y + 2] = 1;

                                    ++Flag;     // 标记第一种已经变过形了
                                }
                                else
                                    return;
                            }
                            catch
                            {
                                return;
                            }

                            break;

                        case 2:
                            try
                            {
                                var x = DrawMapForOutput.flagPos[0, 0];
                                var y = DrawMapForOutput.flagPos[0, 1];
                                if (_mapSizeAndArray._array[x + 1, y + 1] == 0 && _mapSizeAndArray._array[x - 1, y + 2] == 0)
                                {
                                    // 先将所有方块置 0
                                    _mapSizeAndArray._array[x, y] = _mapSizeAndArray._array[x, y + 1] =
                                        _mapSizeAndArray._array[x, y + 2] = _mapSizeAndArray._array[x + 1, y + 2] = 0;


                                    // 改变方块的下标
                                    DrawMapForOutput.flagPos[0, 0] -= 1; DrawMapForOutput.flagPos[0, 1] += 2;
                                    DrawMapForOutput.flagPos[1, 1] += 1;
                                    DrawMapForOutput.flagPos[2, 0] += 1; DrawMapForOutput.flagPos[2, 1] -= 1;


                                    x = DrawMapForOutput.flagPos[0, 0];
                                    y = DrawMapForOutput.flagPos[0, 1];

                                    // 设置方块下标对应数组中的元素的值
                                    _mapSizeAndArray._array[x, y] = _mapSizeAndArray._array[x + 1, y] =
                                        _mapSizeAndArray._array[x + 2, y - 1] = _mapSizeAndArray._array[x + 2, y] = 1;

                                    ++Flag;     // 标记第一种已经变过形了
                                }
                                else
                                    return;
                            }
                            catch
                            {
                                return;
                            }

                            break;

                        case 3:
                            try
                            {
                                var x = DrawMapForOutput.flagPos[0, 0];
                                var y = DrawMapForOutput.flagPos[0, 1];
                                if (_mapSizeAndArray._array[x + 1, y - 2] == 0 && _mapSizeAndArray._array[x + 2, y - 2] == 0)
                                {
                                    // 先将所有方块置 0
                                    _mapSizeAndArray._array[x, y] = _mapSizeAndArray._array[x + 1, y] =
                                        _mapSizeAndArray._array[x + 2, y] = _mapSizeAndArray._array[x + 2, y - 1] = 0;


                                    // 改变方块的下标
                                    DrawMapForOutput.flagPos[0, 0] += 1; DrawMapForOutput.flagPos[0, 1] -= 2;
                                    DrawMapForOutput.flagPos[1, 0] += 1; DrawMapForOutput.flagPos[1, 1] -= 2;


                                    x = DrawMapForOutput.flagPos[0, 0];
                                    y = DrawMapForOutput.flagPos[0, 1];

                                    // 设置方块下标对应数组中的元素的值
                                    _mapSizeAndArray._array[x, y] = _mapSizeAndArray._array[x + 1, y] =
                                        _mapSizeAndArray._array[x + 1, y + 1] = _mapSizeAndArray._array[x + 1, y + 2] = 1;

                                    ++Flag;     // 标记第一种已经变过形了
                                }
                                else
                                    return;
                            }
                            catch
                            {
                                return;
                            }

                            break;
                    }
                    break;

                case 3:
                    switch (Flag % 4)
                    {
                        case 0:
                            try
                            {
                                var x = DrawMapForOutput.flagPos[0, 0];
                                var y = DrawMapForOutput.flagPos[0, 1];
                                if (_mapSizeAndArray._array[x, y - 1] == 0 && _mapSizeAndArray._array[x - 1, y - 1] == 0)
                                {
                                    // 先将所有方块置 0
                                    _mapSizeAndArray._array[x, y] = _mapSizeAndArray._array[x + 1, y - 2] =
                                        _mapSizeAndArray._array[x + 1, y - 1] = _mapSizeAndArray._array[x + 1, y] = 0;


                                    // 改变方块的下标
                                    DrawMapForOutput.flagPos[0, 0] -= 1; DrawMapForOutput.flagPos[0, 1] -= 1;
                                    DrawMapForOutput.flagPos[1, 0] -= 1; DrawMapForOutput.flagPos[1, 1] += 1;


                                    x = DrawMapForOutput.flagPos[0, 0];
                                    y = DrawMapForOutput.flagPos[0, 1];

                                    // 设置方块下标对应数组中的元素的值
                                    _mapSizeAndArray._array[x, y] = _mapSizeAndArray._array[x + 1, y] =
                                        _mapSizeAndArray._array[x + 2, y] = _mapSizeAndArray._array[x + 2, y + 1] = 1;

                                    ++Flag;     // 标记第一种已经变过形了
                                }
                                else
                                    return;
                            }
                            catch
                            {
                                return;
                            }

                            break;

                        case 1:
                            try
                            {
                                var x = DrawMapForOutput.flagPos[0, 0];
                                var y = DrawMapForOutput.flagPos[0, 1];
                                if (_mapSizeAndArray._array[x + 1, y + 1] == 0 && _mapSizeAndArray._array[x + 1, y + 2] == 0)
                                {
                                    // 先将所有方块置 0
                                    _mapSizeAndArray._array[x, y] = _mapSizeAndArray._array[x + 1, y] =
                                        _mapSizeAndArray._array[x + 2, y] = _mapSizeAndArray._array[x + 2, y + 1] = 0;


                                    // 改变方块的下标
                                    DrawMapForOutput.flagPos[0, 0] += 1;
                                    DrawMapForOutput.flagPos[1, 1] += 1;
                                    DrawMapForOutput.flagPos[2, 0] -= 1; DrawMapForOutput.flagPos[2, 1] += 2;
                                    DrawMapForOutput.flagPos[3, 1] -= 1;


                                    x = DrawMapForOutput.flagPos[0, 0];
                                    y = DrawMapForOutput.flagPos[0, 1];

                                    // 设置方块下标对应数组中的元素的值
                                    _mapSizeAndArray._array[x, y] = _mapSizeAndArray._array[x, y + 1] =
                                        _mapSizeAndArray._array[x, y + 2] = _mapSizeAndArray._array[x + 1, y] = 1;

                                    ++Flag;     // 标记第一种已经变过形了
                                }
                                else
                                    return;
                            }
                            catch
                            {
                                return;
                            }

                            break;

                        case 2:
                            try
                            {
                                var x = DrawMapForOutput.flagPos[0, 0];
                                var y = DrawMapForOutput.flagPos[0, 1];
                                if (_mapSizeAndArray._array[x - 1, y] == 0 && _mapSizeAndArray._array[x + 1, y + 1] == 0)
                                {
                                    // 先将所有方块置 0
                                    _mapSizeAndArray._array[x, y] = _mapSizeAndArray._array[x, y + 1] =
                                        _mapSizeAndArray._array[x, y + 2] = _mapSizeAndArray._array[x + 1, y] = 0;


                                    // 改变方块的下标
                                    DrawMapForOutput.flagPos[0, 0] -= 1;
                                    DrawMapForOutput.flagPos[1, 0] -= 1;
                                    DrawMapForOutput.flagPos[2, 1] -= 1;
                                    DrawMapForOutput.flagPos[3, 1] += 1;


                                    x = DrawMapForOutput.flagPos[0, 0];
                                    y = DrawMapForOutput.flagPos[0, 1];

                                    // 设置方块下标对应数组中的元素的值
                                    _mapSizeAndArray._array[x, y] = _mapSizeAndArray._array[x, y + 1] =
                                        _mapSizeAndArray._array[x + 1, y + 1] = _mapSizeAndArray._array[x + 2, y + 1] = 1;

                                    ++Flag;     // 标记第一种已经变过形了
                                }
                                else
                                    return;
                            }
                            catch
                            {
                                return;
                            }

                            break;

                        case 3:
                            try
                            {
                                var x = DrawMapForOutput.flagPos[0, 0];
                                var y = DrawMapForOutput.flagPos[0, 1];
                                if (_mapSizeAndArray._array[x + 2, y - 1] == 0 && _mapSizeAndArray._array[x + 2, y] == 0)
                                {
                                    // 先将所有方块置 0
                                    _mapSizeAndArray._array[x, y] = _mapSizeAndArray._array[x, y + 1] =
                                        _mapSizeAndArray._array[x + 1, y + 1] = _mapSizeAndArray._array[x + 2, y + 1] = 0;


                                    // 改变方块的下标
                                    DrawMapForOutput.flagPos[0, 0] += 1; DrawMapForOutput.flagPos[0, 1] += 1;
                                    DrawMapForOutput.flagPos[1, 0] += 2; DrawMapForOutput.flagPos[1, 1] -= 2;
                                    DrawMapForOutput.flagPos[2, 0] += 1; DrawMapForOutput.flagPos[2, 1] -= 1;


                                    x = DrawMapForOutput.flagPos[0, 0];
                                    y = DrawMapForOutput.flagPos[0, 1];

                                    // 设置方块下标对应数组中的元素的值
                                    _mapSizeAndArray._array[x, y] = _mapSizeAndArray._array[x + 1, y - 2] =
                                        _mapSizeAndArray._array[x + 1, y - 1] = _mapSizeAndArray._array[x + 1, y] = 1;

                                    ++Flag;     // 标记第一种已经变过形了
                                }
                                else
                                    return;
                            }
                            catch
                            {
                                return;
                            }

                            break;
                    }
                    break;

                case 4:
                    switch (Flag % 2)
                    {
                        case 0:
                            try
                            {
                                var x = DrawMapForOutput.flagPos[0, 0];
                                var y = DrawMapForOutput.flagPos[0, 1];
                                if (_mapSizeAndArray._array[x - 1, y + 2] == 0 && _mapSizeAndArray._array[x, y + 2] == 0)
                                {
                                    // 先将所有方块置 0
                                    _mapSizeAndArray._array[x, y] = _mapSizeAndArray._array[x, y + 1] =
                                        _mapSizeAndArray._array[x + 1, y + 1] = _mapSizeAndArray._array[x + 1, y + 2] = 0;


                                    // 改变方块的下标
                                    DrawMapForOutput.flagPos[0, 0] -= 1; DrawMapForOutput.flagPos[0, 1] += 2;
                                    DrawMapForOutput.flagPos[2, 0] -= 1; DrawMapForOutput.flagPos[2, 1] += 1;
                                    DrawMapForOutput.flagPos[3, 1] -= 1;


                                    x = DrawMapForOutput.flagPos[0, 0];
                                    y = DrawMapForOutput.flagPos[0, 1];

                                    // 设置方块下标对应数组中的元素的值
                                    _mapSizeAndArray._array[x, y] = _mapSizeAndArray._array[x + 1, y - 1] =
                                        _mapSizeAndArray._array[x + 1, y] = _mapSizeAndArray._array[x + 2, y - 1] = 1;

                                    ++Flag;     // 标记第一种已经变过形了
                                }
                                else
                                    return;
                            }
                            catch
                            {
                                return;
                            }

                            break;

                        case 1:
                            try
                            {
                                var x = DrawMapForOutput.flagPos[0, 0];
                                var y = DrawMapForOutput.flagPos[0, 1];
                                if (_mapSizeAndArray._array[x + 1, y - 2] == 0 && _mapSizeAndArray._array[x + 2, y] == 0)
                                {
                                    // 先将所有方块置 0
                                    _mapSizeAndArray._array[x, y] = _mapSizeAndArray._array[x + 1, y - 1] =
                                        _mapSizeAndArray._array[x + 1, y] = _mapSizeAndArray._array[x + 2, y - 1] = 0;



                                    // 改变方块的下标
                                    DrawMapForOutput.flagPos[0, 0] += 1; DrawMapForOutput.flagPos[0, 1] -= 2;
                                    DrawMapForOutput.flagPos[2, 0] += 1; DrawMapForOutput.flagPos[2, 1] -= 1;
                                    DrawMapForOutput.flagPos[3, 1] += 1;


                                    x = DrawMapForOutput.flagPos[0, 0];
                                    y = DrawMapForOutput.flagPos[0, 1];

                                    // 设置方块下标对应数组中的元素的值
                                    _mapSizeAndArray._array[x, y] = _mapSizeAndArray._array[x, y + 1] =
                                        _mapSizeAndArray._array[x + 1, y + 1] = _mapSizeAndArray._array[x + 1, y + 2] = 1;

                                    ++Flag;     // 标记第一种已经变过形了
                                }
                                else
                                    return;
                            }
                            catch
                            {
                                return;
                            }

                            break;
                    }
                    break;

                case 5:
                    switch (Flag % 2)
                    {
                        case 0:
                            try
                            {
                                var x = DrawMapForOutput.flagPos[0, 0];
                                var y = DrawMapForOutput.flagPos[0, 1];
                                if (_mapSizeAndArray._array[x - 1, y - 1] == 0 && _mapSizeAndArray._array[x, y - 1] == 0)
                                {
                                    // 先将所有方块置 0
                                    _mapSizeAndArray._array[x, y] = _mapSizeAndArray._array[x, y + 1] =
                                        _mapSizeAndArray._array[x + 1, y - 1] = _mapSizeAndArray._array[x + 1, y] = 0;


                                    // 改变方块的下标
                                    DrawMapForOutput.flagPos[0, 0] -= 1; DrawMapForOutput.flagPos[0, 1] -= 1;
                                    DrawMapForOutput.flagPos[1, 1] -= 2;
                                    DrawMapForOutput.flagPos[2, 0] -= 1; DrawMapForOutput.flagPos[2, 1] += 1;


                                    x = DrawMapForOutput.flagPos[0, 0];
                                    y = DrawMapForOutput.flagPos[0, 1];

                                    // 设置方块下标对应数组中的元素的值
                                    _mapSizeAndArray._array[x, y] = _mapSizeAndArray._array[x + 1, y] =
                                        _mapSizeAndArray._array[x + 1, y + 1] = _mapSizeAndArray._array[x + 2, y + 1] = 1;

                                    ++Flag;     // 标记第一种已经变过形了
                                }
                                else
                                    return;
                            }
                            catch
                            {
                                return;
                            }

                            break;

                        case 1:
                            try
                            {
                                var x = DrawMapForOutput.flagPos[0, 0];
                                var y = DrawMapForOutput.flagPos[0, 1];
                                if (_mapSizeAndArray._array[x + 2, y] == 0 && _mapSizeAndArray._array[x + 1, y + 2] == 0)
                                {
                                    // 先将所有方块置 0
                                    _mapSizeAndArray._array[x, y] = _mapSizeAndArray._array[x + 1, y] =
                                        _mapSizeAndArray._array[x + 1, y + 1] = _mapSizeAndArray._array[x + 2, y + 1] = 0;



                                    // 改变方块的下标
                                    DrawMapForOutput.flagPos[0, 0] += 1; DrawMapForOutput.flagPos[0, 1] += 1;
                                    DrawMapForOutput.flagPos[1, 1] += 2;
                                    DrawMapForOutput.flagPos[2, 0] += 1; DrawMapForOutput.flagPos[2, 1] -= 1;


                                    x = DrawMapForOutput.flagPos[0, 0];
                                    y = DrawMapForOutput.flagPos[0, 1];

                                    // 设置方块下标对应数组中的元素的值
                                    _mapSizeAndArray._array[x, y] = _mapSizeAndArray._array[x, y + 1] =
                                        _mapSizeAndArray._array[x + 1, y - 1] = _mapSizeAndArray._array[x + 1, y] = 1;

                                    ++Flag;     // 标记第一种已经变过形了
                                }
                                else
                                    return;
                            }
                            catch
                            {
                                return;
                            }

                            break;
                    }
                    break;

                case 8:
                case 9:
                    switch (Flag % 2)
                    {
                        case 0:
                            try         // 防止数组越界 
                            {
                                var x = DrawMapForOutput.flagPos[0, 0];
                                var y = DrawMapForOutput.flagPos[0, 1];

                                if (_mapSizeAndArray._array[x - 1, y] == 0 && _mapSizeAndArray._array[x - 2, y] == 0 &&
                                         _mapSizeAndArray._array[x - 3, y] == 0)
                                {
                                    // 先将所有方块置 0
                                    _mapSizeAndArray._array[x, y] = _mapSizeAndArray._array[x, y + 1] =
                                        _mapSizeAndArray._array[x, y + 2] = _mapSizeAndArray._array[x, y + 3] = 0;


                                    // 改变方块的下标
                                    DrawMapForOutput.flagPos[0, 0] -= 3;
                                    DrawMapForOutput.flagPos[1, 0] -= 2; DrawMapForOutput.flagPos[1, 1] -= 1;
                                    DrawMapForOutput.flagPos[2, 0] -= 1; DrawMapForOutput.flagPos[2, 1] -= 2;
                                    DrawMapForOutput.flagPos[3, 1] -= 3;

                                    x = DrawMapForOutput.flagPos[0, 0];
                                    y = DrawMapForOutput.flagPos[0, 1];

                                    // 设置方块下标对应数组中的元素的值
                                    _mapSizeAndArray._array[x, y] = _mapSizeAndArray._array[x + 1, y] =
                                        _mapSizeAndArray._array[x + 2, y] = _mapSizeAndArray._array[x + 3, y] = 1;

                                    ++Flag;     // 标记第一种已经变过形了
                                }
                                else
                                    return;
                            }
                            catch
                            {
                                return;
                            }

                            break;

                        case 1:
                            try
                            {
                                var x = DrawMapForOutput.flagPos[0, 0];
                                var y = DrawMapForOutput.flagPos[0, 1];

                                if (_mapSizeAndArray._array[x + 3, y + 1] == 0 && _mapSizeAndArray._array[x + 3, y + 2] == 0 &&
                                         _mapSizeAndArray._array[x + 3, y + 3] == 0)
                                {
                                    // 先将所有方块置 0
                                    _mapSizeAndArray._array[x, y] = _mapSizeAndArray._array[x + 1, y] =
                                        _mapSizeAndArray._array[x + 2, y] = _mapSizeAndArray._array[x + 3, y] = 0;


                                    // 改变方块的下标
                                    DrawMapForOutput.flagPos[0, 0] += 3;
                                    DrawMapForOutput.flagPos[1, 0] += 2; DrawMapForOutput.flagPos[1, 1] += 1;
                                    DrawMapForOutput.flagPos[2, 0] += 1; DrawMapForOutput.flagPos[2, 1] += 2;
                                    DrawMapForOutput.flagPos[3, 1] += 3;

                                    x = DrawMapForOutput.flagPos[0, 0];
                                    y = DrawMapForOutput.flagPos[0, 1];

                                    // 设置方块下标对应数组中的元素的值
                                    _mapSizeAndArray._array[x, y] = _mapSizeAndArray._array[x, y + 1] =
                                        _mapSizeAndArray._array[x, y + 2] = _mapSizeAndArray._array[x, y + 3] = 1;

                                    ++Flag;     // 标记第一种已经变过形了
                                }
                                else
                                    return;
                            }
                            catch
                            {
                                return;
                            }

                            break;
                    }
                    break;
            }
        }
    }


    // 包含数组与大小的接口
    interface IMapSizeAndArray          // 解决了类之间的紧耦合
    {
        int Row { get; set; }
        int Col { get; set; }
        int[,] _array { get; set; }

        int GetRow();
        int GetCol();
    }


    class DrawMapForOutput
    {
        private IMapSizeAndArray _mapSizeAndArray;      // 引用接口 (整体框架)
        private IMapSizeAndArray _mapSizeAndDiamonds;   // 方块
        public static int[,] flagPos = new int[4, 2];          // 用于标记方块的位置

        public static int RandomNum;        // 随机数记录

        public DrawMapForOutput(IMapSizeAndArray mapSizeAndArray, IMapSizeAndArray mapSizeAndDiamonds)
        {
            Console.CursorVisible = false;              //隐藏光标 

            _mapSizeAndArray = mapSizeAndArray;
            _mapSizeAndDiamonds = mapSizeAndDiamonds;

            // 将方块赋值给整体框架
            InitDiamonds();

            for (int i = 0; i < _mapSizeAndArray.Col; i++)          // 将边界设置为 2
            {
                _mapSizeAndArray._array[_mapSizeAndArray.Row - 1, i] = 2;
            }
            for (int i = 0; i < _mapSizeAndArray.Row; i++)
            {
                _mapSizeAndArray._array[i, 0] = 2;
                _mapSizeAndArray._array[i, _mapSizeAndArray.Col - 1] = 2;
            }
        }

        public void DrawMap()
        {
            const int x = 30;       // 地图较控制台的初始位置
            int y = 5;

            for (int i = 0; i < _mapSizeAndArray.Row; i++)
            {
                Console.SetCursorPosition(x, y);    // 设置光标

                for (int j = 0; j < _mapSizeAndArray.Col; j++)
                {
                    if (j == 0 || j == _mapSizeAndArray.Col - 1 || i == _mapSizeAndArray.Row - 1 ||
                        _mapSizeAndArray._array[i, j] == 1 || _mapSizeAndArray._array[i, j] == 2)
                    {
                        Console.Write("■");
                    }
                    else
                    {
                        Console.Write("  ");
                    }
                }

                Console.WriteLine();
                y += 1;
            }
        }

        //  初始化方块的位置
        private void InitDiamonds()
        {
            int k = 0;

            for (int i = 0; i < _mapSizeAndDiamonds.Row; i++)
            {
                for (int j = 0; j < _mapSizeAndDiamonds.Col; j++)
                {
                    _mapSizeAndArray._array[i + 1, j + 5] = _mapSizeAndDiamonds._array[i, j];

                    if (_mapSizeAndDiamonds._array[i, j] == 1)
                    {
                        flagPos[k, 0] = i + 1;
                        flagPos[k, 1] = j + 5;
                        ++k;
                    }
                }
            }

        }

        public void UpdateDrop()        // 下落更新
        {
            for (int i = 0; i < 4; i++)
            {
                if (_mapSizeAndArray._array[flagPos[i, 0] + 1, flagPos[i, 1]] == 2)
                {
                    for (int j = 3; j >= 0; j--)
                        _mapSizeAndArray._array[flagPos[j, 0], flagPos[j, 1]] = 2;

                    RemoveDiamonds();


                    ((Diamonds)_mapSizeAndDiamonds).SetArrayEmpty();        // 将 方块数组的元素都清空

                    ((Diamonds)_mapSizeAndDiamonds).SetDiamonds(RandomNum);         // 获取新的方块
                    InitDiamonds();

                    TetrisPrimary.Flag = 0;         // 这句代码我会铭记于心 (折磨我 !!!!!!!!!!!!!)

                    return;
                }
            }

            for (int i = 3; i >= 0; i--)
            {
                _mapSizeAndArray._array[flagPos[i, 0], flagPos[i, 1]] = 0;
                _mapSizeAndArray._array[flagPos[i, 0] + 1, flagPos[i, 1]] = 1;
                ++flagPos[i, 0];
            }
        }

        private bool JudgeLosing()
        {
            return flagPos[3, 0] < 5;
        }


        private void RemoveDiamonds()
        {
            int min = flagPos[0, 0];        // 找到判断方块消除的范围
            int max = flagPos[3, 0];
            int flag = 0;   // 标记一行是否都是方块

            for (int i = max; i >= min; i--)
            {
                flag = 0;
                for (int j = 1; j < _mapSizeAndArray.Col - 1; j++)
                {
                    if (_mapSizeAndArray._array[i, j] != 2)
                    {
                        flag = 1;
                        break;
                    }
                }

                if (flag == 0)
                {
                    for (int k = i; k > 0; k--)
                    {
                        for (int l = 1; l < _mapSizeAndArray.Col - 1; l++)
                        {
                            _mapSizeAndArray._array[k, l] = _mapSizeAndArray._array[k - 1, l];
                        }
                    }
                    ++i;
                }
            }
        }

    }


    class InitTetrisSize : IMapSizeAndArray
    {
        public int Row { get; set; }
        public int Col { get; set; }
        public int[,] _array { get; set; }


        public InitTetrisSize()
        {
            Console.Title = "作者:Flower Dreams";

            Row = 21;   //  20行 10列
            Col = 12;
            _array = new int[Row, Col];   // 引用实例
        }

        public int GetRow()
        {
            return Row;
        }

        public int GetCol()
        {
            return Col;
        }
    }


    class Diamonds : IMapSizeAndArray           // 方块的大小类
    {
        public int Row { get; set; }
        public int Col { get; set; }
        public int[,] _array { get; set; }
        public int SevenStyle { get; set; }     // 七种不同的方块标记

        public static int speed;

        public Diamonds()
        {
            Row = 2;
            Col = 4;
            _array = new int[Row, Col];         // 四行四列的数组用于存放方块 

            SetDiamonds(1);
        }


        public int GetCol()
        {
            return Col;
        }

        public int GetRow()
        {
            return Row;
        }

        public void SetArrayEmpty()
        {
            for (int i = 0; i < Row; i++)
            {
                for (int j = 0; j < Col; j++)
                {
                    _array[i, j] = 0;
                }
            }
        }

        public void SetDiamonds(int n)
        {
            switch (n)
            {
                case 1: // 山
                    _array[0, 1] = 1; _array[1, 0] = 1; _array[1, 1] = 1; _array[1, 2] = 1;
                    Console.ForegroundColor = ConsoleColor.DarkCyan;
                    break;
                case 2:
                    _array[0, 0] = 1; _array[1, 0] = 1; _array[1, 1] = 1; _array[1, 2] = 1;
                    Console.ForegroundColor = ConsoleColor.DarkMagenta;
                    break;
                case 3:
                    _array[0, 2] = 1; _array[1, 0] = 1; _array[1, 1] = 1; _array[1, 2] = 1;
                    Console.ForegroundColor = ConsoleColor.DarkBlue;
                    break;
                case 4:
                    Console.ForegroundColor = ConsoleColor.Yellow;
                    _array[0, 0] = 1; _array[0, 1] = 1; _array[1, 1] = 1; _array[1, 2] = 1;
                    break;
                case 5:
                    Console.ForegroundColor = ConsoleColor.Gray;
                    _array[0, 1] = 1; _array[0, 2] = 1; _array[1, 0] = 1; _array[1, 1] = 1;
                    break;
                case 6:          // 方形
                case 7:
                    Console.ForegroundColor = ConsoleColor.Magenta;
                    _array[0, 0] = 1; _array[0, 1] = 1; _array[1, 0] = 1; _array[1, 1] = 1;
                    break;
                case 8:          // 长条
                case 9:
                    Console.ForegroundColor = ConsoleColor.DarkGray;
                    _array[1, 0] = 1; _array[1, 1] = 1; _array[1, 2] = 1; _array[1, 3] = 1;
                    break;
            }

            SevenStyle = n;     // 标记方块的种类

            DrawMapForOutput.RandomNum = new Random().Next(1, 10);      // 提前知道下一个方块是什么

            //          NextDiamonds(DrawMapForOutput.RandomNum , Row, Col);   
        }


        //public static void NextDiamonds(int num, int m, int n)
        //{
        //    int[,] tmpArr = new int[m, n];
        //    switch (num)
        //    {
        //        case 1: // 山
        //            tmpArr[0, 1] = 1; tmpArr[1, 0] = 1; tmpArr[1, 1] = 1; tmpArr[1, 2] = 1;
        //            break;
        //        case 2:
        //            tmpArr[0, 0] = 1; tmpArr[1, 0] = 1; tmpArr[1, 1] = 1; tmpArr[1, 2] = 1;
        //            break;
        //        case 3:
        //            tmpArr[0, 2] = 1; tmpArr[1, 0] = 1; tmpArr[1, 1] = 1; tmpArr[1, 2] = 1;
        //            break;
        //        case 4:
        //            tmpArr[0, 0] = 1; tmpArr[0, 1] = 1; tmpArr[1, 1] = 1; tmpArr[1, 2] = 1;
        //            break;
        //        case 5:
        //            tmpArr[0, 1] = 1; tmpArr[0, 2] = 1; tmpArr[1, 0] = 1; tmpArr[1, 1] = 1;
        //            break;
        //        case 6:          // 方形
        //        case 7:
        //            tmpArr[0, 0] = 1; tmpArr[0, 1] = 1; tmpArr[1, 0] = 1; tmpArr[1, 1] = 1;
        //            break;
        //        case 8:          // 长条
        //        case 9:
        //            tmpArr[1, 0] = 1; tmpArr[1, 1] = 1; tmpArr[1, 2] = 1; tmpArr[1, 3] = 1;
        //            break;
        //    }


        //    int x = 80, y = 10;


        //    for (int i = 0; i < m; i++)
        //    {
        //        Console.SetCursorPosition(x, y);
        //        for (int j = 0; j < n; j++)
        //        {
        //            if (tmpArr[i, j] == 1)
        //                Console.Write("■");
        //            else
        //                Console.Write("  ");
        //        }
        //        Console.WriteLine();
        //        ++y;
        //    }
        //}

    }


    class WelcomeMyFriend
    {
        // 设置光标
        public static Action<int, int> SetCursor = (x, y) => { Console.SetCursorPosition(x, y); };
        public static Action<string> PutText = (str) => { Console.WriteLine(str); };

        public static void SayWelcome()
        {
            var x = Console.BufferWidth;
            SetCursor(x / 2 - 15, 5);
            PutText("< 俄 罗 斯 方 块 >");
            SetCursor(x / 2 - 18, 10);
            PutText("欢 迎 你, 我 的 朋 友 !");
            SetCursor(0, 23);
            PutText("按两次回车继续 ... ");
        xxx: SetCursor(0, 17);
            PutText("请输入方块下落的速度(单位:ms):");
            SetCursor(0, 19);
            try
            {
                Diamonds.speed = int.Parse(Console.ReadLine());
            }
            catch (Exception ec)
            {
                PutText(ec.Message);
                goto xxx;
            }

            Console.ReadLine();
            Console.Clear();
        }

        public static void SayExplain()
        {
            SetCursor(70, 5);
            PutText("作者:Fower Dreams");
            SetCursor(70, 7);
            PutText("抱着一颗工匠之心");
            SetCursor(70, 8);
            PutText("想为祖国IT行业作出奉献!");
            SetCursor(70, 9);
            PutText("为爱而战 ...");

            SetCursor(70, 15);
            PutText("游戏规则:");
            SetCursor(80, 17);
            PutText("1. 光标键:→ 、← 控制方块的方向");
            SetCursor(80, 19);
            PutText("2. 光标键:↓ 控制方块的加速");
            SetCursor(80, 21);
            PutText("3. 光标键:↑ 控制方块的变形");
        }
    }
}

.
.
.


猜你喜欢

转载自blog.csdn.net/weixin_42100963/article/details/107425536