分享一下自己写的2048游戏(3*3,4*4,5*5,6*6多种玩法,可反悔)

2048是一款非常常见的小游戏,所以我也想自己尝试着写一款,给自己练练手。说道练手,这里需要交代一下:我从事Android的工作刚刚一年,平时的工作主要是客制化UI和修改Bug,也就是这里改改,那里改改,因此,完整的开发项目的机会比较少,所以,对我而言,想要提高自己的编程水平,抽出时间自己做一些小项目是有意义的。虽然平时的工作主要是客制化UI和修改bug,但并不意味这我的工作是简单枯燥的,我时常会遇到系统中的一些bug,这样我有机会阅读android系统的源码,并从中分析问题出现的原因,这份工作对我而言非常有挑战性。。。

游戏展示

废话有点多,原归正转,其实当我写这篇博客的时候,这款游戏已经写的差不多了,大概花费了两周时间,当然这两周中,时间是自己挤出来的,因为还有工作要做。下面就展示一下这款游戏的界面吧:

游戏的启动界面:

游戏的操作界面:

这些UI都是自己一个人弄的,没有找专业的美工美化,所以界面难免有点丑。背景的那张图片是我百度到的,就是凑个那么点意思。启动画面有没有不太协调??

后续,我会把这款游的游戏的算法,界面开发过程中遇到的问题,自定义UI(比如自定义Dialog,ProgressBar)等做一个回顾,算是不枉忙活这么久吧,感兴趣的盆友们可以关注下。(都是些基本知识,大神请绕道!)。

游戏的设计思路

如果对怎么写2048游戏感兴趣的话,可能会有兴趣看一下这款游戏的代码。这款游戏是一个小游戏,代码比较简单,但是看别人的代码总是一件头疼的事情,因为你必须去揣摩写代码的人的思想。所以,我这里对这份代码的设计思路做一个简单的介绍。

2048游戏是一个数字消除类益智游戏。它的典型界面如下:

Number

其中的数字就由一个Number类表示,很多个数字的管理有Numbers类实现,Number类有如下属性:

    public int mScores;
    public int mCurPosition;
    public int mBeforePosition;
    public boolean isNeedMove;
    public boolean isNeedCombine;

mScores就是这个数字的值,其他四个变量都用来控制这个数字的移动与合并。所以,如果淡出写一个没有动画的2048的话,事情就简单多了,因为动画的控制会比较麻烦一点。

Numbers

Numbers类就是管理着一个mNumbers 数组,这个数组由玩家选择的游戏模式决定,玩家可以选3*3,4*4,5*5,6*6中的一种,对应的这个数组的大小也为如此。

Numbers类如下:

    Number [][] mNumbers = new Number[Game2048StaticControl.gamePlayMode][Game2048StaticControl.gamePlayMode];
    public Numbers(){
        for(inti=0;i<Game2048StaticControl.gamePlayMode;i++){
            for(intj=0;j<Game2048StaticControl.gamePlayMode;j++){
                mNumbers[i][j] = new Number(0,0);
            }
        }
    }
    ...

Game2048Algorithm

算法类中的所有算法都是针对Numbers对象实现的,也就是算法只对Numbers对象负责,这样思路更加清晰。算法类会实现Numbers整体移动、合并等操作。

以上就是游戏算法的整体思路,对于确切的算法实现,后续再做介绍。

游戏界面设计

下面介绍下游戏界面的设计思路:

游戏启动

涉及两个文件:StartActivity.java,StartAniSurfaceView.java

从名字中就可以看到,启动的动画是一个SurfaceView了,具体的布局思路是SurfaceView绘制启动动画,同时下面放置一个无限循环的进度条显示游戏在加载。

画面中的动画模仿了焰火的效果,不断的喷出2048四个数字,数字的大小颜色都是在一定范围内随机生成的,进度条还有待改进,目前的看起来还是很丑。

游戏的主界面

涉及三个个文件:GameModeChoiceActivity.java,GameModeChoiceBodyFragment.java,GameModeChoiceHeaderFragment.java

游戏的主界面由两个Fragment组成,一个Header,一个是body,当选中Header的一个条目时,body会显示相应的预览图。

当时的设计思路:

做出来的效果做了些许调整:

游戏界面

游戏界面的UI主要涉及MainActivity.java,GameSurfaceView.java,GameSurfaceViewHelper。java,DrawTool.java。

GameSurfaceViewHelper.java的出现是因为GameSurfaceView.java中的绘制逻辑比较复杂,把其中一部分拿出来放到Helper中,为GameSurfaceView减压,很多的绘制方法都在DrawTool.java中实现。绘制过程中遇到的算法在Game2048Algorithm.java文件中。

比如3*3的界面如下:

游戏的设置界面

游戏的设置界面非常简单,就是一个GameSettingsActivity.java。

对话框

游戏中用到的对话框我对使用了自定义的,依然采用的是半透明的设计,比如,游戏推出询问对话框:

