需求
- 上移
* --从上到下 获取列数据,形成一维数组
* --合并数据
* --去零:将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元素移到末尾
* --将一维数组元素还原至原列 - 左移
- 右移
编码
- 定义去零方法(针对一维数组):将0元素移到末尾
- 合并数据方法(针对一维数组)
* --去零:将0元素移到开头
* --相邻相同,则合并(将前一个元素累加到后一个元素上,前一个元素清零)
* --去零:将0元素移到开头 - 上移
* --从上到下获取数据列,形成一维数组
* --调用合并数据方法
* --将一维数组元素还原至原列 - 下移
* --从下到上获取数据列,形成一维数组
* --调用合并数据方法
* --将一维数组元素还原至原列 - 左移
- 右移
代码实现
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)