android2048项目报告,Android项目开发实战-2048游戏
《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游戏相关推荐
- 微信小程序电商项目商品详情页开发实战之数据绑定与事件应用
各位CSDN的朋友,我们都知道,现在微信小程序电商平台特别火爆,所以我将以一个生鲜电商项目为例,为大家讲述微信小程序的实战化开发,价值几万元的成熟项目,你可千万不要错过哦. 大家直接通过视频链接直接看 ...
- java游戏演示ppt_java项目开发实战──五子棋游戏.ppt
java项目开发实战──五子棋游戏.ppt 还剩 23页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,很抱歉,此页已超出免费预览范围啦! 如果喜欢就下载吧,价低环保! 内容要点: 第 24 ...
- android天气预报项目总结报告,Android项目:天气预报App
一 介绍 该项目是在Android Studio的环境下实现的,主要是仿照了小米10手机上的天气预报App. 二 效果图 三 页面介绍 1.主界面 ...
- 《Android Studio开发实战 从零基础到App上线(第2版)》出版后记
2015年11月23日,鄙人在csdn发表了第一篇技术文章,掐指一算距今已有三年.遥想当年开写博客,只是为了总结经验同时分享出来,后来机缘巧合受到出版社编辑邀请并出了书,完全是无心插柳的结果.当初写作 ...
- 《Android Studio开发实战 从零基础到App上线》源码运行问题解答
本书提供了所有章节的完整源码下载,自上市以来陆续收到读者的意见反馈,现将与源码有关的问题汇总归类如下,方便更多的朋友解决源码运行过程中发现的问题: 一.打开本书源码时,出现"Plugin w ...
- 《Android Studio开发实战 从零基础到App上线》第一版的资源下载和内容勘误
资源下载 下面是<Android Studio开发实战 从零基础到App上线>(第一版)一书用到的工具和代码资源: 1.本书使用的Android Studio版本为2.2.3,因为Andr ...
- 《Android Studio开发实战》学习(一)- Hello World
<Android Studio开发实战>学习(一)- Hello World 背景 Android Studio的安装 Android Studio的启动和运行 运行小应用Hello Wo ...
- 《Android Studio 开发实战从零基础到App上线》笔记1
<Android Studio 开发实战从零基础到App上线>笔记1 前言 在吉林大学Android studio实践的课程上,因为时间有限,教授教授地很不细致,主要讲了初级控件和中级控件 ...
- 《Android Studio开发实战》学习(六)- 下拉框
<Android Studio开发实战>学习(六)- 下拉框 背景 下拉框Spinner的使用 数组适配器ArrayAdapter的使用 简单适配器SimpleAdapter的使用 布局文 ...
最新文章
- 插入u盘计算机未响应,win7系统插入u盘死机怎么办|win7插入u盘无响应的解决方法...
- Service-policy 的出入(QOS)
- 二值mask图像 + RGB原图 生成可视化分割结果; 从二值mask获取分割轮廓点
- debian linux 安装smb 配置
- Mysql基本用法-01
- vite方式创建vue项目
- 【前端 · 面试 】JavaScript 之你不一定会的基础题(二)
- Q99:当Bezier曲面(Utah Teapot)同时遇上“噪声纹理”和“Phong反射模型”
- 2-机器学习入门-读书笔记
- Tableau 2021安装教程
- LINUX下安装svn客户端
- .NET Framework 4 中的新增功能【转载】
- MarkDownPad 2实用教程
- Android 设置应用启动动画
- Linux内核编译基础
- 计算机管理损坏的图像,win7系统提示损坏的图像的解决方法
- 办理护照(学生集体户口)~备用
- android+查询彩信号码,android 短信 彩信 数据库
- 丁丽萍:云计算环境下的隐蔽信道分析
- oracle rac vip什么用,Oracle VIP说明