《2048》是一款比较流行的数字游戏,最早于2014年3月20日发行。原版2048首先在GitHub上发布,原作者是Gabriele Cirulli,后被移植到各个平台。这款游戏是基于《1024》和《小3传奇》的玩法开发而成的新型数字游戏。游戏源地址:http://gabrielecirulli.github.io/2048/

1、新建android项目game2048

修改activity_main.xml文件

2、设计2048游戏布局

继续修改activity_main.xml文件

3、实现2048游戏主类GameView

新建类GameView,继承自GridLayout

packagecom.wuyudong.game2048;importandroid.content.Context;importandroid.util.AttributeSet;importandroid.widget.GridLayout;public class GameView extendsGridLayout {public GameView(Context context, AttributeSet attrs, intdefStyle) {super(context, attrs, defStyle);

initGameView();

}publicGameView(Context context, AttributeSet attrs) {super(context, attrs);

initGameView();

}publicGameView(Context context) {super(context);

initGameView();

}private voidinitGameView() {

}

}

继续修改activity_main.xml文件:

4、游戏2048在Android平台的触控交互设计

添加触控交互相关代码

private voidinitGameView() {

setOnTouchListener(newOnTouchListener() {//记录起始位置和偏移坐标

private floatstartX, startY, offsetX, offsetY;

@Overridepublic booleanonTouch(View v, MotionEvent event) {switch(event.getAction()) {case MotionEvent.ACTION_DOWN: //监听手指按下的初始位置坐标

startX =event.getX();

startY=event.getY();break;case MotionEvent.ACTION_UP: //监听手指离开时的位置坐标

offsetX = event.getX() -startX;

offsetY= event.getY() -startY;if (Math.abs(offsetX) >Math.abs(offsetY)) {if (offsetX < -5) {

System.out.println("left");

}else if (offsetX > 5) {

System.out.println("right");

}

}else{if (offsetY < -5) {

System.out.println("up");

}else if (offsetY > 5) {

System.out.println("down");

}

}break;default:break;

}return true;

}

});

}

5、实现2048游戏的卡片类

编写卡片类Card.java

packagecom.wuyudong.game2048;importandroid.content.Context;importandroid.widget.FrameLayout;importandroid.widget.TextView;public class Card extendsFrameLayout {publicCard(Context context) {super(context);

lable= newTextView(getContext());

lable.setTextSize(32);

LayoutParams lp= new LayoutParams(-1, -1);

addView(lable, lp);

setNum(0);

}private int num = 0;public intgetNum() {returnnum;

}public void setNum(intnum) {this.num =num;

lable.setText(num+ "");

}public booleanequals(Card o) {return getNum() ==o.getNum();

}privateTextView lable;

}

6、添加2048游戏卡片

先添加相关代码看看效果

@Overrideprotected void onSizeChanged(int w, int h, int oldw, intoldh) {super.onSizeChanged(w, h, oldw, oldh);int cardWidth = (Math.min(w, h) - 10) / 4;

addCards(cardWidth, cardWidth);

}private void addCards(int cardWith, intcardHeight){

Card c;for (int y = 0; y < 4; y++) {for (int x = 0; x < 4; x++) {

c=newCard(getContext());

c.setNum(2);

addView(c, cardWith, cardHeight);

}

}

}

运行后的效果

出现问题,所有的2都出现在同一行中,解决办法:

在initGameView() 中添加代码,指定为四列:setColumnCount(4);

lable.setGravity(Gravity.CENTER);

接着添加相关的背景颜色以及卡片数字的背景颜色,还有卡片间距

setBackgroundColor(0xffbbada0); //设置整体背景

lable.setBackgroundColor(0x33ffffff);

lable.setGravity(Gravity.CENTER);

lp.setMargins(10, 10, 0, 0);

运行后界面如下:

7、在2048游戏中添加随机数

protected void onSizeChanged(int w, int h, int oldw, intoldh) {super.onSizeChanged(w, h, oldw, oldh);int cardWidth = (Math.min(w, h) - 10) / 4;

addCards(cardWidth, cardWidth);

startGame();

}private voidstartGame() {for (int y = 0; y < 4; y++) {for (int x = 0; x < 4; x++) {

cardsMap[x][y].setNum(0);

}

}

addRandomNum();

addRandomNum();

}private voidaddRandomNum() {

emptyPoints.clear();//清空

for (int y = 0; y < 4; y++) {for (int x = 0; x < 4; x++) {if (cardsMap[x][y].getNum() <= 0) {

emptyPoints.add(newPoint(x, y));

}

}

}

Point p= emptyPoints.remove((int) (Math.random() *emptyPoints.size()));

cardsMap[p.x][p.y].setNum(Math.random()> 0.1 ? 2 : 4);

}

