控制台实现2048小游戏 c#

需求

  • 上移
    * --从上到下 获取列数据,形成一维数组
    * --合并数据
    * --去零:将0元素移到末尾
    * --相邻相同,则合并(将后一个元素累加到前一个元素上,后一个元素清零)
    * --2 2 0 0 ==> 4 0 0 0
    * --去零:将0元素移到末尾
    * --2 2 2 0 ==> 4 0 2 0 ==> 4 2 0 0
    * --2 0 2 0 ==> 2 2 0 0 ==> 4 0 0 0
    * --2 0 2 4 ==> 2 2 4 0 ==> 4 0 4 0 ==> 4 4 0 0
    * --将一维数组元素还原至原列
  • 下移2.0
    * --从下到上 获取列数据,形成一维数组
    * --合并数据
    * --去零:将0元素移到末尾
    * --相邻相同,则合并(将后一个元素累加到前一个元素上,后一个元素清零)
    * --去零:将0元素移到末尾
    * --将一维数组元素还原至原列
  • 左移
  • 右移

编码

  1. 定义去零方法(针对一维数组):将0元素移到末尾
  2. 合并数据方法(针对一维数组)
    * --去零:将0元素移到开头
    * --相邻相同,则合并(将前一个元素累加到后一个元素上,前一个元素清零)
    * --去零:将0元素移到开头
  3. 上移
    * --从上到下获取数据列,形成一维数组
    * --调用合并数据方法
    * --将一维数组元素还原至原列
  4. 下移
    * --从下到上获取数据列,形成一维数组
    * --调用合并数据方法
    * --将一维数组元素还原至原列
  5. 左移
  6. 右移

代码实现

using System;

