游戏2048的核心算法c#版本的实现

游戏2048的核心算法c#版本的实现,第1张

概述接触游戏有一段时间了,也写了一些东西,效果还不错,今天没事,我就把2048 c# 版本的实现贴出来,代码已经测试过,可以正常、完美运行。当然了,在网上有很多有关2048的实现方法,但是没有提出到类里面

    接触游戏有一段时间了,也写了一些东西,效果还不错,今天没事,我就把2048 c# 版本的实现贴出来,代码已经测试过,可以正常、完美运行。当然了,在网上有很多有关2048的实现方法,但是没有提出到类里面,只是写的测试代码,我在这里已经完全提到类里面,核心类和核心方法都经过测试,没有问题。由于本人学习有漏,或者不足,也请大家批评指正,大家共同进步。

      该文章分为三个部分,我们分门别类说的,大家也会很清楚。目录如下:

    第一部分:图片展示,最开始,我还是先把程序的运行效果贴出来,大家有一个初步感受。

    第二部分:代码的前端部分,因为我这个程序就是一个在控制台中运行的程序,没有界面。但是有些 *** 作需要在控制台中 *** 作,这部分代码在控制台中。

    第三部分:2048核心的类和辅助类型,所有核心算法和实现都在这里,都已经封装了方法,直接调用就可以。

    其实这三个部分很简单,每个部分都有自己的职责,废话不多说了,直接上代码。

    一、2048 在控制台中的运行效果(主要以贴图为主。)

      1、数据初始化

        


      这是程序第一次执行的效果,数据刚刚完成初始化。

      2、 *** 作开始,点击键盘的 a 字母代表向做移动,分为两张图,移动前和移动后的效果。

        左移前
        

        左移后
        



       3、点击键盘的 D 字符代表向右移动,分为两个图片,分别是移动前和移动后。

          移动前
          


          移动后
          



        4、点击键盘的 w 字符代表向上移动,分为两个图片,分别是移动前和移动后。
          移动前

          

          移动后
          



        5、点击键盘的 s 字符代表向下移动,分为两个图片,分别是移动前和移动后。
          移动前

          

          移动后
          



    二、在控制台中控制逻辑和一些辅助方法,逻辑很简单,就不多说了,直接上代码。

 

 1 GameCoreManager game = new GameCoreManager(5); 2  3             game.Initail(); 4  5             Console.Writeline("原始数组:" 6             PrintArray(game.DataContainer); 7             Console.Writeline(); 8  9             while (true)10             {11                 if (game.CalculateEmptyElements(game.DataContainer).Count <= 012                 {13                     Console.Writeline(游戏结束14                     break;15                 }16                 switch (Console.Readline())17 18                     case w:19                         game.Move(Direction.Up);20                         21                     s22                         game.Move(Direction.Down);23                         24                     a25                         game.Move(Direction.left);26                         27                     d28                         game.Move(Direction.Right);29                         30                     exit31                         32 33                 if (game.IsChange)34 35                     game.GeneraterandomNumber();36                     PrintArray(game.DataContainer);37 38             }


         以上代码就是放在控制台的 Main 方法中药执行的代码。

         这个代码主要适用于打印二维数组的,逻辑不复杂,用于在控制台中显示移动效果。
        

 1 /// <summary> 2         /// 打印二维数组在控制台上。 3         </summary> 4         <param name="array">要打印数据的数组。</param> 5         private static voID PrintArray(int[,] array)        {            Console.Clear(); 8             if (array == null || array.Length <=  9 10                 Console.Writeline(没有任何元素可以打印。11             }12 13             for (int row = 0; row < array.GetLength(0); row++14 15                 int column = 0; column < array.GetLength(1); column++16 17                     Console.Write(array[row,column]+\t18                 Console.Writeline();20 21         }


        在控制台中的代码就是这些,是不是很简单,其实不是很复杂,接下来我们看看核心类的实现。


    三、2048 核心类 GameCoreManager 的实现,里面有完整的备注,所以我就不多说了。大家可以直接使用,测试。
      

  1   2      游戏核心算法的管理器类型,该类型定义 2048 游戏的核心算法。  3       4     public sealed class GameCoreManager  5     {  6         #region 实例字段  7   8           9  10         #endregion 11  12         #region 构造函数 13  14          15          初始化 GameCoreManager 类型的新实例,数据容器维度默认值:4. 16          17         public GameCoreManager() : this(4) { } 18  19          20          通过制定的数据维度初始化 GameCoreManager 类型的新实例。 21          22         <param name="capacity">数据容量。 23         public GameCoreManager( capacity) 24  25             if (capacity <= 0 || capacity >= 32 26  27                 throw new ArgumentNullException(dimensional is null. 28  29             DataContainer = new [capacity,capacity]; 30         } 31  32          33  34         #region 实例属性 35  36          37          获取数据 38          39         int[,] DataContainer { get => _dataContainer; set => _dataContainer = value; } 40  41          42  43         #region 实例接口方法 44  45          46          初始化游戏数据。 47          48         voID Initail() 49  50             int length = DataContainer.GetLength(0) / 2 + DataContainer.GetLength(0) % 2 51             int i = 0; i < length; i++ 52  53                 GeneraterandomNumber(); 54  55  56  57          58          数据移动。 59          60         <param name="direction">要移动的方向 61          Move(Direction direction) 62  63             //判断原数组是否发生了变化。 64             记录原数组。 65             int[DataContainer.GetLength(0),DataContainer.GetLength(1)]; 66             Array.copy(DataContainer,destinationArray,DataContainer.Length); 67             IsChange = false 68  69              (direction) 70  71                 case Direction.Up: 72                     MoveUp(); 73                      74                  Direction.Down: 75                     MoveDown(); 76                      77                  Direction.left: 78                     Moveleft(); 79                      80                  Direction.Right: 81                     MoveRight(); 82                      83  84  85             比较现在的数组和以前的数组比较 86             0; row < DataContainer.GetLength( 87  88                 0; column < DataContainer.GetLength( 89  90                     if (DataContainer[row,column] != destinationArray[row,column]) 91                     { 92                         IsChange =  93                         return 94                     } 95  96  97  98  99         100          获取或者设置数组元素是否发生变动。true 表示发生变动,false 表示没有变动。101         102         bool IsChange { get; set; }103 104         105          计算空元素的个数,并保存元素的索引位置。106         107         <param name="sourceArray">要处理的二维数组。108         <returns>返回保存空元素索引位置的列表对象。</returns>109         public IList<position> CalculateEmptyElements(110 111             IList<position> elements = new List<position>(DataContainer.GetLength(0) * DataContainer.GetLength());112             if (sourceArray == null || sourceArray.Length <= 113 114                  elements;115 116 117             0; row < sourceArray.GetLength(118 119                 0; column < sourceArray.GetLength(120 121                     if (sourceArray[row,column] == 122 123                         elements.Add(new position(row,column));124 125 126 127             128 129 130         131          随机生成数字元素填充空的数组元素。132         133          GeneraterandomNumber()134 135             var List = CalculateEmptyElements(this.DataContainer);136             if (List.Count > 137 138                 Random random =  Random();139                 var position = List[random.Next(,List.Count)];140                 DataContainer[position.Row,position.Column] = random.Next(0,10) == 4 ? 4 : 141 142 143 144         145 146         #region 实例私有方法(核心算法)147 148         149          将数组中的为 0 的元素移动到数组最后面。[1,2],结果为【1,2,0】150         151         要处理的数组。152         voID MoveZeroTolast([] array)153 154             155 156                 157 158 159             int[] myarray = [array.Length];160 161             int index = 162             0; i < array.Length; i++163 164                 if (array[i] != 165 166                     myarray[index++] = array[i];167 168 169             通过引用修改元素才可以,修改引用对外界没有影响。170             myarray.copyTo(array,1)">171 172 173         174          合并数组中相邻相同的数字元素,后一个元素清零。[2,2],结果为【4,1)">175         176         177         voID MergeSameNumber(178 179             180 181                 182 183 184             MoveZeroTolast(array);2,0185 186             0; i < array.Length - 1; i++187 188                 0 && array[i] == array[i + ])189 190                     array[i] += array[i + ];191                     array[i + 1] = 192 193 194 195             4,1)">196 197             MoveZeroTolast(array);198 199 200         201          向上移动数据。202         203          MoveUp()204 205             从上往下取数据。206             if (DataContainer == null || DataContainer.Length <= 207 208                 209 210 211             int[] tempArray = 212 213             214 215                 216 217                     tempArray[row] = DataContainer[row,column];218 219 220                 MergeSameNumber(tempArray);221 222                 223 224                     DataContainer[row,column] = tempArray[row];225 226 227 228 229         230          向下移动数据。231         232          MoveDown()233 234             从下往上取235             236 237                 238 239 240             241 242             243 244                 int row = DataContainer.GetLength(0) - 1; row >= 0; row--245 246                     tempArray[DataContainer.GetLength(1 - row] =247 248 249 250 251                 252 253                     DataContainer[row,column] = tempArray[DataContainer.GetLength(1 - row];254 255 256 257 258         259          向左移动数据。260         261          Moveleft()262 263             264 265                 266 267             从左往右268 269             270 271             0; i < DataContainer.GetLength(0); i++272 273                 int j = 0; j < DataContainer.GetLength(1); j++274 275                     tempArray[j] = DataContainer[i,j];276 277 278 279 280                 281 282                     DataContainer[i,j] = tempArray[j];283 284 285 286 287         288          向右移动数据。289         290          MoveRight()291 292             293 294                 295 296 297             从右向左取298 299             { 2,4,8 },8300             301             { 0,8,0 },1)">302             303 304             305 306             1); i++307 308                 int j = DataContainer.GetLength(1) - 1; j >= 0; j--309 310                     8,2311                     tempArray[DataContainer.GetLength(1 - j] =312 313 314                 315 316 317                 318 319                     DataContainer[i,j] = tempArray[DataContainer.GetLength( j];320 321 322         }        323 324         325     }

 

     另外,还有两个枚举类型,代码很简单,直接贴代码了。

 1      2      元素的坐标位置。 3      4     struct position 5  6          7          获取或者设置元素的行坐标。 8          9         int Row { 10 11         12          获取或者设置元素的列坐标。13         14         int Column { 15 16         17          通过行坐标、列坐标初始化 position 对象实例。18         19         <param name="row">元素的行坐标。20         <param name="column">元素的列坐标。21         public position(int row, column)23             if (row >= 0 && column >= 24 25                 this.Row = row;26                 this.Column = column;27 28             else29 30                 parameter is null.31 33     }34 35     36      移动的方向。37     38     enum Direction39 40         41          向上移动42         43         Up,1)">44 45         46          向下移动47         48         Down,1)">49 50         51          向左移动52         53         left,1)">54 55         56          向右移动57         58         Right59     }

 


    这就是2048 核心类的实现,代码都有备注,其实,逻辑也不复杂,大家看也是可以看得懂的,只是需要点耐心。

    文章就到此为止了,这是有关2028的核心算法,我发的代码都是经过测试的,大家可以拿过去直接使用,修改和测试。而且代码都很完整,所以我就没有把源码贴出来。

总结

以上是内存溢出为你收集整理的游戏2048的核心算法c#版本的实现全部内容,希望文章能够帮你解决游戏2048的核心算法c#版本的实现所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1213966.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存