2048的核心算法的初步实现
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _20200401_2048
{
? ? class Program
? ? {
? ? ? ? #region
? ? ? ? //**********************2048核心算法***********************
? ? ? ? /*最有代表性的,三消游戲
? ? ? ? ?* 上移
? ? ? ? ?* --從上到下獲取列數據,形成一維數組
? ? ? ? ?* 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元素移動到末尾
? ? ? ? ?* --將一維數組 還原至原列
? ? ? ? ?*?
? ? ? ? ?* 下移1.0
? ? ? ? ?* ?--從上到下獲取列數據,形成一維數組
? ? ? ? ?* 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 ?每次只合并一次
? ? ? ? ?* 2 0 0 2 ==> 2 0 2 0
? ? ? ? ?* --合并數據
? ? ? ? ?* ? --去零:將0元素移動到末尾
? ? ? ? ?* ? --相鄰相同,則合并(將前一個元素累加到前一個元素上,后一個元素)
? ? ? ? ?* ? --去零,將0元素移動到末尾
? ? ? ? ?* --將一維數組 還原至原列
? ? ? ? ?*?
? ? ? ? ?* 下移2.0
? ? ? ? ?* --從下到上獲取列數據,形成一維數組
? ? ? ? ?* --合并數據
? ? ? ? ?* ? --去零:將0元素移動到末尾
? ? ? ? ?* ? --相鄰相同,則合并(將前一個元素累加到前一個元素上,后一個元素)
? ? ? ? ?* ? --去零,將0元素移動到末尾
? ? ? ? ?* --將一維數組 還原至原列
? ? ? ? ?*?
? ? ? ? ?*?
? ? ? ? ?* 1.定義去零的方法(針對一維數組):將0元素移動到末尾
? ? ? ? ?* 2.合并數據的方法
? ? ? ? ?* ? --去零:將0元素移動到末尾
? ? ? ? ?* ? --相鄰相同,則合并(將后一個元素累加到前一個元素上,前一個元素)
? ? ? ? ?* ? --去零,將0元素移動到末尾
? ? ? ? ?* 3.上移
? ? ? ? ?* ?--從上到下獲取列數據,形成一維數組
? ? ? ? ?* ?--調用合并數據方法
? ? ? ? ?* ?--將一維數組元素還原至原列
? ? ? ? ?* ?4.下移
? ? ? ? ?* ?--從下到上獲取數據
? ? ? ? ?* ?--
? ? ? ? ?* ?5.左移
? ? ? ? ?* ?6.右移
? ? ? ? ?*/
? ? ? ? #endregion
? ? ? ? static Random random = new Random();
? ? ? ? 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 }
? ? ? ? ? ? };
? ? ? ? ? ? Console.WriteLine("原數組");
? ? ? ? ? ? PrintDouble(map);
? ? ? ? ? ? map = UpMove(map);
? ? ? ? ? ? Console.WriteLine("上移動");
? ? ? ? ? ? PrintDouble(map);
? ? ? ? ? ? Console.WriteLine("下移動");
? ? ? ? ? ? map = DownMove(map);
? ? ? ? ? ? PrintDouble(map);
? ? ? ? ? ? Console.WriteLine("左移動");
? ? ? ? ? ? map = LeftMove(map);
? ? ? ? ? ? PrintDouble(map);
? ? ? ? ? ? Console.WriteLine("右移動");
? ? ? ? ? ? map = RightMove(map);
? ? ? ? ? ? PrintDouble(map);
? ? ? ? }
? ? ? ? static void PrintDouble(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();
? ? ? ? ? ? }
? ? ? ? ? ? Console.ReadLine();
? ? ? ? }
? ? ? ? static int[] RemoveZero(int[] array)
? ? ? ? {
? ? ? ? ? ? int[] temp = new int[array.Length];
? ? ? ? ? ? int index = 0;
? ? ? ? ? ? for (int j = 0; j < 4; j++)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? if (array[j] != 0)
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? //賦值成功之后,才對temp[i]進行加1,不成功的話一直在array[j]循環,知道不為0的值出現
? ? ? ? ? ? ? ? ? ? temp[index++] = array[j];
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? ? ? return temp;
? ? ? ? }
? ? ? ? static int[] MergeNum(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+1];
? ? ? ? ? ? ? ? ? ? array[i + 1] = 0;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? ? ? array = RemoveZero(array);
? ? ? ? ? ? return array;
? ? ? ? }
? ? ? ? static int[,] DownMove(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 = MergeNum(mergeArray);
? ? ? ? ? ? ? ? for (int r = map.GetLength(0) - 1; r >= 0; r--)
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? map[r, c] = mergeArray[3 - r];
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? ? ? return map;
? ? ? ? }
? ? ? ? static int[,] UpMove(int[,] map)
? ? ? ? {
? ? ? ? ? ? //向上移動
? ? ? ? ? ? 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 = MergeNum(mergeArray);
? ? ? ? ? ? ? ? for (int r = 0; r < map.GetLength(0); r++)
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? map[r, c] = mergeArray[r];
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? ? ? return map;
? ? ? ? }
? ? ? ? static int[,] RightMove(int[,] map)
? ? ? ? {
? ? ? ? ? ? /*
? ? ? ? ? ? ?* 0,0 ? 0,1 ? 0.2 ? 0.3
? ? ? ? ? ? ?* 1.0 ? 1.0 ? 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(1)];
? ? ? ? ? ? for (int r = 0; r < map.GetLength(0); r++)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? for (int c = map.GetLength(0) - 1; c >= 0; c--)
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? mergeArray[3 - c] = map[r, c];
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? mergeArray = MergeNum(mergeArray);
? ? ? ? ? ? ? ? for (int c = map.GetLength(0) - 1; c >= 0; c--)
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? map[r, c] = mergeArray[3 - c];
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? ? ? return map;
? ? ? ? }
? ? ? ? static int[,] LeftMove(int[,] map)
? ? ? ? {
? ? ? ? ? ? /*
? ? ? ? ? ? ?* 0,0 ? 0,1 ? 0.2 ? 0.3
? ? ? ? ? ? ?* 1.0 ? 1.0 ? 1.2 ? 1.3
? ? ? ? ? ? ?* 2.0 ? 2.1 ? 2.2 ? 2.3
? ? ? ? ? ? ?* 3.0 ? 3.1 ? 3.2 ? 3.3
? ? ? ? ? ? ?*/
? ? ? ? ? ? //先取出第0行的每一列的數據,map[0,c] ?最后再進行所有行的循環
? ? ? ? ? ? int[] mergeArray = new int[map.GetLength(1)];
? ? ? ? ? ? for (int r = 0; r < map.GetLength(1); r++)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? for (int c = 0; c < map.GetLength(0); c++)
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? mergeArray[c] = map[r, c];
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? mergeArray = MergeNum(mergeArray);
? ? ? ? ? ? ? ? for (int c = 0; c < map.GetLength(0); c++)
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? map[r, c] = mergeArray[c];
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? ? ? return map;
? ? ? ? }
? ? }
}
?
總結
以上是生活随笔為你收集整理的2048的核心算法的初步实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MATLAB印刷体汉字识别
- 下一篇: VIM和sed 替换字符串方法