using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _2048算法
{
class Program
{
//去零
static private int[] RemoveZero(int[]array)
{
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;
}
//合并同类组
static private int[] Merge(int[]array)
{
//1.去零
array = RemoveZero(array);
//2.合并同类
for(int i=0;i<array.Length-1;i++)
{
if(array[i]==array[i+1]&&array[i]!=0)
{
array[i] += array[i + 1];
array[i + 1] = 0;
}
}
array = RemoveZero(array);
return array;
}
//将一维数组返回到二维数组中,实现上移
static private int[,] MoveUp(int[,]map)
{
int[] newMerge = new int[map.GetLength(0)];
for (int c = 0; c < map.GetLength(1); c++)
{
for (int r = 0; r < map.GetLength(0); r++)
{
newMerge[r] = map[r, c];
}
newMerge = Merge(newMerge);
for(int r=0;r<map.GetLength(0);r++)
{
map[r, c] = newMerge[r];
}
}
return map;
}
//实现下移
static private int[,] MoveDown(int[,]map)
{
int[] newMerge = new int[map.GetLength(0)];
for (int c = 0; c < map.GetLength(0); c++)
{
for (int r = 0; r < map.GetLength(1); r++)
{
newMerge[3 - r] = map[r, c];
}
newMerge = Merge(newMerge);
for(int r=0;r<map.GetLength(0);r++)
{
map[r, c] = newMerge[3 - r];
}
}
return map;
}
//实现左移
static private int[,] MoveLeft(int[,]map)
{
int[] newMerge = new int[map.GetLength(0)];
for(int c=0;c<map.GetLength(0);c++)
{
for(int r=0;r<map.GetLength(1);r++)
{
newMerge[r] = map[c, r];
}
newMerge = Merge(newMerge);
for(int r=0;r<map.GetLength(1);r++)
{
map[c, r] = newMerge[r];
}
}
return map;
}
//实现右移
static private int[,] MoveRight(int[,]map)
{
int[] newMerge = new int[map.GetLength(0)];
for (int c = 0; c < map.GetLength(0); c++)
{
for (int r = 0; r < map.GetLength(1); r++)
{
newMerge[3-r] = map[c, r];
}
newMerge = Merge(newMerge);
for (int r = 0; r < map.GetLength(1); r++)
{
map[c, r] = newMerge[3-r];
}
}
return map;
}
//打印数组的内容
static private int[,]PrintDoubleArray(int[,]map)
{
for(int i=0;i<map.GetLength(0);i++)
{
for(int j=0;j<map.GetLength(1);j++)
{
Console.Write(map[i,j]+"\t");
}
Console.WriteLine();
}
return map;
}
static void Main(string[] args)
{
int[,] map = new int[4, 4]
{
{2,2,4,8},
{2,4,4,4},
{0,8,4,0},
{2,4,0,4},
};
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.ReadLine();
}
}
}