namespace Day05
{
    class Program
    {
        static void Main1(string[] args)
        {
            //数组分类:一维数组 多(二)维数组 交错数组
            //创建5行3列的二维数组
            int[,] array = new int[5,3];
            //将数据6赋值给数组的第一行第三列
            array[1, 2] = 6;
            array[0, 2] = 456;

            //获取二维数组中所有元素
            foreach (int item in array)
            {
                Console.WriteLine(item);
            }

            //将第一行显示到控制台中
            //array.GetLength()获取指定维数的长度
            //array.GetLength(0)获取行数
            //array.GetLength(1)获取列数
            for (int r = 0; r < array.GetLength(0); r++)
            {
                for(int c = 0;c < array.GetLength(1); c++)
                {
                    Console.Write(array[r,c]+"\t");
                }
                Console.WriteLine();
            }

            Console.ReadLine();
        }
        /***************************2048核心算法*****************************************************/
        /*
         * 需求分析**************************************************************************
          上移
         * --从上到下 获取列数据,形成一维数组
         * --合并数据
         *   --去零:将0元素移到末尾
         *   --相邻相同,则合并(将后一个元素累加到前一个元素上,后一个元素清零)
         *   --2 2 0 0 ==> 4 0 0 0 
         *   --去零:将0元素移到末尾
         *   --2 2 2 0 ==> 4 0 2 0 ==> 4 2 0 0
         *   --2 0 2 0 ==> 2 2 0 0 ==> 4 0 0 0 
         *   --2 0 2 4 ==> 2 2 4 0 ==> 4 0 4 0 ==> 4 4 0 0 
         * --将一维数组元素还原至原列
         * 
         * 
          下移1.0
         * --从上到下 获取列数据,形成一维数组
         * --合并数据
         *   --去零:将0元素移到开头
         *   --相邻相同,则合并(将前一个元素累加到后一个元素上,前一个元素清零)
         *   --去零:将0元素移到开头
         * --将一维数组元素还原至原列
         * 
         * 
          下移2.0
         * --从下到上 获取列数据,形成一维数组
         * --合并数据
         *   --去零:将0元素移到末尾
         *   --相邻相同,则合并(将后一个元素累加到前一个元素上,后一个元素清零)
         *   --去零:将0元素移到末尾
         * --将一维数组元素还原至原列
         * 
         * 
          左移
         * 
          右移
         *
         * 
         * 编码 **************************************************************************************************
         * 1.定义去零方法(针对一维数组):将0元素移到末尾
         * 2.合并数据方法(针对一维数组)
         *   --去零:将0元素移到开头
         *   --相邻相同,则合并(将前一个元素累加到后一个元素上,前一个元素清零)
         *   --去零:将0元素移到开头
         * 3.上移
         *   --从上到下获取数据列,形成一维数组
         *   --调用合并数据方法
         *   --将一维数组元素还原至原列
         * 4.下移
         *   --从下到上获取数据列,形成一维数组
         *   --调用合并数据方法
         *   --将一维数组元素还原至原列
         * 5.左移
         * 6.右移
         */
        static void Main(string[] args)
        {
            int[,] map = new int[4, 4]
                {
                    {2,2,4,8 },
                    {2,4,4,4 },
                    {2,8,4,0 },
                    {2,4,0,4 }
                };
            do
            {
                PrintDoubleArray(map);
                Console.WriteLine("输入您要进行的操作");
                Console.WriteLine("1.上移:输入w");
                Console.WriteLine("2.下移:输入s");
                Console.WriteLine("3.左移:输入a");
                Console.WriteLine("4.右移:输入d");
                char op = char.Parse(Console.ReadLine());
                switch (op)
                {
                    case 'w':
                        Console.WriteLine("上移");
                        map = MovuUp(map);
                        break;
                    case 's':
                        Console.WriteLine("下移");
                        map = MovuDown(map);
                        break;
                    case 'a':
                        Console.WriteLine("左移");
                        map = MovuLeft(map);
                        break;
                    case 'd':
                        Console.WriteLine("右移");
                        map = MovuRight(map);
                        break;
                    default:
                        Console.WriteLine("输入有误,请输入'w'、's'、'a'、'd'中的任意字符");
                        break;
                }
            } while (true);

            Console.ReadLine();

        }
        //打印二维数组
        private static void PrintDoubleArray(Array array)
        {
            for(int r= 0; r < array.GetLength(0); r++)
            {
                for(int c = 0;c < array.GetLength(1); c++)
                {
                    Console.Write(array.GetValue(r,c) + "\t");
                }
                Console.WriteLine();
            }
        }
        //去零方法
        private static int[] RemoveZero(int[] array)
        {
            //0 0 0 0
            int[] newArray = new int[array.Length];
            //将非零元素 依次 赋值给新数组
            int newIndex = 0;
            for(int i = 0; i < array.Length;i++)
            {
                if (array[i] != 0)
                {
                    newArray[newIndex++] = array[i];
                }
            }
            return newArray;
        }
        //合并
        private static int[] Merge(int[] array)
        {
            array = RemoveZero(array);
            //合并数据
            for(int i = 0; i < array.Length - 1; i++)
            {
                if(array[i] != 0 && array[i] == array[i + 1] )
                {
                    array[i] = array[i] + array[i + 1];
                    array[i + 1] = 0;
                    //统计合并位置
                }
            }
            return RemoveZero(array);
        }
        //上移
        private static int[,] MovuUp(int[,] map)
        {
            //从上到下 获取每列数据,形成一维数组
            /*
             *
             */
            int[] mergeArray = new int[map.GetLongLength(0)];
            for(int c = 0;c < map.GetLength(1); c++)
            {
                for (int r = 0; r < map.GetLength(0); r++)
                {
                    mergeArray[r] = map[r, c];
                }

                mergeArray = Merge(mergeArray);

                for (int r = 0; r < map.GetLength(0); r++)
                {
                    map[r, c] = mergeArray[r];
                }
            }
            return map;
        }
        //下移
        private static int[,] MovuDown(int[,] map)
        {
            //从下到上 获取每列数据,形成一维数组
            /*
             *
             */
            int[] mergeArray = new int[map.GetLongLength(0)];
            for (int c = 0; c < map.GetLength(1); c++)
            {
                for (int r = map.GetLength(0)-1; r >= 0; r--)
                {
                    mergeArray[map.GetLongLength(0)- 1 - r] = map[r, c];
                }

                mergeArray = Merge(mergeArray);

                for (int r = 0; r < map.GetLength(0); r++)
                {
                    map[r, c] = mergeArray[map.GetLength(0) -1 - r];
                }
            }
            return map;
        }
        //左移
        private static int[,] MovuLeft(int[,] map)
        {
            //从上到下 获取每列数据,形成一维数组
            /*
             *
             */
            int[] mergeArray = new int[map.GetLongLength(1)];
            for (int r = 0; r < map.GetLength(0); r++)
            {
                for (int c = 0; c < map.GetLength(1); c++)
                {
                    mergeArray[c] = map[r, c];
                }

                mergeArray = Merge(mergeArray);

                for (int c = 0; c < map.GetLength(1); c++)
                {
                    map[r, c] = mergeArray[c];
                }
            }
            return map;
        }
        //右移
        private static int[,] MovuRight(int[,] map)
        {
            //从下到上 获取每列数据,形成一维数组
            /*
             *
             */
            int[] mergeArray = new int[map.GetLongLength(1)];
            for (int r = 0; r < map.GetLength(0); r++)
            {
                for (int c = map.GetLength(1) - 1; c >= 0; c--)
                {
                    mergeArray[map.GetLongLength(1) - 1 - c] = map[r, c];
                }

                mergeArray = Merge(mergeArray);

                for (int c = 0; c < map.GetLength(1); c++)
                {
                    map[r, c] = mergeArray[map.GetLength(1) - 1 - c];
                }
            }
            return map;
        }
    }
}

致谢

代码以及实现过程来自祁天暄老师的课程
课程b站链接P75 2.C#基础08-10(1)

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值