制作2048游戏

下载 :: Game 2048 with Animation

今天的任务是给2048加上动画。别看用js的transition就搞定的事情,用GDI来实现是有难度的。

2048的游戏实现机制

虽然代码抄自gabrielecirulli/2048: A small clone of 1024 (https://play.google.com/store/apps/details?id=com.veewo.a1024) ,但是将js代码用lua去实现还是多费了点工夫。当然两者都是动态语言,坑比较少。

现在来讲下2048是怎样实现的。

首先,我们看界面,它就是个4x4的方块,显而易见,用4x4数组或1x16数组就能搞定。那么数组里面存什么呢?我们分析2048中的数值:空方格、2的幂次数值方块,就两种。解决方案是只要存int——空方格对应0;2的幂就对应它的幂。所以:空=0,2=1,以此类推,2048=11。因此数据结构非常简单,随便用伪代码表示:[2048-Table] = array<int>(4x4)。

知道了数据结构,那么接下来就是算法,这是难的部分。

算法需要解决一些问题:

  • 处理每次的上下左右动作。这个是核心功能,有几个方面。一、判断是否要合并;二、不合并的话就将方块向前推到边上,直到推不动为止;三、随机位置增加新方块
  • 确定当前是否为死局。这个简单,只要遍历4x4数组,看是否存在相邻的连续数值的方块

下面解决主要问题。

一、判断是否要合并

假如当前按下Left键,方块向左移动,假如某行是“2-2-4-4”,那么结果是“4-8-0-0”,因为只需要合并相邻的方块;若是“2-2-2-2”,结果是“4-4-0-0”,不会是“8-0-0-0”,这是由算法决定的。

那么问题变简单了,正如memcpy所做的,如果memcpy(src,dst),其中src和dst有交界部分。若src在dst前面,那么应该从后向前复制,反之是从前向后。

同理,方向为Left时,对于“2-2-4-4”,是从左向右遍历,先确定“2-2”,将其换为4,变成“4-0-4-4”,然后处理右边两个4。此时,左起第一个4其实已经合并过了,将其排除,所以当前只要处理“0-4-4”,那么再将当中的4移至最左,成为“4-0-4”,再处理第二个4,由于第一个4尚未合并过,因此两个4再进行合并,成为8。最后结果“4-8-0-0”。

整理一个过程:Left,2-2-4-4,加[]表示已合并过,无需再次合并。2-2-4-4 => [4]-0-4-4 => [4]-4-0-4 => [4]-[8]-0-0。

二、对不能合并的方块进行移动

如“2-4-6-0”,方向Right,从右向左遍历。过程为:2-4-6-0 => 2-4-0-6 => 2-0-4-6 => 0-2-4-6。解释略。

三、随机增加新方块

增加新方块,添加2和4的概率比为9比1,用随机数实现。

然后需要寻找空位添加,这简单,遍历4x4数组,找到数值为0的将其位置记录,接着随机抽位子。

---------------------------------------

2048的动画实现机制

花了一天实现了方块的移动,也有难度。

项目相关:布局只支持新增GUI对象,不支持删除,因此需要一开始就创建好。

思路:原4x4中每个方块对应一个GUI对象(记作origin),另外再新建4x4的GUI对象(记作anime),用于实现动画。

例:当前2-2-4-4,方向Right,结果为0-0-4-8。设计动画,假设[n]代表从左起第n个位置。

方块移动:[1,2,3,4] => [3,3,4,4]。那么当第一个2(位置为[1])进行移动时,这时应该将origin方块隐藏,将替身anime方块代替origin位置并显现,随后播放动画,将anime的位置从[1]逐渐移动到[3],移动完毕后,主角origin上场,替身anime下场。

总结一下:当origin需要移动时,召唤替身anime到指定位置,替身移动,最后替身消失,origin在替身消失的地方出现。替身移动其实就是插值思想。

另外,为防止动画没有播放完程序仍接受游戏指令导致逻辑乱套,因此在动画播放期间用户输入无效,不然动画就会出问题。

======我是分割线======

02/23更新

写在前面

经过坚持不懈的努力,第一个游戏已经制作完成。

游戏逻辑全部用Lua实现,发挥Lua的特长。

前期的辛苦,到第一个游戏完成时,已经烟消云散了,想必制作游戏的人们都是这个心情吧。

游戏简介

2048这个游戏很经典,当前它的游戏算法我是抄的:),因为没足够时间去思考,但是它的算法难度不算太高,我觉得没有Popstar implementation(MFC)难写(当然Popstar我也写过才敢这么说)。

