1.代码
static void Main(string[] args)
{
int[,] Map = new int[4, 4];
Appear(Map);
Console.WriteLine("通过wasd来控制上下左右");
Console.WriteLine("*************************");
PrintOut(Map);
string player;
do
{
Console.WriteLine("*************************");
player = Console.ReadLine();
if (player == "a") PrintOut(TurnLeft(Map));
if (player == "d") PrintOut(TurnRight(Map));
if (player == "w") PrintOut(MoveUp(Map));
if (player == "s") PrintOut(MoveDown(Map));
} while (Stop(Map));
}
/// <summary>
///终止条件
/// </summary>
/// <param name="Map"></param>
/// <returns></returns>
private static bool Stop(int [,]Map)
{
for (int i = 0; i < 4; i++)
for (int j = 0; j < 4; j++)
{
if (Map[i, j] != 0) continue;
else if (Map[i, j] == 2048) return true;
else return true;
}
return false;
}
/// <summary>
/// 打印
/// </summary>
/// <param name="Map"></param>
private static void PrintOut(int[,] Map)
{
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4; j++)Console.Write(Map[i, j] + "\t");
Console.WriteLine();
}
}
/// <summary>
/// 使地图上随机位置出现2
/// </summary>
private static void Appear(int[,] map)
{
Random random = new Random();
for (int i = 0; i < 16; )
{
int x = random.Next(0, 4);
int y = random.Next(0, 4);
if (map[x, y] == 0)
{
map[x, y] = 2;
i = 16;
}
else i++;
}
}
/// <summary>
/// 将0元素移到末尾
/// </summary>
/// <param name="Queue"></param>
/// <returns></returns>
private static void MoveOutZero(int[]Queue)
{
int []NewQueue=new int[4];
int index = 0;
for (int i = 0; i < 4; i++)
if (Queue[i] != 0) NewQueue[index++] = Queue[i];
NewQueue.CopyTo(Queue, 0);
}
/// <summary>
/// 合并数据
/// </summary>
/// <param name="Queue"></param>
/// <returns></returns>
private static void CombineData(int[]Queue)
{
MoveOutZero(Queue);
for (int i = 0; i < 3; i++)
{
if (Queue[i]!=0&&Queue[i] ==Queue[i+1])
{
Queue[i] += Queue[i+1];//4 2 2 0->4 4 0 0 || 2 2 4 0->4 0 4 0
Queue[i + 1] = 0;
}
}
MoveOutZero(Queue);
}
/// <summary>
/// 左移
/// </summary>
/// <param name="Map"></param>
/// <returns></returns>
private static int[,] TurnLeft(int [,]Map)
{
int[] NewQueue = new int[4];
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4; j++) NewQueue[j] = Map[i,j];
CombineData(NewQueue);
for (int j = 0; j < 4; j++) Map[i, j] = NewQueue[j] ;
}
Appear(Map);
return Map;
}
/// <summary>
/// 右移
/// </summary>
/// <param name="Map"></param>
/// <returns></returns>
private static int[,] TurnRight(int[,] Map)
{
int[] NewQueue = new int[4];
for (int i = 0; i < 4; i++)
{
for (int j = 3; j >=0 ; j--) NewQueue[3-j] = Map[i, j];
CombineData(NewQueue);
for (int j = 3; j >= 0; j--) Map[i, 3-j] = NewQueue[j];
}
Appear(Map);
return Map;
}
/// <summary>
/// 下移
/// </summary>
/// <param name="Map"></param>
/// <returns></returns>
private static int[,] MoveDown(int[,] Map)
{/*4 0
2 4
0 2
4 4
*/
//4 2 0 4 ->4 0 2 4->4 2 4 0->0 4 2 4
int[] NewQueue = new int[4];
for (int j = 0; j < 4; j++)
{
for (int i = 3; i >=0; i--)NewQueue[3-i] = Map[i, j];
CombineData(NewQueue);
for (int i = 3; i >= 0; i--)Map[3-i, j] = NewQueue[i];
}
Appear(Map);
return Map;
}
/// <summary>
/// 上移
/// </summary>
/// <param name="Map"></param>
/// <returns></returns>
private static int[,] MoveUp(int[,] Map)
{
int[] NewQueue = new int[4];
for (int j = 0; j < 4; j++)
{
for (int i = 0; i < 4; i++) NewQueue[i] = Map[i, j];
CombineData(NewQueue);
for (int i = 0; i < 4; i++) Map[i, j] = NewQueue[i];
}
Appear(Map);
return Map;
}
2.运行示例
通过输入wasd来控制上下左右移动(不怎么会玩2048所以就稍微玩了一下哈哈哈)
3.原理
3.1定义去零的方法
3.1.1通过新建一个数组进行去零
(1)建立一个新的数组存储不是零的数(注意index++的用法),再将新数组返回原数组中。
(2)最后一行NewQueue.CopyTo(Queue,0)为了实现控制空返回值,实现直接对原数组的更改操作。
3.1.2不用新建数组实现的去零操作
private static void MoveOutZero(int[]Queue)
{
//int []NewQueue=new int[4];
//int index = 0;
//for (int i = 0; i < 4; i++)
// if (Queue[i] != 0) NewQueue[index++] = Queue[i];
//NewQueue.CopyTo(Queue, 0);
int index = 0;
int temp;
for (int i =0;i< 4; i++)
if (Queue[i] != 0)
{
temp = Queue[i];
Queue[i] = 0;
Queue[index] = temp;
++index;
}
}
通过另起的索引控制数组将不为零的数顺序保留且不用新建个数组就能实现功能。
3.2合并数据的方法
(1)去零
(2)相邻相同则合并
将去零好的数组进行相邻两数相加,之后继续去零
(3)去零
3.3上移(例)
(1)从上到下获取列数据,形成一维数组
(2)调用合并数据方法
(3)将一维数组元素还原至原列
3.4下移(例)
跟上移类似,但是获取数据注意从下到上获取数据形成一位数组