自学Android一个月多了,一直在工作之余零零散散地看一些东西。感觉经常使用的东西都有些了解了,可是一開始写代码总会出各种奇葩的问题。感觉还是代码写得太少。这样继续杂乱地学习下去进度也太慢了,并且学一点忘一点,效率太低。所以从今天開始。我打算实际做点小程序。在开发中不断地学习吧。

恰好近期Android上有个游戏2048比較火,所以就那这个练手吧。

由于对Android还没有太深入的了解,所以我写的东西都会比較基础,所以须要看一些高阶开发的朋友能够绕过了,也希望能够有高手们给我一些指导和建议,在此先谢谢啦。

还有在学习过程中參考了非常多网友之前写的样例(參考内容太多无法一一列举),所以代码思路不是全然原创的,可是都是我自己写的,一定会有非常多问题,希望大家指正。

废话不多说了,接下来就是我在尝试开发Android版2048的一些记录。

今天是第一天,我主要实现对游戏4*4界面的布局。以及程序初始化时在随机位置生成2或4。

布局文件主要使用GridLayout,使用这个布局能够非常方便地实现类似web开发中Table那样的界面。比如我在非常多样例中,比方虚拟键盘、日历什么的非常多都是用的GridLayout布局。另外。GridLayout是在4.0版本号之后提供的,假设须要在之前的版本号执行,须要引入其他的包(问度娘就可以)。

首先,我们得准备几个图片,分别相应数字2一直到2048(假设想要很多其它能够多做几个比方4096甚至更高)。由于本人对美工不擅长。所以临时先从别人的程序里取了几张图片。

接下来看代码。凝视写得比較具体(尽管不规范)。所以我就不多说了

Activity:

package com.example.t2048;

import java.util.ArrayList;
import java.util.List;
import java.util.Random; import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.GridLayout;
import android.widget.ImageView; public class MainActivity extends Activity { GridLayout gridLayout = null; //用于保存空格的位置
List<Integer> spaceList = new ArrayList<Integer>();
//用于保存有数字格的位置
List<Integer> stuffList = new ArrayList<Integer>(); /**
* 图标数组
*/
private final int[] icons = { R.drawable.but_empty, R.drawable.but2,
R.drawable.but4, R.drawable.but8, R.drawable.but16,
R.drawable.but32, R.drawable.but64, R.drawable.but128,
R.drawable.but256, R.drawable.but512, R.drawable.but1024,
R.drawable.but2048, R.drawable.but4096 }; protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); gridLayout = (GridLayout) findViewById(R.id.GridLayout1); init();
} //初始化界面
public void init(){ //首先在16个各种都填上空白的图片
for(int i=0;i<16;i++){
View view = View.inflate(this, R.layout.item, null);
ImageView image = (ImageView) view.findViewById(R.id.image); image.setBackgroundResource(icons[0]);
spaceList.add(i);
gridLayout.addView(view);
} //在界面中随机增加两个2或者4
addRandomItem();
addRandomItem();
} //从空格列表中随机获取位置
public int getRandomIndex(){
Random random = new Random();
if(spaceList.size()>0)
return random.nextInt(spaceList.size());
else
return -1;
} //在空白格中随机增加数字2
public void addRandomItem(){
int index = getRandomIndex();
if(index!=-1){
//获取相应坐标所相应的View
View view = gridLayout.getChildAt(spaceList.get(index));
ImageView image = (ImageView) view.findViewById(R.id.image);
//随机生成数字1或2
int i = (int) Math.round(Math.random()+1);
//将当前格子的图片置换为2或者4
image.setBackgroundResource(icons[i]);
//在空白列表中去掉这个格子
//spaceList.remove(spaceList.indexOf(index)); 该行代码写错,导致附录中的的问题
spaceList.remove(index); //修正后的代码 }
} public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
} }

activity_main.xml

<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/GridLayout1"
android:background="#708090"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:rowCount="4"
android:columnCount="4"
android:padding="20dp"
> </GridLayout>

item.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/FrameLayout1"
android:layout_width="match_parent"
android:layout_height="match_parent" > <ImageView
android:id="@+id/image"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:padding="3dp" /> </FrameLayout>

代码就这么多。整体还是比較简单的,当然,我眼下先仅仅考虑实现。没有考虑效率的问题。

以下是执行界面截图

界面比較简陋,可是最主要的布局我们已经实现了。在今后我会不断补充,把这个做的更加完整。

附:

眼下这个代码执行起来,偶尔还会报错。我查了一下。临时没有发现问题在哪,假设知道哪里有问题的,麻烦留言告诉我一下。当然,假设我找到了问题。也会更新到这篇博客里的。

以下是报错时log的截图:

问题的解决:

昨天晚上又跟了一下代码,发现确实是自己疏忽写错了

问题在Activity中的第81行

spaceList.remove(spaceList.indexOf(index));

remove中应该传入index。我不小心写成index相应的值了

spaceList.remove(index);

改成这样后,我測试了一下,没有问题了。我在上文的代码中已经改动


