本篇文章用到了GesTureDetector,TextView,

1024是一款前段时间比较火的游戏。在游戏中你要通过左右上下移动方块,等值方块会在碰撞中合并,游戏目标尽可能得到更大的数值。

1. ui设计
2. 代码实现

首先我们要设计一个ui。
笔者采用的是TextView,因为它可以方便的得到和设置面值。我采用的4*4,这里就不贴ui代码了

其次代码实现。
我们可以用GestureDetector判断用户是上下,左右滑动。
笔者设定了一个工具类meach用来管理每个方块的,一个meach示例对应一个TextView。笔者有个想法或许可以让meach继承TextView,并重写,应该可以方便一点。

/*** meach对象表示游戏中一个单元格与TextView配合使用,* @number number表示方块的面值* @state state表示方块是否有值,true则表示存在*/
class  meach
{private int number;private boolean state;public meach(int number,boolean state){this.number=number;this.state=state;}public void settate(boolean b){this.state=b;}public void setNumber(int n){this.number=n;}public int getNumber(){return number;}public boolean getstate() {return state;}
}

设定随机数,在用户每次滑动后要随机给棋盘上生成一个方块,

 /*** 设定随机数,当界面无空位时返回原数组* @return meach[][] 返回对象数值*/public static meach[][] setnewnumber() {Random r = new Random();//!!!判断若棋盘上无位置for(int i=0;i<=3;i++){for(int j=0;j<=3;j++){if(e[i][j].getstate()==false){i=4;break;}else if( i==3 && j==3){//处理棋盘上无位置,返回原数组不设定return e;}}}//设置随机数do{i = r.nextInt(4);j = r.nextInt(4);}while (e[i][j].getstate());e[i][j].settate(true);e[i][j].setNumber(2);return e;}

更新TextView的值

 /*** 函数用于设定新View*/public static boolean setnewview(TextView[][] tv) {for(int i=0;i<=3;i++){for(int j=0;j<=3;j++){if(e[i][j].getstate())tv[i][j].setText(e[i][j].getNumber()+"");else{tv[i][j].setText(" ");}}}return true;}

算法实现,当用户滑动时我们要分别遍历行或列,读取有数值的方块,将其移动至滑动方向,若有相邻两TextView的text相同则合并。

 @Overridepublic boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {float x=e1.getX()-e2.getX();float y=e1.getY()-e2.getY();float x1=Math.abs(x);float y1=Math.abs(y);//向右划if(  x1>y1  && x<0){/*** meaches[] 为一行或一列中state为true的meach对象* sub 为meaches[]的当前下标* sube 为应将meachs[]中的对象应移动至的下标*/meach meaches[];int sub;//从第一行开始遍历for(int n=0;n<=3;n++){//重置sub=0;//从右往左开始遍历,得出一行中的含有State为true的下标存入numbers数组;meaches =new meach[4];for(int m=3;m>=0;m--) {if (e[n][m].getstate()==true){meaches[sub] = e[n][m];sub++;}}//合并并移动if(sub==1){e[n][3].setNumber(meaches[0].getNumber());meaches[0].settate(false);e[n][3].settate(true);}int sube=3;for(int i=0;i<sub-1;i++){if(meaches[i].getstate()&& meaches[i].getNumber() == meaches[i+1].getNumber() ){e[n][sube].setNumber( meaches[i].getNumber() *2);meaches[i].settate(false);meaches[i+1].settate(false);e[n][sube].settate(true);sube--;}else if(i==sub-2) {if (meaches[i].getstate()) {e[n][sube].setNumber(meaches[i].getNumber());e[n][sube-1].setNumber(meaches[i + 1].getNumber());meaches[i].settate(false);meaches[i+1].settate(false);e[n][sube].settate(true);e[n][sube-1].settate(true);}else{e[n][sube].setNumber(meaches[i+1].getNumber());meaches[i+1].settate(false);e[n][sube].settate(true);}}else if(meaches[i].getstate()) {e[n][sube].setNumber(meaches[i].getNumber());meaches[i].settate(false);e[n][sube].settate(true);sube--;}}}//显示Viewsetnewnumber();setnewview(tv);}
}

其他方向的判断同理。
玩家应可以选择重开以结束本局,并开始下一局

    btnrm.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//清理棋盘for(int i=0;i<=3;i++){for(int j=0;j<=3;j++){e[i][j].settate(false);}}setnewnumber();setnewview(tv);}});

注意:

 //activiy层面的点击监听器,将事件监听交给gesture监听器@Overridepublic boolean onTouchEvent(MotionEvent event) {return detector.onTouchEvent(event);}

这里将事件监听传递给了Gesture,Gesture的方法才能够实行,否则执行只onTouchEvent。
这里是笔者写的小demo在其中也完善了一些小细节,但还是有很多游戏应该有的内容没有设计完成,后续有时间应该会更新。
102game

用as写2048游戏相关推荐

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

    2048是一款非常常见的小游戏,所以我也想自己尝试着写一款,给自己练练手.说道练手,这里需要交代一下:我从事Android的工作刚刚一年,平时的工作主要是客制化UI和修改Bug,也就是这里改改,那里改 ...

  2. 花了一个深夜,才用C语言写了一个2048游戏雏形

    12年我毕业的第二个月工资,我就买了一个IPAD,然后在IPAD上下了一个2048游戏,玩起来非常爽. 然后这几天看到好几个公众号都发了自己写这个游戏的代码,然后我自己也想试试,所以就有了这篇文章,写 ...

  3. 基于python的2048游戏设计_用python写一个2048游戏

    self.randomGenerateNumberself.randomGenerateNumber 然后,当玩家按下方向键(↑↓←→)时,这个二维列表要根据玩家的操作指令进行更新,主要分为两个部分: ...

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

    Jay Chan 用 C 语言写的一个迷你版 2048 游戏,只有 487 个字符.来围观吧 M[16],X=16,W,k;main(){T(system("stty cbreak" ...

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

    Jay Chan 用 C 语言写的一个迷你版 2048 游戏,仅仅有 487 个字符. 来围观吧 M[16],X=16,W,k;main(){T(system("stty cbreak&qu ...

  6. 是男人就下100层【第五层】——2048游戏从源代码到公布市场

    上一篇<是男人就下100层[第五层]--换肤版2048游戏>中阳光小强对2048游戏用自己的方式进行了实现,并分享了核心源码,这一篇阳光小强打算将该项目的全部源码公开并结合这个实例在这篇文 ...

  7. 使用python开发网页游戏_不敢想!不敢想!我用Python自动玩转2048游戏

    近来在折腾selenium自动化, 感觉配合爬虫很有意思, 大多数以前难以模拟登录的网站都可以爬了,折腾了这么久,于是想自动玩个2048游戏!嘿嘿, 我是一个不擅长玩游戏的人, 以前玩2048就经常得 ...

  8. 是男人就下100层【第五层】——2048游戏从源码到发布市场

    上一篇<是男人就下100层[第五层]--换肤版2048游戏>中阳光小强对2048游戏用自己的方式进行了实现,并分享了核心源码,这一篇阳光小强打算将该项目的所有源代码公开并结合这个实例在这篇 ...

  9. 【C++】2048游戏系列---优化模块第一稿【加载图片】

    [C++]2048游戏系列---优化模块第一稿[加载图片] (更新中--) 参考博客: https://blog.csdn.net/qq_39151563/article/details/104283 ...

最新文章

  1. 基于图像的摄像机姿态估计方法评析
  2. 新特效火爆抖音!各路神仙齐唱《蚂蚁呀嘿》,网友:短短几秒需一生来治愈...
  3. SQL 2005 中的数据约束
  4. servlet之servletResponse
  5. H.265(HEVC)深度解析
  6. MySQL探秘(五):InnoDB锁的类型和状态查询
  7. 网络病毒源的排查(2005年3月22日维护记录)
  8. windows server2008无法将本地文件复制到远程计算机,windows2008/2012无法从本地复制文件到远程服务器处理方法...
  9. IOS开发学习笔记024-UIButton和UIImageView的区别
  10. ICCV2021 MuST:还在特定任务里为刷点而苦苦挣扎?谷歌的大佬们都已经开始玩多任务训练了...
  11. Assembly.Load,Assembly.LoadFile 与 Assembly.LoadFrom
  12. 拉格朗日插值编程实现
  13. 微信商家收款码和个人收款码有什么区别?
  14. VvvebJs可视化前端设计开发工具
  15. python 转盘 圆形_python实现大转盘抽奖效果
  16. 李智慧 - 架构师训练营 第三周
  17. 控制测量步骤及其内业计算
  18. 2019年8月23日 星期五(韩天峰的swoole)
  19. echarts饼图中间默认内容显示与data数据显示切换
  20. 安装SqlServer 2008 R2时出现程序兼容性问题

热门文章

  1. 62道开发人员面试经典题
  2. 人脸脸部识别技术_面部识别技术的危险后果
  3. JAVA生成甘特图Excel导出
  4. sqlServer取余数
  5. 最清晰易懂的MinMax算法和Alpha-Beta剪枝详解
  6. HDU4324 - Triangle LOVE 拓补排序
  7. # [cs231n (五)神经网络part 1 构建架构 ][1]
  8. 安装vue脚手架出现的问题 npm ERR! code EEXIST。。。
  9. matlab tif dpi,轻松解决杂志要求的300dpi分辨率、TIFF格式图片
  10. 管理手记:和上司相处不要太“学生气”