核心逻辑:
using System;
namespace VSc02
{
class Program
{
static void Main()
{
int[,] arr ={
{4,2,0,2},
{2,0,2,0},
{0,0,0,2},
{2,0,2,2}
};
PrintArr(arr);
MoveUp(arr);
Console.WriteLine("----------------");
PrintArr(arr);
}
//格式化打印二维数组
private static void PrintArr(int[,] arr){
for(int i=0;i<arr.GetLength(0);i++){
for(int j=0;j<arr.GetLength(1);j++){
Console.Write(arr[i,j]+"\t");
}
Console.WriteLine();
}
}
//上移函数
private static void MoveUp(int[,] resaveArr)
{
int[] temp = new int[4];
for (int i = 0; i < resaveArr.GetLength(1); i++)
{
for (int j = 0; j < resaveArr.GetLength(0); j++)
{
temp[j] = resaveArr[j, i];
}
AddLine(temp);
for(int k=0 ;k< temp.Length;k++){
resaveArr[k,i]=temp[k];
}
}
}
//下移函数
private static void MoveDown(int[,] resaveArr)
{
int[] temp = new int[4];
for (int i = 0; i < resaveArr.GetLength(1); i++)
{
for (int j = 0; j < resaveArr.GetLength(0); j++)
{
temp[j] = resaveArr[3-j, i];
}
AddLine(temp);
for(int k=0 ;k< temp.Length;k++){
resaveArr[3-k,i]=temp[k];
}
}
}
//左移函数
private static void MoveLeft(int[,] resaveArr)
{
int[] temp = new int[4];
for (int i = 0; i < resaveArr.GetLength(0); i++)
{
for (int j = 0; j < resaveArr.GetLength(1); j++)
{
temp[j] = resaveArr[i, j];
}
AddLine(temp);
for(int k=0 ;k< temp.Length;k++){
resaveArr[i,k]=temp[k];
}
}
}
//右移函数
private static void MoveRight(int[,] resaveArr)
{
int[] temp = new int[4];
for (int i = 0; i < resaveArr.GetLength(0); i++)
{
for (int j = 0; j < resaveArr.GetLength(1); j++)
{
temp[j] = resaveArr[i, 3-j];
}
AddLine(temp);
for(int k=0 ;k< temp.Length;k++){
resaveArr[i,3-k]=temp[k];
}
}
}
//排序函数,将为0的值靠后,非0的值提前
private static void RemvoeZero(int[] arr)
{
int index = 0;
int[] arr0 = new int[4];
foreach (int each in arr)
{
if (each != 0) arr0[index++] = each;
}
arr0.CopyTo(arr,0);
}
//数组中相邻的同样的数相加的方法
private static void AddLine(int[] arr){
RemvoeZero(arr);
for (int i = 0; i < arr.Length-1; i++)
{
if(arr[i]!=0 && arr[i]==arr[i+1]){
arr[i] +=arr[i+1];
arr[i+1]=0;
}
}
RemvoeZero(arr);
}
}
}