博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# 控制台实现2048小游戏的核心代码
阅读量:3902 次
发布时间:2019-05-23

本文共 3102 字,大约阅读时间需要 10 分钟。

本文写给新手看,因为我自己也是菜鸡哈哈

完成一个程序,很重要的一点是,首先要系统地分析清楚需求,再写代码这样就简单许多
那么2048的核心就是两点:
(1)移动(4个方向)
(2)合并
首先我们来按照上移来分析合并,由于每列之间是没有关联的,我们假设第一列由上到下是2,0,2,0,那么我们希望最终得到4,0,0,0,那么第一步我们就可以去0,即将0元素至末尾,即变成2,2,0,0,之后相邻相加得到4,0,0,0。
那如果是2,2,2,2呢,相邻相加得到4,0,4,0,再去0得到4,4,0,0.
所以合并操作有3步:
(1)去0 (2)相邻相加 (3)去0
关于去0操作,我们可以创建一个新的数组,依次存储一维数组中的非0元素:

static void Remove0(int[] arr)        {            int[] newArr = new int[4];            int count=0;            for(int i=0;i<4;i++)            {                if (arr[i] != 0)                    newArr[count++] = arr[i];            }            newArr.CopyTo(arr,0);        }

注意:由于依次存储非0元素,所以for中的i++写在对新数组的赋值中,只有赋值成功时+1.

关于合并的代码:

//合并        static void Merge(int[] arr)        {            Remove0(arr);            for(int i=0;i<3;i++)            {                if((arr[i]!=0)&&(arr[i]==arr[i+1]))                {                    arr[i] *= 2;                    arr[i + 1] = 0;                }            }            Remove0(arr);        }

去0操作后,用for循环从数组第一个元素(列最上面的元素)判断,若不为0则判断其是否与相邻元素相等,若相等则×2,然后将相邻元素置0,最后再执行一次去0操作。

上移的逻辑为:
(1)从上到下分别读取4列列数据(当作一维数组
(2)去0且合并,去0
(3) 再将新的一维数组从第一个到最后一个(列中从上到下)归还
上移的代码:

//上移        static void MoveUp(int[,] map)        {            for (int c = 0; c < 4; c++)            {                int[] arr = new int[4];                for (int r = 0; r < 4; r++)                {                    arr[r] = map[r, c];                }                Merge(arr);                for (int r = 0; r < 4; r++)                {                    map[r, c] = arr[r];                }            }        }

由于从第一列开始(或第四列),所以列循环在外层,行循环在内层,列不动改变行则读取了该列数据,例如第一列(0,0),(1,0),(2,0),(3,0)所以行循环在内层,下移操作也是一样,列循环在外层,行循环在内层。左右移动则相反,列循环在内层,行循环在外层。

arr则是创建的新一维数组,map是2048的二维数组,从上到下读取完后,对其执行去0合并去0,再归还,map[r,c]=arr[r](条件一样只是反过来写)。
下移,左移,右移也是大同小异的,在下面附上代码:

//下移        static void MoveDown(int[,] map)        {            for (int c = 0; c < 4; c++)            {                int[] arr = new int[4];                for (int r = 3; r >=0; r--)                {                    arr[3-r] = map[r, c];                }                Merge(arr);                for (int r = 3; r >=0; r--)                {                    map[r, c] = arr[3-r];                }            }        }        //左移        static void MoveLeft(int[,] map)        {            for (int r = 0; r < 4; r++)            {                int[] arr = new int[4];                for (int c = 0; c < 4; c++)                {                    arr[c] = map[r, c];                }                Merge(arr);                for (int c = 0; c < 4; c++)                {                    map[r, c] = arr[c];                }            }        }        //右移        static void MoveRight(int[,] map)        {            for (int r = 0; r < 4; r++)            {                int[] arr = new int[4];                for (int c = 3; c >=0; c--)                {                    arr[3-c] = map[r, c];                }                 Merge(arr);                for (int c = 3; c >= 0; c--)                {                    map[r, c] = arr[3-c];                }            }        }

欢迎大家交流。

转载地址:http://oqyen.baihongyu.com/

你可能感兴趣的文章
java图书管理系统
查看>>
C#图书管理系统
查看>>
C#酒店管理系统
查看>>
你对ArrayList了解多少?
查看>>
《从Paxos到ZooKeeper分布式一致性原理与实践》学习知识导图
查看>>
Java基础面试题(一) (2020持续更新)
查看>>
JAVA人事管理系统
查看>>
Dubbo面试题(关注小R持续更新)
查看>>
JAVA仿微博系统(JAVA毕业设计含源码和运行教程)
查看>>
24BITBMP位图的文件结构及创建
查看>>
如何在自定义控件中获得width和height?
查看>>
Android UI开发专题之界面设计【基础API】
查看>>
ejarmaker: jar 、java类的加密工具
查看>>
配置NFS实现Linux服务器之间的文件共享
查看>>
PostgreSQL连接池pgbouncer的使用
查看>>
Kryo序列化进阶学习: 加密数据
查看>>
swift 3.0 数组赋值
查看>>
用C#通过888-TT打印中文标签
查看>>
sendmail 出现 My unqualified host name的解决办法
查看>>
彻底解决lazarus安装组件后烦人的编译时单元找不到的问题!
查看>>