enum Direction
{
Up,
Down,
Lelf,
Right
}struct location
{publicint r, c;}
游戏界面类
classGameInterface{privateint[,] copyMap;publicint[,] CopyMap
{get{return copyMap;}set{
copyMap =value;}}publicGameInterface(){
copyMap =newint[4,4];}publicstaticvoid Show (int[,] map){
Console.WriteLine("-------------------------");for(int r =0; r < map.GetLength(0); r++){for(int c =0; c < map.GetLength(1); c++)
Console.Write("|{0,5}", map[r, c]==0?"": map[r, c]);
Console.WriteLine("|\r\n-------------------------");}}publicboolDifferentMap(int[,] map){for(int r =0; r < map.GetLength(0); r++)for(int c =0; c < map.GetLength(1); c++)if(copyMap[r, c]!= map[r, c]){returntrue;}returnfalse;}publicbool IsWin (){for(int r =0; r < copyMap.GetLength(0); r++)for(int c =0; c < copyMap.GetLength(1); c++)if(copyMap[r, c]==2048)returntrue;returnfalse;}}
游戏移动类(核心代码)
classMoveDirection{privateint[,] map;privateint[] mergeMap;privateint[] removeMap;private List<location> emptyElement;private location loc;privateRandom random;publicint[,] Map
{get{return map;}}publicint EmptyCount{get;set;}publicMoveDirection(){this.map =newint[4,4];this.mergeMap =newint[4];this.removeMap =newint[4];this.emptyElement =newList<location>();this.loc =newlocation();this.random =newRandom();this.EmptyCount =16;}publicvoidMove(Direction dir){switch(dir){case Direction.Up:MoveUp();break;case Direction.Down:MoveDown();break;case Direction.Lelf:MoveLelf();break;case Direction.Right:MoveRight();break;}}publicvoidAddNumer(){GetEmptyElement();int number = random.Next(0, emptyElement.Count);
loc = emptyElement[number];
map[loc.r, loc.c]= random.Next(0,10)==1?4:2;
EmptyCount--;}privatevoidMoveZero(){
Array.Clear(removeMap,0, removeMap.Length);int index =0;for(int i =0; i < mergeMap.Length; i++)if(mergeMap[i]!=0)
removeMap[index++]= mergeMap[i];
removeMap.CopyTo(mergeMap,0);}privatevoidMerge(){MoveZero();for(int i =0; i < mergeMap.Length -1; i++){if(mergeMap[i]!=0&& mergeMap[i]== mergeMap[i +1]){
mergeMap[i]+= mergeMap[i +1];
mergeMap[i +1]=0;
EmptyCount++;}}MoveZero();}privatevoidMoveUp(){for(int c =0; c < map.GetLength(1); c++){
Array.Clear(mergeMap,0, mergeMap.Length);for(int r =0; r < map.GetLength(0); r++)
mergeMap[r]= map[r, c];Merge();for(int r =0; r < map.GetLength(0); r++)
map[r, c]= mergeMap[r];}}privatevoidMoveDown(){for(int c =0; c < map.GetLength(1); c++){
Array.Clear(mergeMap,0, mergeMap.Length);for(int r = map.GetLength(0)-1, ur =0; r >=0; r--, ur++)
mergeMap[ur]= map[r, c];Merge();for(int r = map.GetLength(0)-1, ur =0; r >=0; r--, ur++)
map[r, c]= mergeMap[ur];}}privatevoidMoveLelf(){for(int r =0; r < map.GetLength(0); r++){
Array.Clear(mergeMap,0, mergeMap.Length);for(int c =0; c < map.GetLength(1); c++)
mergeMap[c]= map[r, c];Merge();for(int c =0; c < map.GetLength(1); c++)
map[r, c]= mergeMap[c];}}privatevoidMoveRight(){for(int r =0; r < map.GetLength(0); r++){
Array.Clear(mergeMap,0, mergeMap.Length);for(int c = map.GetLength(1)-1, uc =0; c >=0; c--, uc++)
mergeMap[uc]= map[r, c];Merge();for(int c = map.GetLength(1)-1, uc =0; c >=0; c--, uc++)
map[r, c]= mergeMap[uc];}}privatevoidGetEmptyElement(){
emptyElement.Clear();for(int r =0; r < map.GetLength(0); r++)for(int c =0; c < map.GetLength(1); c++)if(map[r, c]==0){
loc.r = r; loc.c = c;
emptyElement.Add(loc);}}}