资源描述
学校代码: 10128
学 号: 201320201007
嵌入式系统综合设计说明书
题 目:基于android平台的数字移动乐游戏
学生姓名:李乐峰
学 院:信息工程学院
班 级:计算机13-1班
指导教师:刘志强 王晓强 张志华 田雨
二 〇 一 六 年 七 月
基于android平台的数字移动乐游戏
摘要
现如今,基于android平台的游戏已经慢慢的渗透了我们每个人的生活中,扮演着越来越重要的角色。可以说,随着手机软件的迅猛发展,手机游戏已不仅仅是一个简单的供人们消遣、娱乐的活动,它已成为一种潮流、一种文化,就如同如今的我们离不开手机一样,几乎人们的每一个手机上都会下载一款游戏。
基于android平台的数字游戏—2048,它是一款益智类的游戏,集娱乐性、趣味性、教育性于一身。益智类游戏有助于开发人类的大脑,通过开动大脑去获取游戏的胜利。这样通过娱乐获取知识,做到了在娱乐中学习,娱乐中成长。
本文通过对基于android平台的数字移动乐游戏的初步研究,确定了开发一款2048游戏。该款游戏主要实现了用户通过注册登录后进入游戏界面,然后进行向左、右、上、下滑动,相同的卡片进行相加,游戏结束时得到相应的分数,同时可以看到自己的历史最高分,以及排行榜功能,通过这些功能,使得用户在如今倍感压力的社会下,拥有一丝轻松之感。
关键词:android;游戏;数字
Based on the android platform of digital mobile games
Abstract
Today, based on the android platform game has slowly infiltrated each person's life, plays a more and more important role. so to speak, with the rapid development of Internet, mobile phone games is not only a simple diversion, a form of entertainment for people, it has become a trend, a kind of culture, just as we cannot leave a mobile phone now, almost every phone people download a game.
Based on the number of the android platform game - 2048, it is a puzzle games, more interesting and entertaining and educational. Educational games help to develop the human brain, through the brain to get the victory of the game. Such access to knowledge through entertainment, accomplish the learning in the entertainment, entertainment.
This article through to the preliminary research on the digital game based on android platform, determine the development of a 2048 game. Games mainly realizes the user login through registration after entering the game interface, and then to the left, right, up, down, the same card in addition, to obtain the corresponding score at the end of the game, at the same time as you can see their own history, and the ranking function, through these function, makes the users in today under the pressure of society, have a relaxed feeling.
Key Words:Android;Game;Digit
目录
第一章 设计任务与要求 1
1.1设计任务 1
1.2 设计要求 1
第二章 设计方案 3
2.1 设计思想 3
2.2 设计功能 4
第三章 软件设计 7
3.1 布局设计 7
3.1.1 整体布局 7
3.1.2 设计游戏布局 7
3.2 主界面的实现 8
3.2.1 欢迎界面 8
3.2.2 登录界面 9
3.2.3 游戏界面 10
3.3 总体结构 12
3.3.1 系统模块流程图 12
3.3.2 登录模块 12
3.3.3 注册模块 13
3.3.4 游戏逻辑模块 13
3.3.5 排名模块 14
3.3.6 其他功能模块 15
3.4 源程序清单及注释 15
3.4.1 欢迎界面模块 15
3.4.2 登录模块 16
3.4.3 注册模块 18
3.4.4 游戏逻辑模块 19
3.4.5 排名模块 27
3.4.6 其他功能模块 28
第四章 调试过程 30
4.1 系统调试 30
4.1.1 游戏整体调试 30
4.1.2 游戏模式调试 30
4.2 实验步骤 30
4.3 遇到的问题 31
4.3.1 环境构建 31
4.3.2 软件编程 31
4.4 解决的方法 31
4.4.1 环境搭建 31
4.4.2 软件编程 31
4.5 调试结果 32
第五章 总结 35
致谢 36
参考文献 37
第一章 设计任务与要求
1.1设计任务
基于android平台的数字移动乐游戏,利用Eclipse集成开发环境+SDK+ADT环境,通过查看虚拟机,开发出一款益智类游戏。其设计任务如下:
1. 实现由欢迎界面到登录界面到游戏界面的跳转。
知识点:登录欢迎界面,activity跳转。
2. 在登录界面可以进行用户登录,可以包含用户名,便于实现排行榜的功能。
3. 进入游戏界面后可对屏幕中的卡片进行向左、右、上、下滑动,实现相同卡片的相加,从而得到相应的得分。
4. 实现重新开始游戏,结束的判断。
5. 成绩排行榜功能,实现最高成绩或前三名。
知识点:显示可以用ListView或TextView;游戏结束或开始可以让用户输入用户名;游戏成绩可以存储在文件或偏好设置中。
对各个用户的最高分进行显示,即排行榜功能,可利用一个button按钮来实现。同时每一个用户在玩游戏时可以看到自己的历史最高分。
6. 设计一个退出按钮。
第一次点击退出按钮,提示(并不退出程序);第二次点击退出按钮,成功退出程序。知识点:程序结束,activity结束;获取当前时间;button的onclick()事件;toast提示框。
1.2 设计要求
对项目实现分析、编码、测试等,主要实现功能包括如下:
1.实现界面的设计,通过自定义TextView以FrameLayout实现;
2.完成不同卡片的数字移动;
3.对分数的总结,以及游戏重新开始,结束的判断;
4.随机数字产生等。
环境要求:操作系统:Windows 10
平台:Eclipse集成开发环境+SDK+ADT
开发语言:Java
文档环境:Windows Office
第二章 设计方案
2.1 设计思想
设计游戏界面,利用linearlayout线性布局,嵌套三个linearlayout,嵌套的第一个linearlayout用于显示得分,第二个linearlayout显示历史最高分,第三个linearlayout中设计三个button按钮,实现重新开始、排行榜和退出功能。其中在游戏界面中间设计一个4*4的表格,采用自定义控件。
设计自定义控件时,首先要创建一个card类继承FrameLayout帧布局,通过card类定义每一个小卡片。然后再创建一个类继承自GridLayout表格布局,在其中实现屏幕显示16个小卡片,并可以在游戏开始时产生两个随机数。
在设计2048游戏最核心的就是算法的实现:
1. 在游戏开始时可以随机生成数字2或4,生成0时不显示是将卡片为0时的背景色与定义每一个小卡片的背景色相同。
2. 判断上下左右滑动。
确定手按下的那个位置和抬起手的位置之间的位移量,为了避免不仅限于平移,所以在判断上下左右滑动时需要先判断在x和y轴方向谁的位移量的绝对值大,若x(y)轴位移量的绝对值大,则再进行判断,若位移量为负数,则向左(下)滑动;如果位移量为正,则向右(上)滑动。
3. 实现上下左右滑动。
其基本原理是:以向左滑动为例讲解,其他的方向基本相似。左右是对于列进行判断,上下是对于行进行判断。当判断是向左滑动时,主要对列进行判断。除掉第一列以外的卡片,判断右边是否存在一个大于零的卡片,如果存在,再判断其相邻左边的卡片是否为零如果为零,则将左边的卡片的值置为右边卡片的值,并将右边卡片清零;如果相邻左边的卡片与右边卡片值相同,则将左边卡片的值乘2。
向左可以移动有两个条件:(1)右侧卡片不为零,左边为零,则可直接平移到左边。(2)左侧卡片于右侧卡片大小相同,则将左侧卡片乘2,右边清零。
此外,在设计基于android平台的数字移动乐游戏,除了核心算法以外其他基本设计如下:
1. 同时具有记录分数功能。
游戏通过上下左右滑动,将在游戏相同卡片情况下的卡片累加起来,得到相应的得分。在MainActivity类中增加就和函数,设置清零函数。
2. 游戏可以终止。
当游戏出现16个卡片全被铺满且相邻两个卡片之间不相同,则游戏结束。
3. 重新开始游戏。
直接调用游戏开始游戏的函数,并将分数清零。
4. 退出游戏。
第一次点击退出按钮,提示(并不退出程序);第二次点击退出按钮,成功退出程序。利用Handler第一次点击距离第二次点击按钮时间延迟在2秒钟内,则退回到桌面,否则不退出。
5. 游戏排行榜功能。
首先说明一下:排行榜功能,实现了对于所有用户的历史最高分进行排名。取得前三的用户以及所对应的最高成绩。
将用户和历史最高分数通过getString()方法读取出来,分别放到两个数组里,然后进行对历史最高分进行排序。排序时同时将账户名进行调换,用户最大成绩以及相应的用户,然后通过ListView显示出来。此过程需要在游戏界面设计一个button按钮,点击后跳转到另一个activity页面,将所有用户的成绩排序显示出来。
6. 用户注册和登录。
注册:用户可以进行注册有三个条件:
(1)得到已经存在的用户数量,如果为为空,直接进行注册。不为空进行第二步。
(2)通过查找已经存在的用户名,该用户名不存在,则可以进行注册。
(3)输入的用户名和密码不为空,则可以进行注册。
通过偏好设置,将注册的用户名和密码保存在user中,同时记录number的个数。
登录:主要通过注册得到的用户信息与登录的信息进行比较,账户密码均相同则登录成功,执行跳转进入游戏界面。否则提示密码错误或用户不存在。
2.2 设计功能
基于android平台的数字游戏主要提供的功能如下:
1. 用户点击此APP进入欢迎界面,间隔2s后进入用户注册登录界面。
通过编写welcome.xml以及编写一个welcome.java继承activity父类,通过使用使用Handle对象处理handleMessage方法,利用intent实现从本界面经过2秒钟的时间跳转到user界面。
在界面中设置宽高为match_parent,通过如下代码插入图片。
android:background="@drawable/xmb"
2. 登录成功后,进入游戏界面。
登录界面保存数据采用偏好设置,首先要对用户进行保存。通过SharedPreferences对象的edit()方法,来获取Editor对象;然后调用Editor对象的put()方法把数据存放到SharedPreferences对象中。put()方法有两个参数,第一个是存储数据的键信息,第二个是存储数据的值信息。最后要调用Editor对象的commit()方法来把数据保存到XML文件中,如果不调用commit()方法数据是不会写入到文件中的。然后要调用SharedPreferences对象的get()方法来读取,该方法有两个参数,第一个是要读取数据的键信息,第二个是默认返回值,即如果没有读取到相关数据,可以使用这个值作为默认值返回。
从登录界面进入游戏界面采用intent跳转。
3. 开始游戏,同时记录得分。
记录分数只需要将在向上下左右滑动时,在左边卡片相加的结果累加起来即可。那么需要编写一个求和函数add(int s),最后将求得的score显示出来。
4. 具有重新开始游戏功能。
编写一个startgame()函数,将16个卡片清零,并随机生成两个数字2或4,分数清零。
5. 具有记录历史最高分功能。
编写一个判断函数,首先需要当前的历史最高分读取出来,然后与游戏结束所得道的分数进行比较,小于则将游戏结束所得的分数保存在某个用户下的max1中,否则不变化。
6. 具有游戏结束功能并在游戏结束时进行提示是否重新开始。
编写一个游戏结束函数,判断游戏结束如在设计思想中提到的,提示重新开始利用AlertDialog对象调用方法实现。
7. 具有排行榜功能,对每个用户的最高成绩排序显示出来。
设计两个数组,一个用于记录用户账户,另一个用于记录该用户得到的历史最高分。通过偏好设置将每一个用户名记录在用户数组里,每一个用户的最高分记录在成绩数组里,通过下标相同确定每一个用户所对应的成绩。然后利用冒泡排序对成绩进行比较,显示出来。
8. 具有退出功能。
第一次点击退出按钮,提示(并不退出程序);第二次点击退出按钮,成功退出程序。
在这个功能,利用Handler,第一次点击距离第二次点击按钮时间延迟在2秒钟内,则退回到桌面,否则不退出。
第三章 软件设计
3.1 布局设计
3.1.1 整体布局
首先是进入欢迎界面,再进入用户登录界面,最后进入游戏界面。需要在res/layout建立welcome.xml,user.xml,activity _main.xml文件。在AndroidManifest.xml中依次进行增加活动,并仅设置welcome.xml为程序入口。
图3.1.1 整体布局
3.1.2 设计游戏布局
采用linearlayout线性布局,规定最外层线性布局的方向为垂直方向,将所有的控件处于同一列中。嵌套三个linearlayout和一个自定义控件。第一个linearlayout布局方向为水平,且包含两个textview文本视图,一个显示“成绩:”,另一个计算得分;第二个linearlayout布局方向也为水平,同样包含两个textview文本视图,一个显示“历史最高分:”,另一个显示最高的分数;中间加了一个自定义的gridlayout布局,形成4*4的表格;最后一个linearlayout布局方向为水平,包含三个按钮:第一个是重新开始,第二个是排行榜,第三个是退出按钮。
图3.1.2 设计游戏布局
3.2 主界面的实现
3.2.1 欢迎界面
1.本界面主要通过编写welcome.xml以及编写一个welcome.java继承activity父类,通过使用使用Handle对象处理handleMessage方法,利用intent实现从本界面经过2秒钟的时间跳转到user界面。
2.在界面中利用设置宽高为match_parent,通过如下代码插入图片。
android:background="@drawable/xmb"
图3.2.1 欢迎界面
3.2.2 登录界面
登录界面采用线性布局方式,嵌套了三个linearlayout。第一个linearlayout包括一个textview,显示账户;一个editText输入账户名。第二个linearlayout同样包括一个textview显示密码;另一个editText输入密码;最后一个linearlayout包括注册和登录两个按钮。通过点击两个按钮可以实现实现相应的功能。点击登录通过两个activity的跳转,实现从用户界面跳转到游戏界面。
图3.2.2 登录界面
3.2.3 游戏界面
本界面通过利用linearlayout线性布局,嵌套三个linearlayout,嵌套的第一个linearlayout用于显示得分,第二个linearlayout显示历史最高分,第三个linearlayout中设计三个button按钮,实现重新开始、排行榜和退出功能。其中在游戏界面中间设计一个4*4的表格,利用gridlayout布局实现。
通过布局的结合使得游戏界面分为三部分,上边为记录游戏所得分数以及历史最高分,中间用于显示16个卡片,实现游戏的正常运行。最下边为三个按钮,实现重新开始游戏,查看排行榜,退出游戏。点击排行榜,跳转到另一个界面,查看最高分数的前三名。点击退出游戏,第一次提示再按一次退出,在间隔2秒钟按下第二次则退出有游戏,释放相应的资源。
图3.2.3 游戏界面
3.3 总体结构
3.3.1 系统模块流程图
系统流程图如图3.3.1:
图3.3.1 系统模块流程图
3.3.2 登录模块
图3.3.2 登录模块流程图
3.3.3 注册模块
图3.3.3 注册模块流程图
3.3.4 游戏逻辑模块
图3.3.4 判断滑动方向模块图
图3.3.5 游戏逻辑模块
3.3.5 排名模块
图3.3.5 排名模块流程图
3.3.6 其他功能模块
图3.3.6 退出流程图
3.4 源程序清单及注释
3.4.1 欢迎界面模块
public class Welcome extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) { //生命周期,回调函数
super.onCreate(savedInstanceState);
setContentView(R.layout.welcome);
mHandler.sendEmptyMessageDelayed(0, 2000);
}
Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
Intent intent = new Intent();
intent.setClass(Welcome.this, User.class);
startActivity(intent);
finish();
}
};
}
该模块主要利用mHandler.sendEmptyMessageDelayed(0, 2000),超过2秒钟进入handleMessage方法中执行跳转,通过利用intent执行 intent.setClass(Welcome.this, User.class);startActivity(intent);使得从welcome.class跳转到User.class界面,并释放资源。
同时需要在welcome.xml中插入图片。代码如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/xmb"
android:orientation="vertical" >
</LinearLayout>
3.4.2 登录模块
再注册后再进行登录。
实现登录的部分代码:
bt1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
SharedPreferences sharedPreferences= getSharedPreferences("user",MODE_PRIVATE);
String number=sharedPreferences.getString("number", "");
int a,b;
if(number==""){a=0;}//a用户个数
else {a=Integer.parseInt(number);} //再注册记录用户个数
String name;
String mima;
for(b=0;b<a;b++){
name="name"+b;
mima="mima"+b;
String jname=sharedPreferences.getString(name, "");
String jmima=sharedPreferences.getString(mima, "");
if(jname.equals(et1.getText().toString())||jmima.equals(et2.getText().toString())){
if(jname.equals(et1.getText().toString())&&jmima.equals(et2.getText().toString())){
a1=b;
finish();
Intent intent =new Intent(User.this,MainActivity.class);
startActivity(intent);
break;
}
else if(jname.equals(et1.getText().toString())){
Toast.makeText(User.this, "密码错误", Toast.LENGTH_SHORT).show();
break;
}
} }
if(b==a)
Toast.makeText(User.this, "账户未注册", Toast.LENGTH_SHORT).show();
}
});
点击登录按钮,通过点击监听,判断输入的账户和密码对于已经保存的账户和密码是否一致,如果一致则通过跳转进入游戏界面;如果登录名不相同,则显示账户未注册;登录名相同,密码不同。则提示密码错误。
3.4.3 注册模块
实现注册的部分代码:
bt2.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
String name;
String mima;
SharedPreferences sharedPreferences= getSharedPreferences("user",MODE_PRIVATE);
String number=sharedPreferences.getString("number", "");
int a;
int b=0;
if(number==""){a=0;}
else {a=Integer.parseInt(number);}
for(b=0;b<a;b++){
name="name"+b;
mima="mima"+b;
String jname=sharedPreferences.getString(name, "");
if(jname.equals(et1.getText().toString())){
break;
}
}
if(b==a){
if(et1.getText().toString().equals("")==true&&et2.getText().toString().equals("")==true){
Toast.makeText(User.this, "用户名密码不得为空!", Toast.LENGTH_SHORT).show();}else{
name="name"+b;
mima="mima"+b;
a++;
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString(name,et1.getText().toString());
editor.putString(mima,et2.getText().toString());
editor.putString("number", a+"");
mit();
Toast.makeText(User.this, "注册成功", Toast.LENGTH_SHORT).show();}
}
else
{
Toast.makeText(User.this, "存在该账户", Toast.LENGTH_SHORT).show();
}
}
});
}
点击注册按钮,通过点击监听,首先判断该用户输入的用户名是否已经存在(利用偏好设置读取已经存在的账户名),若存在则不执行。如果不存在,通过SharedPreferences对象的edit()方法,来获取Editor对象;然后调用Editor对象的put()方法把数据存放到SharedPreferences对象中。
3.4.4 游戏逻辑模块
首先此模块代码需要在一个继承自gridlayout类中编写,游戏逻辑模块包括以下几个函数:
1. 初始化游戏同时此函数中包含判断向上下左右滑动。
初始化函数代码如下:
private void initGame(){
setColumnCount(4);
setBackgroundColor(0xffbbada0);//argb:alpha,red,green,blue(各占两位) 红绿---黄
setOnTouchListener(new OnTouchListener() {
private float startx,starty,offsetx,offsety;
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
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) {//手势向左 -5表示范围 手机屏幕的大小来判断滑动方向
// Toast.makeText(getContext(), "左滑", Toast.LENGTH_LONG).show();
swipeleft(); //侦听用户操作操作执行该方法
}
else if (offsetx>5) {//手势向右滑动
// Toast.makeText(getContext(), "右滑", Toast.LENGTH_LONG).show();
swiperight();//侦听用户操作操作执行该方法
}
}else {//手势是垂直方向
if (offsety<-5) {//手势向上滑动
// Toast.makeText(getContext(), "上滑", Toast.LENGTH_LONG).show();
swipeup();//侦听用户操作操作执行该方法
}
if (offsety>5) {//手势向下滑动
// Toast.makeText(getContext(), "下滑", Toast.LENGTH_LONG).show();
swipedown();//侦听用户操作操作执行该方法
}
}
break;
}
return true;
}
});
}
2. 定义每个小卡片。
代码如下:
public Card(Context context) {
super(context);
tv=new TextView(getContext());//初始化文本
tv.setTextSize(32);//设置文本大小
tv.setGravity(Gravity.CENTER);设置文本居中
tv.setBackgroundColor(0x33ffffff);//每一个小卡片的背景色
LayoutParams par=new LayoutParams(-1,-1);
//该类用来初始化layout控件textView里的高和宽属性
par.setMargins(10,10,0,0);//使得方格左、上的间距均为10
addView(tv,par);
//该方法是用来给par控件加上已经初始化了的高和宽属性
// TODO Auto-generated constructor stub
}
3. 增加卡片,形成4*4的矩阵
private void addCard(int cardwidth,int cardheight){ //形成4*4的矩阵
Card c;
for(int y=0;y<4;y++){
for (int x = 0; x < 4; x++) {
c = new Card(getContext());//给卡片设置初始化数字
addView(c,cardwidth,cardheight);
//顺便把初始化时新建的卡片类存放到下面新建的二维数组里
cardmap[x][y]=c;
}
}
}
4. 设置手机屏幕宽高
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
// TODO Auto-generated method stub
//该方法就是宽高发生改变的时候我们可以得到当前的宽高是多少
//该方法也是在游戏一被创建的时候就调用,也就是用来初始宽高的方法
super.onSizeChanged(w, h, oldw, oldh);
int Cardwidth =(Math.min(w, h)-10)/4;
//获取手机较窄的长度,-10是用来间隔每个卡片的距离,用手机的宽除以4就是每个卡片的长度了
addCard(Cardwidth, Cardwidth); //
//在该方法初始化的时候新建16个卡片,以下是方法
startGame();
}
5. 产生随机数
代码如下:
public void setNum(int num){
//由于我们需要在这个设置数字的方法导入随机数字,而为了排除出现0,我们需要在原方法里加上判断语句
public void setNum(int num){
this.num=num;
if (num<=0) {
tv.setText("");
tv.setBackgroundColor
展开阅读全文