8、实现2048游戏逻辑

private void swipeLeft() { //往左滑动手指

for (int y = 0; y < 4; y++) {for (int x = 0; x < 4; x++) {for (int x1 = x + 1; x1 < 4; x1++) {if (cardsMap[x1][y].getNum() > 0) {if (cardsMap[x][y].getNum() <= 0) {

cardsMap[x][y].setNum(cardsMap[x1][y].getNum());

cardsMap[x1][y].setNum(0);

x--;break;

}else if(cardsMap[x][y].equals(cardsMap[x1][y])){

cardsMap[x][y].setNum(cardsMap[x][y].getNum()*2);

cardsMap[x1][y].setNum(0);break;

}

}

}

}

}

}private voidswipeRight() {for (int y = 0; y < 4; y++) {for (int x = 3; x >=0; x--) {for (int x1 = x - 1; x1 >=0; x1--) {if (cardsMap[x1][y].getNum() > 0) {if (cardsMap[x][y].getNum() <= 0) {

cardsMap[x][y].setNum(cardsMap[x1][y].getNum());

cardsMap[x1][y].setNum(0);

x++;break;

}else if(cardsMap[x][y].equals(cardsMap[x1][y])){

cardsMap[x][y].setNum(cardsMap[x][y].getNum()*2);

cardsMap[x1][y].setNum(0);break;

}

}

}

}

}

}private voidswipeUp() {for (int x = 0; x < 4; x++) {for (int y = 0; y < 4; y++) {for (int y1 = y + 1; y1 < 4; y1++) {if (cardsMap[x][y1].getNum() > 0) {if (cardsMap[x][y].getNum() <= 0) {

cardsMap[x][y].setNum(cardsMap[x][y1].getNum());

cardsMap[x][y1].setNum(0);

y--;break;

}else if(cardsMap[x][y].equals(cardsMap[x][y1])){

cardsMap[x][y].setNum(cardsMap[x][y].getNum()*2);

cardsMap[x][y1].setNum(0);break;

}

}

}

}

}

}private voidswipeDown() {for (int x = 0; x < 4; x++) {for (int y = 3; y >=0; y--) {for (int y1 = y - 1; y1 >= 0; y1--) {if (cardsMap[x][y1].getNum() > 0) {if (cardsMap[x][y].getNum() <= 0) {

cardsMap[x][y].setNum(cardsMap[x][y1].getNum());

cardsMap[x][y1].setNum(0);

y++;break;

}else if(cardsMap[x][y].equals(cardsMap[x][y1])){

cardsMap[x][y].setNum(cardsMap[x][y].getNum()*2);

cardsMap[x][y1].setNum(0);break;

}

}

}

}

}

}private Card[][] cardsMap = new Card[4][4];private List emptyPoints = new ArrayList();

9、游戏2048计分

MainActivity.java 中添加相关代码:

packagecom.wuyudong.game2048;importandroid.os.Bundle;importandroid.app.Activity;importandroid.view.Menu;importandroid.widget.TextView;public class MainActivity extendsActivity {publicMainActivity() {

mainActivity= this;

}

@Overrideprotected voidonCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

tvScore=(TextView) findViewById(R.id.tvScore);

}

@Overridepublic booleanonCreateOptionsMenu(Menu menu) {//Inflate the menu; this adds items to the action bar if it is present.

getMenuInflater().inflate(R.menu.main, menu);return true;

}public voidclearScore() {

score= 0;

showScore();

}public voidshowScore() {

tvScore.setText(score+ "");

}public void addScore(ints) {

score+=s;

showScore();

}private int score = 0;privateTextView tvScore;private static MainActivity mainActivity = null;public staticMainActivity getMainActivity() {returnmainActivity;

}

}

10、检查2048游戏结束

private voidcheckComplete() {boolean complete = true;

ALL:for (int y = 0; y < 4; y++) {for (int x = 0; x < 4; x++) {if (cardsMap[x][y].getNum() == 0

|| (x > 0 && cardsMap[x][y].equals(cardsMap[x - 1][y]))|| (x < 3 && cardsMap[x][y].equals(cardsMap[x + 1][y]))|| (y > 0 && cardsMap[x][y].equals(cardsMap[x][y - 1]))|| (y < 3 && cardsMap[x][y].equals(cardsMap[x][y + 1]))) {

complete= false;breakALL;

}

}

}if(complete) {newAlertDialog.Builder(getContext())

.setTitle("Oh")

.setMessage("Game Over!")

.setPositiveButton("restart",newDialogInterface.OnClickListener() {

@Overridepublic voidonClick(DialogInterface dialog,intwhich) {

startGame();

}

}).show();

}

}