此外,游戏胜利和失败后都会弹出对话框,选择具体游戏模式后也会弹出对话框询问是否可反悔,可见对话框的应用还是很多的。

通过以上对UI设计思路和游戏算法的设计思路的介绍,后续会对具体的环节做进一步分析,感兴趣的可以关注下!

时间: 2024-10-27 08:31:59

分享一下自己写的2048游戏(3*3,4*4,5*5,6*6多种玩法,可反悔)的相关文章

280行代码:Javascript 写的2048游戏

2048 原作者就是用Js写的,一直想尝试,但久久未动手. 昨天教学生学习JS代码.不妨就做个有趣的游戏好了.2048这么火,是一个不错的选择. 思路: 1. 数组 ,2维数组4x4 2. 移动算法,移动后有数字的对齐,无数字(我用的0,但不显示)补齐. 移动前 移动后(注意程序合并了第一行2个2,并产生了新的2) 移动算法分2步: 第一步骤:移动 第二步骤:合并 移动代码参考: [html] view plaincopy function left(t,i) { var j; var len 

纯JS写的2048游戏,分享之

这几天玩儿着2048这个游戏,突然心血来潮想练习下敲代码的思路.于是乎就模仿做了一个,到眼下位置还没有实现动态移动,不是非常好看,只是玩儿着自己模仿的小游戏还是蛮爽的,哈哈 假设没有玩儿过这个游戏,最好先试玩儿下,这样看起下边的代码来easy些 用的是event.临时不支持firefox下玩儿... 试玩儿>> 里边好多步骤写得不够简单介绍明了.欢迎指正 两个小时构思,主要构思用什么形式存表格,以及当中用到的几个比較关键的方法,比方:是否须要移动,是否须要合并,移动方法.合并方法等,然后開始编

原生js写一个2048游戏

本例逻辑1,一个二维数组,记录数字方块的数值与对应dom对象 2, 一个一维数组,记录空白方块的坐标(行与列)3,左移,最左边一列不做移动测试,从左边倒数第二列开始依次向左边做移动测试,若可合并,则向左移,数字不变或乘2.其他方向同逻辑 4, 判断输赢,若某个方块的值达到2048,即赢,游戏可以继续.当空白坐标数组的长度为0是,依次检测每个方块在四个方向可否移动,若都不能,即游戏结束. → → → → 预览 ← ← ← ← js代码: /*game 2048*/ //事件处理对象 var Eve

用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游戏回顾二:算法总结(移动、合并、动画等)

如果只是单纯的写一个2048游戏,让这个游戏可以玩的话,工作量还是蛮小的.不过,在这写工作中,你可能花时间最多的就是数字的移动与合并的算法了,如果没有做过,可能确实要花点时间来构思,所以,写完2048游戏以后,我希望能把它做个记录. 移动与合并的算法 比如说我们有如下一个界面: 现在,玩家向左划,这个导致所有的数字向左移动,并且移动的过程中如果发生碰撞,会检查数字是不是可以合并. 我们的算法应该是通用的,不仅对于4*4模式,即便是针对3*3模式,n*n模式,它都应该是一样的. 那么怎么做呢?其实

最少javascript代码完成一个2048游戏

原生javascript代码写的2048游戏.建议在谷歌浏览器下跑.'WASD'控制方向.演示地址请移步:http://runjs.cn/detail/bp8baf8b 直接贴代码~ html: <!DOCTYPE> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/htm

2048游戏回想二:算法总结(移动、合并、动画等)

假设仅仅是单纯的写一个2048游戏.让这个游戏能够玩的话,工作量还是蛮小的.只是,在这写工作中,你可能花时间最多的就是数字的移动与合并的算法了,假设没有做过,可能确实要花点时间来构思,所以.写完2048游戏以后,我希望能把它做个记录. 移动与合并的算法 比方说我们有例如以下一个界面: 如今.玩家向左划.这个导致全部的数字向左移动,而且移动的过程中假设发生碰撞.会检查数字是不是能够合并. 我们的算法应该是通用的.不仅对于4*4模式,即便是针对3*3模式.n*n模式,它都应该是一样的. 那么怎么做呢

【来写个2048吧】—— 游戏结束检测与添加分数

一. 游戏结束检测 //检测游戏是否结束 void GameScene :: doCheck() { bool isGameOver = true ; //判断每一个的上下左右和自己是否相同 for ( int y = 0 ; y < 4; y++) { for ( int x = 0 ; x < 4; x++) { if ( cardArr [x ][ y]-> getNumber () == 0 || ( x< 3 && cardArr[ x ][y ]->

一个用 C 语言写的迷你版 2048 游戏,只有 500个字符

Jay Chan 用 C 语言写的一个迷你版 2048 游戏,只有 487 个字符.来围观吧 M[16],X=16,W,k;main(){T(system("stty cbreak") );puts(W&1?"WIN":"LOSE");}K[]={2,3,1};s(f,d,i ,j,l,P){for(i=4;i--;)for(j=k=l=0;k<4;)j<4?P=M [w(d,i,j++)],W|=P>>11,l*