手把手教你做一个2048 上
目录
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 上相关推荐
- python手机版做小游戏代码大全-Python大牛手把手教你做一个小游戏,萌新福利!...
原标题:Python大牛手把手教你做一个小游戏,萌新福利! 引言 最近python语言大火,除了在科学计算领域python有用武之地之外,在游戏.后台等方面,python也大放异彩,本篇博文将按照正规 ...
- oracle可以在liux上装_【Oracle】手把手教你做之Linux上安装Oracle11g
手把手教你做之Linux上安装Oracle11g 这是我第一次安装时的过程,及遇到问题的解决办法,在此记录,有不妥之处,多多交流. 因为高稳定性及高定制低系统消耗等原因,我们希望在Linux上安装Or ...
- 手把手教你做一个自己的chrome扩展程序
手把手教你做一个自己的chrome扩展程序 [目录] first.效果 1.收藏夹修改 (1).鼠标移动到收藏夹上的动作效果 (2).收藏夹框 (3)百度搜索框功能 2.右上文字修改 3.背景图片修改 ...
- 手把手教你做一个Java贪吃蛇小游戏
大家好,我是孙不坚1208,这篇博客给大家分享一下:如何做一个贪吃蛇小游戏(Java版)的exe应用程序,希望能给需要帮助的朋友带来方便. 手把手教你做一个Java贪吃蛇小游戏的exe应用程序 一.J ...
- 手把手教你做一个物联网视频监控项目(三)流媒体方案实现
往期文章 手把手教你做一个物联网视频监控项目(一) 介绍 手把手教你做一个物联网视频监控项目(二)MJPG-streamer方案实现 文章目录 前言 一.软硬件准备 二.流媒体方案的实现之FFmpeg ...
- Blender图解教程:手把手教你做一个马里奥金币 之 图片转法线贴图法(附模型下载)
<Blender图解教程:手把手教你做一个马里奥金币 之 比较传统的方法>介绍了一种用Blender制作法线贴图的流程,本文介绍一种更加省事的方法. 步骤 效果图 概要 步骤 1. 建模 ...
- 手把手教你做一个jsp servlet mysql实现的学生签到考勤请假管理系统附带视频开发教程和完整源码
今天给大家演示的是一款由jsp+servlet+my色口数据库实现的学生请假签到考勤管理系统,采用了MVC的设计模式,结构层次非常清晰,此外系统还有完整的开发教程. 下面我们先来看看文档结构: 下面来 ...
- R数据分析:跟随top期刊手把手教你做一个临床预测模型
临床预测模型也是大家比较感兴趣的,今天就带着大家看一篇临床预测模型的文章,并且用一个例子给大家过一遍做法. 这篇文章来自护理领域顶级期刊的文章,文章名在下面 Ballesta-Castillejos ...
- 手把手教你做一个非常酷的PoV显示器(附源码)
关注+星标公众号,不错过精彩内容 来源 | DF创客社区 作者 | Amal Shajan 今天为大家分享一个DIY产品,如下: 前两天天我在浏览购物网站的时候,被一个购物清单吸引住了, 5个ATti ...
- 手把手教你做一个自定义表格标签
如果你用公司的平台进行开发的话,许多时候向按钮,输入框,树,菜单等都是直接用一个标签设置几个属性就可以了.全局上样式是统一的,而且容易维护. 之前我已经发使用自定义标签来做数据字典的示例,也就是说自定 ...
最新文章
- SpringMVC杂记
- HashMap之微代码解析-总结整理
- Tomcat学习总结(3)——Tomcat优化详细教程
- Python的__getattribute__ vs __getattr__的妙用
- sqlsever 转mysql 出错 MySQL max_allowed_packet设置及问题
- java 判断范围_java判断一个点是否在一个围栏范围内
- 大数据学习笔记12:搭建伪分布式Spark
- K/3 WISE期初余额调整和出库异常调整的差别
- Commons-VFS 使用SFTP
- 布局篇(2)—If you love css …
- WACV 2021 论文大盘点-GAN篇
- 思杰桌面服务器虚拟化,虚拟化入门之认识思杰桌面虚拟化XenDesktop
- AI+PS教程!制作油画质感早餐插画
- Linux 搭建NodeBB社区,搭建CAS登录认证平台,实现Nodebb接入企业CAS认证(二)
- k8s master节点状态为 NotReady问题解决
- LinkedList底层链表结构
- 成成你好呀笔记整理(知识点合集一)
- 快消品行业商业数字化转型解决方案
- class_addMethod详解
- MIKE 21 教程 2.9 初始条件(Initial Conditions),边界条件Boundary Conditions),解耦(Decoupling)
热门文章
- Wireshark数据抓包分析之FTP协议
- echarts r 地图_使用echarts实现省市区地图
- Audition CC 2019 for Mac中文破解版永久激活方法附破解补丁
- Docker DeskTop安装Jenkins教程[Windows]
- 【python教程入门学习】Pygame下载和安装
- 全球运:电商物流成数字浙江“金名片”
- Chrome谷歌浏览器登入指引
- 开发竞赛作品展示网站上线!
- 联想i5无线网无法连接服务器,联想笔记本无线网络连接不上是什么原因
- Windows7不再卡五叶草,更新了bootx64.efi和bootmgfw.efi文件,支持安全启动,不用关闭安全启动和打开csm支持.