ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Unity 休闲类游戏2048核心算法

2021-05-28 09:59:39  阅读:177  来源: 互联网

标签:map mergeArray -- 元素 2048 int Unity 数组 休闲类


	编写不易,请勿盗用。

本篇博客超链接:https://blog.csdn.net/weixin_50837893/article/details/117350773

1.需求分析

	上移动
	  -- 从上到下  获取列数据,形成一维数组
     eg: 2 2 0 0 --》 4 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
      -- 合并数据
            -- 去零: 将0元素移至末尾
            -- 相邻相同,则合并(将后一个元素累加到前一个元素上,后一个元素清零)
            -- 去零:将0元素移到末尾
      -- 将一维数组元素 还原至原列


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


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

2.编 码

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

        6. 右移
            -- 从右到左   获取列数据,形成一维数组
            -- 调用合并数据方法
            -- 将一维数组元素 还原至原列

由于本篇注重于算法实现,所以用控制台应用实现效果。

/*

		去零方法
		
*/
   private static int[] RemoveZero(int[] array) {

            //0 0 0 0
            int[] newArray = new int[array.Length];

            int index = 0;
            // 将非零元素 依次 赋值给新数组
            for (int i = 0;i<array.Length;i++) {
                if (array[i]!=0) {
                    newArray[index++] = array[i];
                }
            }
            return newArray;
        }

/*

		合并方法
		
*/
   private static int[] Merge(int[] array) {

            // eg: 2 2 0 2
            // 去零后: 2 2 2 0
            array = RemoveZero(array);
            //合并数组
            for (int i = 0; i < array.Length - 1; i++)
            {
                // 相邻相同   两个0相邻时不合并
                if (array[i] != 0 && array[i] == array[i + 1])
                {
                    array[i] += array[i + 1];
                    array[i + 1] = 0;
                }
            }
            // 为了防止这种情况出现, 所以再次去零  比如: 2 2 2 0 => 4 0 2 0
            // 4 0 2 0显然不是我们想要的  再次去零后  4 2 0 0 才正确
            array = RemoveZero(array);
            return array;
        }

/*

		上移动方法

*/

    private static int[,] MoveUp(int[,]  map) {

            // 从上到下获取每列数据,形成一维数组
            // 行 r  列 c    
            // 数组.GetLength(0)  数组行数
            // 数组.GetLength(1)  数组列数
            // 4*4 二维数组元素位置表 (下面)
            /*
             0,0  0,1  0,2  0,3
             1,0  1,1  1,2  1,3
             2,0  2,1  2,2  2,3
             3,0  3,1  3,2  3,3
             */
            int[] mergeArray = new int[map.GetLength(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[,] MoveDown(int[,]  map) {
            //--从下到上 获取列数据,形成一维数组
            //   -- 调用合并数据方法
            //   -- 将一维数组元素 还原至原列
            int[] mergeArray = new int[map.GetLength(0)];
            for (int c = 0; c < map.GetLength(1); c++)
            {
                for (int r = map.GetLength(0) -1; r >=0; r--)
                {
                    mergeArray[3-r] = map[r, c];
                }
                mergeArray = Merge(mergeArray);
                for (int r = map.GetLength(0) - 1; r >= 0; r--)
                {
                    map[r, c] = mergeArray[3 - r];
                }
            }
            return map;
        }

/*

		 左移动方法

*/
   private static int[,] MoveLeft(int[,] map) {
            //  左移  从左到右
            // 行 r  列 c
            /*
             0,0  0,1  0,2  0,3
             1,0  1,1  1,2  1,3
             2,0  2,1  2,2  2,3
             3,0  3,1  3,2  3,3
             */
            int[] mergeArray = new int[map.GetLength(0)];

            //从左到右代码
            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[,] MoveRight(int[,] map) {
            //  右移  从右到左
            // 行 r  列 c
            /*
             0,0  0,1  0,2  0,3
             1,0  1,1  1,2  1,3
             2,0  2,1  2,2  2,3
             3,0  3,1  3,2  3,3
             */
            int[] mergeArray = new int[map.GetLength(0)] ;

             从右到左代码
            for (int r = 0; r < map.GetLength(0); r++)
            {
                for (int c = map.GetLength(1) - 1; c >= 0; c--)
                {
                    mergeArray[3 - c] = map[r, c];
                }

                mergeArray = Merge(mergeArray);

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

/*

		访问二维数组方法

*/
  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();
            }
        }

我们可以在主函数方法中调试。
比如: 这里我们编写了一个二维数组, 通过调用移动方法来实现移动。

 static void Main(string[] args)
        {
            int[,] map = new int[4, 4] {
                {2,4,8,8},
                {2,4,4,4},
                {4,4,4,2},
                {2,2,4,4}
            };
            Console.WriteLine("原数组");
            PrintDoubleArray(map);
			
			Console.WriteLine("上移后");
            map = MoveUp(map);
            PrintDoubleArray(map);

            Console.WriteLine("下移后");
            map = MoveDown(map);
            PrintDoubleArray(map);

            Console.WriteLine("左移后");
            map = MoveLeft(map);
            PrintDoubleArray(map);

            Console.WriteLine("右移后");
            map = MoveRight(map);
            PrintDoubleArray(map);

            Console.ReadKey();
       }

显示的结果:

       每次移动以上次移动结果为基准。

在这里插入图片描述

感谢来访。

标签:map,mergeArray,--,元素,2048,int,Unity,数组,休闲类
来源: https://blog.csdn.net/weixin_50837893/article/details/117350773

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有