目录

0 简介

1 什么是2048


0 简介

闲来无事,搞了个2048玩玩,源码放到了github上了,先上链接 https://github.com/tzx666/Android2048

现在已经实现的功能有

经典模式

自定义模式

历史查看、游玩、删除自己自定义的模式

还没有实现的功能有

游戏的动画、声音

后台功能、创意上传、图片合并等

效果图

1 什么是2048

2048是一种游戏,核心玩法是通过左滑右滑上滑下滑去合并相同的数字,如果到达了2048则判定为胜利,如果已经无法再滑动了则可以判断失败

那么我们便可以构思出这个游戏必然有以下功能

1 基础背景,一个4*4的游戏棋盘,这里我们使用一维数组作为底层实现

2 滑动的合并与判断

3 随机位置的生成

4 游戏胜利和结束条件的判断

5 引申而来的,我们同样可以对游戏使用mvc架构,即游戏显示什么和实际逻辑是什么并无关系,只要定义符合合并机制,那么无论显示什么都是合理的(雾)

2 抽象类的定义

根据上述的描述,我们不难定义出接口(其实应该用抽象类更合理的说)

interface Game2048 {fun init(context:Context);fun init(context:Context,size:Int);fun start();fun moveleft();fun moveright();fun moveup();fun movedown();fun addRanrom();fun isEnd();fun isFirstVisiable(position:Int):Boolean;
}

其中 init()负责初始化数组,isFirstVisiable()负责动画出现的判断,movexx函数负责游戏过程中的合并

3 游戏逻辑的实现

2048的游戏逻辑比较简单,参考代码应该很好懂