从零開始开发Android版2048 (一)初始化界面的更多相关文章

  1. 从零開始开发Android版2048 (二)获取手势信息

    今天是尝试開始Android版2048小游戏的第二天.在今天,我主要学习了怎样获取用户在屏幕滑动的手势,以及对布局进行了一些小小的完好. 获取用户操作的手势(比方向左滑.向右滑等)主要用到了Gestu ...

  2. 从零開始开发Android版2048 (四) 分数、重置、结束

    这一篇的内容主要是在上一篇的基础上,增加分数计算(包含当前分数和最高分数).游戏结束的推断以及游戏界面的重置这三个部分的功能. 一.分数的计算和保存          首先,2048这个游戏的分数包含 ...

  3. 从零開始开发Android版2048 (三)逻辑推断

    近期工作比較忙,所以更新的慢了一点,今天的主要内容是关于Android版2048的逻辑推断,经过本篇的解说,基本上完毕了这个游戏的主体部分. 首先还是看一下,我在实现2048时用到的一些存储的数据结构 ...

  4. 从零開始开发Android版2048 (五) 撤销的实现

    本篇的内容是,在前一篇的基础上添�了撤销的功能.撤销事实上就是将当前的用户界面恢复到这次滑动值前的样子.我实现撤销的主要原理是,将每次滑动后界面上的格子和相应的数字记录下来,当然还有分数,把这些数据写 ...

  5. Bmob移动后端云服务平台--Android从零開始--(二)android高速入门

    Bmob移动后端云服务平台--Android从零開始--(二)android高速入门 上一篇博文我们简介何为Bmob移动后端服务平台,以及其相关功能和优势. 本文将利用Bmob高速实现简单样例,进一步 ...

  6. 从零開始学android&lt;TabHost标签组件.二十九.&gt;

    TabHost主要特点是能够在一个窗体中显示多组标签栏的内容,在Android系统之中每一个标签栏就称为一个Tab.而包括这多个标签栏的容器就将其称为TabHost.TabHost类的继承结构例如以下 ...

  7. 第13章、布局Layouts之RelativeLayout相对布局(从零開始学Android)

    RelativeLayout相对布局 RelativeLayout是一种相对布局,控件的位置是依照相对位置来计算的,后一个控件在什么位置依赖于前一个控件的基本位置,是布局最经常使用,也是最灵活的一种布 ...

  8. 从零開始学android&lt;SeekBar滑动组件.二十二.&gt;

    拖动条能够由用户自己进行手工的调节,比如:当用户须要调整播放器音量或者是电影的播放进度时都会使用到拖动条,SeekBar类的定义结构例如以下所看到的: java.lang.Object    ↳ an ...

  9. 从零開始学android&lt;数据存储(1)SharedPreferences属性文件.三十五.&gt;

    在android中有五种保存数据的方法.各自是: Shared Preferences Store private primitive data in key-value pairs. 相应属性的键值 ...

随机推荐

  1. loadView 与 ViewDidLoad

    每个ios开发者对loadView和viewDidLoad肯定都很熟悉,虽然这两个函数使用上真的是非常简单,但是和类似的initWithNibName/awakeFromNib/initWithCod ...

  2. 一些Swift编程语言的相关资料

    苹果官方Swift文档<The Swift Programming Language> 苹果开发者Swift文档及介绍 中文版Apple官方Swift教程(Github协作翻译中) Git ...

  3. MyEclipse10.6导出war包出错

    在右键选中项目->export->java ee ->war 的时候,一点就报错SECURITY ALERT:INTEGRITY CHECK ...,之后自动关闭 这个问题是因为用的 ...

  4. BlockingQueue-线程的阻塞队列

    BlockingQueue作为线程容器,可以为线程同步提供有力的保障,其主要用到的方法包括: add(E o); //将指定的元素添加到此队列中(如果立即可行),在成功时返回 true,其他情况则抛出 ...

  5. [ZOJ 3631] Watashi's BG

    Watashi's BG Time Limit: 3 Seconds      Memory Limit: 65536 KB Watashi is the couch of ZJU-ICPC Team ...

  6. Devexpress之popupMenu

    1.拖放一个BarManager控件barManager1和一个PopupMenu控件popupMenu1 2.设置popupMenu1的Manager属性为barManager1 3.拖放一个Tex ...

  7. linux 以root用户登录ftp

    ftp默认禁止以root用户登录. 可以修改 /etc/ftpusers 文件,把root注释掉,即可以root用户登录ftp

  8. [洛谷U871]building

    题目来源:http://www.luogu.org/problem/show?pid=U871# [题目背景 Background] WOW是BLIZZARD公司开发的一款网络游戏,游戏的背景是处在一 ...

  9. Maven3.0.3的环境变量配置

    Maven3.0.3的环境变量配置 //该配置经过实际验证已经可以使用.验证的环境maven3.0.3(官网的目前最新版)1 windows maven3的安装 标签: #maven |  发布时间: ...

  10. Codevs 3286 火柴排队 2013年NOIP全国联赛提高组 树状数组,逆序对

    题目:http://codevs.cn/problem/3286/ 3286 火柴排队  2013年NOIP全国联赛提高组  时间限制: 1 s   空间限制: 128000 KB   题目等级 : ...