原文:http://www.cnblogs.com/wuyudong/p/5573701.html

android2048项目报告,Android项目开发实战-2048游戏相关推荐

  1. 微信小程序电商项目商品详情页开发实战之数据绑定与事件应用

    各位CSDN的朋友,我们都知道,现在微信小程序电商平台特别火爆,所以我将以一个生鲜电商项目为例,为大家讲述微信小程序的实战化开发,价值几万元的成熟项目,你可千万不要错过哦. 大家直接通过视频链接直接看 ...

  2. java游戏演示ppt_java项目开发实战──五子棋游戏.ppt

    java项目开发实战──五子棋游戏.ppt 还剩 23页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,很抱歉,此页已超出免费预览范围啦! 如果喜欢就下载吧,价低环保! 内容要点: 第 24 ...

  3. android天气预报项目总结报告,Android项目:天气预报App

    一 介绍 该项目是在Android Studio的环境下实现的,主要是仿照了小米10手机上的天气预报App. 二 效果图 三 页面介绍 1.主界面                            ...

  4. 《Android Studio开发实战 从零基础到App上线(第2版)》出版后记

    2015年11月23日,鄙人在csdn发表了第一篇技术文章,掐指一算距今已有三年.遥想当年开写博客,只是为了总结经验同时分享出来,后来机缘巧合受到出版社编辑邀请并出了书,完全是无心插柳的结果.当初写作 ...

  5. 《Android Studio开发实战 从零基础到App上线》源码运行问题解答

    本书提供了所有章节的完整源码下载,自上市以来陆续收到读者的意见反馈,现将与源码有关的问题汇总归类如下,方便更多的朋友解决源码运行过程中发现的问题: 一.打开本书源码时,出现"Plugin w ...

  6. 《Android Studio开发实战 从零基础到App上线》第一版的资源下载和内容勘误

    资源下载 下面是<Android Studio开发实战 从零基础到App上线>(第一版)一书用到的工具和代码资源: 1.本书使用的Android Studio版本为2.2.3,因为Andr ...

  7. 《Android Studio开发实战》学习(一)- Hello World

    <Android Studio开发实战>学习(一)- Hello World 背景 Android Studio的安装 Android Studio的启动和运行 运行小应用Hello Wo ...

  8. 《Android Studio 开发实战从零基础到App上线》笔记1

    <Android Studio 开发实战从零基础到App上线>笔记1 前言 在吉林大学Android studio实践的课程上,因为时间有限,教授教授地很不细致,主要讲了初级控件和中级控件 ...

  9. 《Android Studio开发实战》学习(六)- 下拉框

    <Android Studio开发实战>学习(六)- 下拉框 背景 下拉框Spinner的使用 数组适配器ArrayAdapter的使用 简单适配器SimpleAdapter的使用 布局文 ...

最新文章

  1. 插入u盘计算机未响应,win7系统插入u盘死机怎么办|win7插入u盘无响应的解决方法...
  2. Service-policy 的出入(QOS)
  3. 二值mask图像 + RGB原图 生成可视化分割结果; 从二值mask获取分割轮廓点
  4. debian linux 安装smb 配置
  5. Mysql基本用法-01
  6. vite方式创建vue项目
  7. 【前端 · 面试 】JavaScript 之你不一定会的基础题(二)
  8. Q99:当Bezier曲面(Utah Teapot)同时遇上“噪声纹理”和“Phong反射模型”
  9. 2-机器学习入门-读书笔记
  10. Tableau 2021安装教程
  11. LINUX下安装svn客户端
  12. .NET Framework 4 中的新增功能【转载】
  13. MarkDownPad 2实用教程
  14. Android 设置应用启动动画
  15. Linux内核编译基础
  16. 计算机管理损坏的图像,win7系统提示损坏的图像的解决方法
  17. 办理护照(学生集体户口)~备用
  18. android+查询彩信号码,android 短信 彩信 数据库
  19. 丁丽萍:云计算环境下的隐蔽信道分析
  20. oracle rac vip什么用,Oracle VIP说明

热门文章

  1. g2plot 水滴图,包含数据更新时渲染问题
  2. Promise(解决回调地狱)
  3. JS 异步编程的解决方案,以及回调地狱的解决方案
  4. 游戏设计模式-观察者模式
  5. 关于重装系统后部分文件呈绿色的原因
  6. 一对一直播源码,一对一直播平台将普及我们的生活
  7. processing实现图像碎片化
  8. 【Reward is enough】Sutton、DavidSilver师徒联手:奖励机制足够实现各种目标。
  9. Visdom 介绍 | 二
  10. 一、线性模型----Lasso、Ridge回归及正则化的初步理解