/*
*@author tzx
*@descrption 2048的逻辑实现
*/
public class Game2048impl implements Game2048 {private  int score;private  int[] map;private boolean[] isfirstAppear;private  int MAPSIZE;private int GAME_OVER=101;private int GAME_WIN=102;private int GAME_CONTINUE=103;private int state=GAME_CONTINUE;private Context context;@Overridepublic void init(Context context,int size) {MAPSIZE=size;this.context=context;map=new int[MAPSIZE*MAPSIZE];isfirstAppear=new boolean[MAPSIZE*MAPSIZE];addRanrom();addRanrom();}@Overridepublic boolean isFirstVisiable(int positon) {return isfirstAppear[positon];}private enum state{GAME_OVER,GAME_CONTINUE,GAME_WIN};@Overridepublic void init(Context context) {this.context=context;MAPSIZE=4;map=new int[MAPSIZE*MAPSIZE];isfirstAppear=new boolean[MAPSIZE*MAPSIZE];addRanrom();addRanrom();}@Overridepublic void start() {}public int[] getMap() {return map;}@Overridepublic void moveleft() {boolean merge=false;for(int i=0;i<4;i++){for(int j=0;j<4;j++){for(int z=j+1;z<4;z++){if(map[i*MAPSIZE+z]>0){if(map[i*MAPSIZE+j]==0){map[i*MAPSIZE+j]=map[i*MAPSIZE+z];map[i*MAPSIZE+z]=0;j--;merge=true;}else if(map[i*MAPSIZE+j]==map[i*MAPSIZE+z]){map[i*MAPSIZE+j]*=2;score+=map[i*MAPSIZE+j];map[i*MAPSIZE+z]=0;merge=true;}break;}}}}if(merge){for(int i=0;i<isfirstAppear.length;i++)isfirstAppear[i]=false;addRanrom();isEnd();}}@Overridepublic void moveright() {boolean merge=false;for(int i=0;i<4;i++){for(int j=3;j>0;j--){for(int z=j-1;z>=0;z--){if(map[i*MAPSIZE+z]>0){if(map[i*MAPSIZE+j]==0){map[i*MAPSIZE+j]=map[i*MAPSIZE+z];map[i*MAPSIZE+z]=0;j++;merge=true;}else if(map[i*MAPSIZE+j]==map[i*MAPSIZE+z]){map[i*MAPSIZE+j]*=2;map[i*MAPSIZE+z]=0;score+=map[i*MAPSIZE+j];merge=true;}break;}}}}if(merge){for(int i=0;i<isfirstAppear.length;i++)isfirstAppear[i]=false;addRanrom();isEnd();}}@Overridepublic void moveup() {boolean merge=false;for(int j=0;j<4;j++){for(int i=0;i<4;i++){for(int z=i+1;z<4;z++){if(map[z*MAPSIZE+j]>0){if(map[i*MAPSIZE+j]==0){map[i*MAPSIZE+j]=map[z*MAPSIZE+j];map[z*MAPSIZE+j]=0;i--;merge=true;}else if(map[i*MAPSIZE+j]==map[z*MAPSIZE+j]){map[i*MAPSIZE+j]*=2;score+=map[i*MAPSIZE+j];map[z*MAPSIZE+j]=0;merge=true;}break;}}}}if(merge){for(int i=0;i<isfirstAppear.length;i++)isfirstAppear[i]=false;addRanrom();isEnd();}}@Overridepublic void movedown() {boolean merge=false;for(int j=0;j<4;j++){for(int i=3;i>0;i--){for(int z=i-1;z>=0;z--){if(map[z*MAPSIZE+j]>0){if(map[i*MAPSIZE+j]==0){map[i*MAPSIZE+j]=map[z*MAPSIZE+j];map[z*MAPSIZE+j]=0;i++;merge=true;}else if(map[i*MAPSIZE+j]==map[z*MAPSIZE+j]){map[i*MAPSIZE+j]*=2;score+=map[i*MAPSIZE+j];map[z*MAPSIZE+j]=0;merge=true;}break;}}}}if(merge){for(int i=0;i<isfirstAppear.length;i++)isfirstAppear[i]=false;addRanrom();isEnd();}}@Overridepublic void addRanrom() {Random rand=new Random();int x=rand.nextInt(4);int y=rand.nextInt(4);do{x=rand.nextInt(4);y=rand.nextInt(4);}while(map[x*MAPSIZE+y]!=0);isfirstAppear[x*MAPSIZE+y]=true;map[x*MAPSIZE+y]=Math.random()>0.1?2:4;}@Overridepublic void isEnd() {int state=this.GAME_OVER;for(int i=0;i<4;i++){for(int j=0;j<4;j++){if(map[i*MAPSIZE+j]==2048){state=GAME_WIN;return;}else if(map[i*MAPSIZE+j]==0||(i>0&&map[i*MAPSIZE+j]==map[(i-1)*MAPSIZE+j])||(i<3&&map[i*MAPSIZE+j]==map[(i+1)*MAPSIZE+j])||(j>0&&map[i*MAPSIZE+j]==map[i*MAPSIZE+(j-1)])||(j<3&&map[i*MAPSIZE+j]==map[i*MAPSIZE+(j+1)])){state=this.GAME_CONTINUE;return;}}}if(state==GAME_OVER){UtilsKt.showDialog(context, "游戏结束", "", new Callback() {@Overridepublic void onConfirm(@NotNull DialogInterface dialog) {((Activity)context).finish();}@Overridepublic void onCancel(@NotNull DialogInterface dialog) {}});}else if(state==GAME_WIN){UtilsKt.showDialog(context, "游戏胜利", "", new Callback() {@Overridepublic void onConfirm(@NotNull DialogInterface dialog) {((Activity)context).finish();}@Overridepublic void onCancel(@NotNull DialogInterface dialog) {}});}}public int getScore() {return score;}public void setScore(int score) {this.score = score;}void Gesture(int c){if(c==1) moveleft();        //getKeyCode()是表示按键按下的序号,KeyEvent.VK_UP表示up(下)键的序号if(c==2) moveright();if(c==3) moveup();if(c==4) movedown();}
}

事实上,上面的类完全可以通过scanner以控制台的形式跑起来

上篇总结

在本篇,我们主要关注游戏的逻辑实现,但是么有界面的游戏一定是假游戏,下一篇将结合用到的安卓开发知识介绍如何优雅的画界面(雾)

手把手教你做一个2048 上相关推荐

  1. python手机版做小游戏代码大全-Python大牛手把手教你做一个小游戏,萌新福利!...

    原标题:Python大牛手把手教你做一个小游戏,萌新福利! 引言 最近python语言大火,除了在科学计算领域python有用武之地之外,在游戏.后台等方面,python也大放异彩,本篇博文将按照正规 ...

  2. oracle可以在liux上装_【Oracle】手把手教你做之Linux上安装Oracle11g

    手把手教你做之Linux上安装Oracle11g 这是我第一次安装时的过程,及遇到问题的解决办法,在此记录,有不妥之处,多多交流. 因为高稳定性及高定制低系统消耗等原因,我们希望在Linux上安装Or ...

  3. 手把手教你做一个自己的chrome扩展程序

    手把手教你做一个自己的chrome扩展程序 [目录] first.效果 1.收藏夹修改 (1).鼠标移动到收藏夹上的动作效果 (2).收藏夹框 (3)百度搜索框功能 2.右上文字修改 3.背景图片修改 ...