不过,由于游戏框架功能有限,2048中的动态滑动效果尚未实现,降低了美观度。

那么搭建这个游戏的框架所具备的最小功能有哪些呢?

  1. 交互层(Win32):拦截Win32消息,处理好程序与系统的交互。
  2. 逻辑层(Lua):根据交互层传来的消息,实现界面或游戏逻辑,保证程序正常运行。
  3. 渲染层(Direct2D):听从逻辑层命令,进行窗口的渲染。

从上面可以看出:Lua将交互层与渲染层相解耦,是十分重要的胶水语言。

这样做的好处有哪些?

  1. 脚本语言的优势,如lambda函数、动态类型、yield等
  2. 只需修改脚本,无需再次编译程序
  3. 有出错提示,便于debug
  4. 垃圾回收
  5. 模块化

初次使用Lua就体会到它强大之处,在意料之中。

实现思路

总结一下编写简单的游戏框架并用其实现2048整个过程中的问题。

  • Lua的坑。由于对它不熟悉,走了些弯路。Lua中统一用double保存整型与浮点,所以输出整数就要进行转换。再者就是类的问题,目前的问题是切换场景后,文本框的内容没有重置。
  • D2D的坑。D2D的文档比较少,学着费劲。要注意RenderTarget无效问题,无效后必须马上重新创建,连带之前的画刷、图片、文字等对象要全部重建。
  • Win32的坑。这已经见怪不怪了,一个字,略。

那么整体的思路是:

  1. 交互层,将Win32消息进行封装,对每个消息调用Lua进行处理。这里比较重要的是窗口改变大小问题,将大小改变时,UI也要跟着改变、跟着放缩,不过UI的问题我全部用Lua脚本去做,省去不少麻烦。
  2. 逻辑层,主要是Lua脚本的模块化构建。我的思路:根为场景(Scene),场景下有GDI对象(GdiObject),每个GDI对象可以包含其他GDI对象,组成树结构。场景切换时,GDI树销毁并创建新的。还有一个就是布局(Layout),这里的思路比较经典,掌握基本的递归方法就可以写成。布局里有绝对布局、线性布局、表格布局,都比较简单,这些布局会自动调整成员的大小。
  3. 渲染层,不多说,能用现成的就用。像画纯色矩形算简单,涉及富文本就复杂了,因此我暂时不考虑富文本情况,画画基本的几何图形就足够。这方面不算重要的内容。

http://zhuanlan.zhihu.com/p/25401920备份。

原文地址:https://www.cnblogs.com/bajdcc/p/8972927.html

时间: 2024-10-10 07:40:27

制作2048游戏的相关文章

使用UNITY3d制作2048游戏

使用unity的插件NGUI,可以快速的制作2D游戏: 2048这个游戏主要的核心是算法,不管用cocos2d,erget还是其他的引擎,算法基本不变,细节有变化而已: 基本算法图: 数字代表XY坐标,每个格子都有一个特定坐标,首先定义一个4*4的数组来存储这个棋盘格局: 一,界面区目录 UI ROOT(-Number)

用javascript制作2048游戏的思路(原创若 转载请附上本链接)