  4. 手把手教你做一个Java贪吃蛇小游戏

    大家好,我是孙不坚1208,这篇博客给大家分享一下:如何做一个贪吃蛇小游戏(Java版)的exe应用程序,希望能给需要帮助的朋友带来方便. 手把手教你做一个Java贪吃蛇小游戏的exe应用程序 一.J ...

  5. 手把手教你做一个物联网视频监控项目(三)流媒体方案实现

    往期文章 手把手教你做一个物联网视频监控项目(一) 介绍 手把手教你做一个物联网视频监控项目(二)MJPG-streamer方案实现 文章目录 前言 一.软硬件准备 二.流媒体方案的实现之FFmpeg ...

  6. Blender图解教程:手把手教你做一个马里奥金币 之 图片转法线贴图法(附模型下载)

    <Blender图解教程:手把手教你做一个马里奥金币 之 比较传统的方法>介绍了一种用Blender制作法线贴图的流程,本文介绍一种更加省事的方法. 步骤 效果图 概要 步骤 1. 建模 ...

  7. 手把手教你做一个jsp servlet mysql实现的学生签到考勤请假管理系统附带视频开发教程和完整源码

    今天给大家演示的是一款由jsp+servlet+my色口数据库实现的学生请假签到考勤管理系统,采用了MVC的设计模式,结构层次非常清晰,此外系统还有完整的开发教程. 下面我们先来看看文档结构: 下面来 ...

  8. R数据分析:跟随top期刊手把手教你做一个临床预测模型

    临床预测模型也是大家比较感兴趣的,今天就带着大家看一篇临床预测模型的文章,并且用一个例子给大家过一遍做法. 这篇文章来自护理领域顶级期刊的文章,文章名在下面 Ballesta-Castillejos ...

  9. 手把手教你做一个非常酷的PoV显示器(附源码)

    关注+星标公众号,不错过精彩内容 来源 | DF创客社区 作者 | Amal Shajan 今天为大家分享一个DIY产品,如下: 前两天天我在浏览购物网站的时候,被一个购物清单吸引住了, 5个ATti ...

  10. 手把手教你做一个自定义表格标签

    如果你用公司的平台进行开发的话,许多时候向按钮,输入框,树,菜单等都是直接用一个标签设置几个属性就可以了.全局上样式是统一的,而且容易维护. 之前我已经发使用自定义标签来做数据字典的示例,也就是说自定 ...

最新文章

  1. SpringMVC杂记
  2. HashMap之微代码解析-总结整理
  3. Tomcat学习总结(3)——Tomcat优化详细教程
  4. Python的__getattribute__ vs __getattr__的妙用
  5. sqlsever 转mysql 出错 MySQL max_allowed_packet设置及问题
  6. java 判断范围_java判断一个点是否在一个围栏范围内
  7. 大数据学习笔记12:搭建伪分布式Spark
  8. K/3 WISE期初余额调整和出库异常调整的差别
  9. Commons-VFS 使用SFTP
  10. 布局篇(2)—If you love css …
  11. WACV 2021 论文大盘点-GAN篇
  12. 思杰桌面服务器虚拟化,虚拟化入门之认识思杰桌面虚拟化XenDesktop
  13. AI+PS教程!制作油画质感早餐插画
  14. Linux 搭建NodeBB社区,搭建CAS登录认证平台,实现Nodebb接入企业CAS认证(二)
  15. k8s master节点状态为 NotReady问题解决
  16. LinkedList底层链表结构
  17. 成成你好呀笔记整理(知识点合集一)
  18. 快消品行业商业数字化转型解决方案
  19. class_addMethod详解
  20. MIKE 21 教程 2.9 初始条件(Initial Conditions),边界条件Boundary Conditions),解耦(Decoupling)

热门文章

  1. Wireshark数据抓包分析之FTP协议
  2. echarts r 地图_使用echarts实现省市区地图
  3. Audition CC 2019 for Mac中文破解版永久激活方法附破解补丁
  4. Docker DeskTop安装Jenkins教程[Windows]
  5. 【python教程入门学习】Pygame下载和安装
  6. 全球运:电商物流成数字浙江“金名片”
  7. Chrome谷歌浏览器登入指引
  8. 开发竞赛作品展示网站上线!
  9. 联想i5无线网无法连接服务器,联想笔记本无线网络连接不上是什么原因
  10. Windows7不再卡五叶草,更新了bootx64.efi和bootmgfw.efi文件,支持安全启动,不用关闭安全启动和打开csm支持.