一.项目已上传至github,地址:https://github.com/forjuan/2048game 二.学习了javascript基础后,想要捣鼓点东西做,做了一个自己以前很爱玩的2048游戏.经过初期的思路设计手工画了设计思路图.手工图有空在用图画出来. 实现2048的功能:1.核心:上下左右移动. 2.游戏开始,游戏结束. 3.外观实现. 4.积分(暂时没实现) 把问题分解:1.首要难点移动,将移动进行分解,分为上下左右移动: 2.用什么记录位置,怎样记录每个方块的值,边界,相同值相

2048游戏制作(个人修改版)

需要运用Jquery,响应式2048. CSS代码: header{        display: block;        margin: 0 auto;        width: 100%;        text-align: center;    }    header h1{        font-family: Arial;        font-size: 40px;        font-weight: bold;        margin: 10px auto; 

Web版2048游戏制作

写在前面 工作之余参与了<慕课网2048游戏制作>的学习视频,视频断断续续看完了,游戏也制作成功了.因为其他的事情也没来的及总结,一拖时间也就过去了,整理磁盘的时候发现了2048源码,思考一下还是将之push到github上了(后面贴出),也顺便写篇总结,回顾一下,同时也谢谢liuyubobobo老师的授课. 不过源码在手,不运行下玩玩,怎么说的过去呢,哈哈!下面是游戏截图. 大图是PC端运行的效果,小图则是在iphone5s上的运行效果(Chrome浏览器debug,具体如何做参考文章:ht

Cocos2dx制作2048(3.数字相加逻辑)

这次我们来完成整个2048的数字相加逻辑其实2048玩起来简单,做起来也简单,复杂就复杂在这整个游戏的逻辑. 1.分析向左滑动 第一轮相加步骤: 1. 单1+单2    单1=2  单2赋值为0         (单1为空,可以加任何数字) 2. 单1+单3    单1=4   单3赋值为0    (单1不为空,只能加和他相同的数字) 3. 单1+单4    单1=4   单4不变              (单1不为空,只能加和他相同的数字) 第二轮相加步骤: 1.   单2+单3    单2

Android 2048游戏开发

根据教程写的简单的2048游戏. 极客学院教程地址:http://www.jikexueyuan.com/course/43.html 我的源代码地址:https://github.com/myCodingTrip/2048Game 项目有3个类. Card extends FrameLayout{ private int num; private TextView label; public Card(Context context) public int getNum() public vo

2048游戏C语言代码

听说2048游戏实现起来很easy! 所以今天就试了试!确实不太难,要想编的很成功,也不是太容易!有很多细节需要考虑! 下面是我自己设计的代码,估计里面会漏洞百出!希望路过大神能指点一二! #include<stdio.h> #include<stdlib.h> #include<conio.h> #include<time.h> #define WIN 256 // 可以修改决定游戏输赢的值 // 矩阵数组 int num[4][4]={0,0,0,0,0

用javascript实现一个2048游戏

早就想自己写一个2048游戏了,昨晚闲着没事,终于写了一个如下图,按方向键开始玩吧.如果觉得操作不方便,请直接打开链接玩吧:http://gujianbo.1kapp.com/2048/2048.html 附上源代码链接:https://github.com/gujianbo/js2048 个人博客地址:http://gujianbo.1kapp.com/ 新浪微博:http://weibo.com/gujianbobo 欢迎读者交流讨论并提出宝贵意见. 用javascript实现一个2048游

2048游戏回顾一:使用SurfaceView创建游戏启动动画

SurfaceView有个很大的好处,就是可以在子线程中绘制UI,其他的View只能在主线程中更新UI,这或多或少给编程增加了些不便.而SurfaceVIew在子线程中可以绘制UI的特性,再加上其可以直接从内存或者DMA等硬件接口取得图像数据,这使得它适合2d游戏的开发. SurfaceView使用步骤 SurfaceView的使用比较简单,可以总结为如下几个步骤: 1.继承SurfaceView并实现 SurfaceHolder.Callback方法 譬如: public class Star