基于Android系统的手机游戏(2048)的设计与实现

发布于:2022-11-29 ⋅ 阅读:(259) ⋅ 点赞:(0)

目 录
摘 要 I
Abstract II
第一章 绪论 5
1.1选题背景及意义 5
1.1.1选题背景 5
1.1.2选题意义 6
1.2发展现状 6
1.3研究主要内容 7
第二章 关键技术分析 8
2.1开发工具及技术 8
2.1.1 Eclipse 8
2.1.2 SDK 8
2.1.3 ADT 8
2.1.4 Android 开发 8
2.2开发环境的搭建 11
2.2.1安装 JDK 与配置 Java 环境变量 11
2.2.2安装 Eclipse 11
2.2.3安装 Android SDK 11
2.2.4为Eclipse 安装 ADT 插件 11
2.2.5创建 AVD 11
第三章 系统分析 12
3.1可行性研究 12
3.1.1技术可行性 12
3.1.2经济可行性 12
3.1.3法律可行性 12
3.2总体要求 12
3.3需求分析 13
3.3.1用户需求 13
3.3.2系统功能需求与非功能需求 13
第四章 系统设计 15
4.1总体设计 15
4.1.1模块介绍 15
4.1.2体系结构设计 15
4.2详细设计 15
4.2.1系统流程的设计 15
4.2.2界面设计 16
4.2.3按钮设计 17
4.2.4算法设计 17
第五章 系统实现 19
5.1界面实现 19
5.1.1全局配置文件 19
5.1.2欢迎界面设计 20
5.1.3游戏主界面 23
5.2游戏设计 26
5.2.1卡片的实现 26
5.2.2卡片滑动的实现 29
5.2.3其他功能实现 35
第六章 系统测试 39
6.1软件测试的重要性 39
6.1软件测试的原则 39
6.2测试实例的研究与选择 40
6.3测试环境与测试条件 40
6.4主要测试过程 41
6.5.1流程测试 41
6.5.2游戏运行测试 41
6.6系统评价 41
第七章 总结 42
参考文献 43
致 谢 44
本次课题研究的基于Android系统的手机游戏等设计与实现,主要对2048游戏所实现地功能进行需求分析,对图形和系统性能进行了分析,分析图形地特点和实现地可行性。对系统地性能进行了详细地分析,同时也提出来解决性能问题地解决方案。对系统的流程,系统所需的图形文件,系统地总体架构和系统用例进行设计。通过分析、设计能更加具体地了解系统功能,对2048手机游戏所要实现 地功能和图形文件会有更深地认识。
系统主要实现以下地几个功能:关卡选择、呈现游戏界面、重新开始游戏、当前分数和最高分数、游戏帮助等功能。从总体出发,将该系统划分为三大模块:菜单设计、界面设计、和算法设计。
菜单设计实现等是在游戏界面实现,可进一步划分为三个模块,分别是:游戏帮助、重新开始、关卡选择。
界面设计可进一步划分为:主界面设计、游戏界面设计、关卡界面设计。
算法设计可化为三种:(1)当有两张卡片相同时,向它们可以碰撞地方向滑屏,卡片会移动到最底边并生成其两倍数字地卡片,并且生成一个2或4的卡片;(2)当有两张卡片相同时,且在他相同地方向有张跟它们之和地卡片,向它们可以碰撞地方向滑屏,相同地卡片会移动到无法移 动地位置并生成期两倍数字地卡片,但合成地卡片不会跟那张两倍数字地卡片合并,并且生成一个2或4的卡片(3)当界面上没有空位并且两两相邻的,卡片不相同时游戏结束。
3.2总体要求
本软件使用的开发工具主要是 Eclipse 和Android SDK,并且 SDK 版本要求 2.0 以上, 开发语言是 Java 和xml,最终产品适用于 Android 系统的智能手机。
功能要求:该设计要满足 2048 游戏的基本要求,在此基础上还应该具体另外一种模式, 即“酷车一族”,玩家可以在两种模式下随意转换。系统要求流畅,界面美观。本游戏为了设计、实现和后期维护的方便,以及系统用户使用的便利,所以必须采取一定的设计原则。其主要设计原则有:
实用性:要求本系统能够满足大众休闲娱乐的需求,因此具有良好的实用性。
简单性:在实现游戏的功能的同时,尽量让游戏操作简单易懂,这对于一个游戏来说是非常重要的。
针对性:本游戏设计是益智类的数字游戏的需求定向开发设计,所以具有专业突出和很强的针对性。
一致性:界面设计一致性:页面整体设计风格、界面元素的美观风格、摆放位置、整体页面布局和用图用色风格保持一致。变量命名规则的一致性:变量应该用统一的规则进行命名,做到任意变量均能从上下文推断其义。
2048 游戏规则:
开始时棋盘内随机出现两个数字,出现的数字仅可能为 2 或 4;
玩家可以选择上下左右四个方向,若棋盘内的数字出现位移或合并,视为有效移动; 玩家选择的方向上若有相同的数字则合并,本文转载自http://www.biyezuopin.vip/onews.asp?id=14222每次有效移动可以同时合并,但不可以连续合并;
合并所得的所有新生成数字相加即为该步的有效得分; 玩家选择的方向行或列前方有空格则出现位移;
每有效移动一步,棋盘的空位(无数字处)随机出现一个数字(依然可能为 2 或 4); 棋盘被数字填满,无法进行有效移动,游戏结束;
游戏结束出现玩家本次游戏所得分数,计分是每次合并所得数字累加,总和即为总分。
3.3需求分析
需求分析实际上是调查、评价以至肯定用户对软件需求的过程,其目的在于精华软件的作用范围,也是分析和确认软件系统构成的过程,以确定未来系统的主要成分以及它们之间的接口细节,是完整地、严密地描述应当“做什么”的一种过程。
3.3.1用户需求
本设计主要是一款益智类的手机小游戏,一次用户要求也就十分简单,仅仅满足游戏界面美观,能够正常操作,并且运行流畅即可,具有休闲娱乐的作用。
3.3.2系统功能需求与非功能需求
功能需求是必须在产品中实现的软件功能,用户利用这些功能来完成任务,满足业务需求。该游戏应当具备以下功能:欢迎界面(包括开始游戏和退出游戏按钮)、游戏界面、游戏模式选择、当前分数与最高分、重新开始游戏选项等。

package com.android.graduationpro;

import com.pplo.tzfe.R;

import android.app.ActionBar;
//首先必须在AndroidManifest.xml中指定
//Application或Activity的theme是Theme.Holo或其子类,否则将无法使用ActionBar

import android.app.AlertDialog;//对话框
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.view.Menu;
import android.view.MenuItem;

public class MainActivity extends FragmentActivity {

	Intent intent;
	private GameView gameView;
	private int score = 0;
	private static MainActivity mainActivity = null;
	private ActionBar actionBar;
	private MusicServer ms;

	public MainActivity() {
		mainActivity = this;
	}

	public void clearScore() {
		score = 0;
	}

	public void showScore() {
		actionBar.setTitle("当前分数: " + this.score);
		if (this.score > DataUtil.loadTopScore(this)) {
			DataUtil.saveTopScore(this, score);
		}
		actionBar.setSubtitle("最高分数 : " + DataUtil.loadTopScore(this));
	}
	//actionBar中使用setTitle和setSubTitle设置一个主标题,一个子标题
	
	public void showScore(int score) {
		this.score = score;
		actionBar.setTitle("当前分数: " + this.score);
		if (this.score > DataUtil.loadTopScore(this)) {
			DataUtil.saveTopScore(this, score);
		}
		actionBar.setSubtitle("最高分数 : " + DataUtil.loadTopScore(this));
	}

	public int getScore() {
		return score;
	}

	public void addScore(int addScore) {
		score = score + addScore;
		showScore();
	}

	public static MainActivity getMainActivity() {
		return mainActivity;
	}

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		actionBar = getActionBar();
		actionBar.setSubtitle("最高分数: " + DataUtil.loadTopScore(this));
		setContentView(R.layout.activity_main);
		gameView = (GameView) findViewById(R.id.gameView);
		
		/*设置actionBar的背景
		Resources r = getResources();
		Drawable myDrawable = r.getDrawable(R.drawable.buttonbg);
		actionBar.setBackgroundDrawable(myDrawable);          */
	}
	
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {//在Activity中创建ActionBar

		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.remain, menu);
		//remain.xml指定ActionBar中的每个交互项即Actions
		return true;
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {    //Action按钮交互,菜单响应(重写就可以自定义了)
		// Handle action bar item clicks here. The action bar will
		// automatically handle clicks on the Home/Up button, so long
		// as you specify a parent activity in AndroidManifest.xml.
		switch (item.getItemId()) {
		case R.id.action_refresh:
			new AlertDialog.Builder(this)  //Builder方法形成了一个对象链
					.setTitle("重新开始")
					.setMessage(
							"你已经得了 "
									+ MainActivity.getMainActivity().getScore()
									+ " 分!!!\n确定要重新开始游戏吗?")
					.setNegativeButton("取消",
							new DialogInterface.OnClickListener() {

								@Override
								public void onClick(DialogInterface dialog,
										int which) {
									// TODO Auto-generated method stub

								}

							})
					.setPositiveButton("重新开始",
							new DialogInterface.OnClickListener() {

								@Override
								public void onClick(DialogInterface dialog,
										int which) {
									// TODO Auto-generated method stub
									gameView.clearData();
									gameView.startGame();
								}
							}).show();

			break;
		case R.id.action_name:
			String items[] = { "传统数字", "酷车一族" };
			new AlertDialog.Builder(this).setTitle("模式选择")
					.setItems(items, new OnClickListener() {

						@Override
						public void onClick(DialogInterface dialog, int which) {
							// TODO Auto-generated method stub
							switch (which) {
							case 0:
								DataUtil.saveType(MainActivity.this, 0);
								break;

							case 1:
								DataUtil.saveType(MainActivity.this, 1);
								break;
							default:
								break;
							}
							gameView.reName();//切换完模式以后数据没有变化,仅仅是显示方式改变
						}
					}).show();
			break;
		case R.id.close_voice:
			String voice[] = { "关闭音乐", "打开音乐" };
			new AlertDialog.Builder(this)
			.setTitle("音乐选项")
			.setItems(voice, new OnClickListener() {

						@Override
						public void onClick(DialogInterface dialog,int which) {
							// TODO Auto-generated method stub
							switch (which) {
							case 0:
								stopService( new Intent( "com.android.graduationpro.MusicServer" ) );
								break;
							case 1:
								startService( new Intent( "com.android.graduationpro.MusicServer" ) );
								break;
							default:
								break;
							}
							gameView.reName();
						}
					}).show();
			break;
		default:
			break;
		}
		return super.onOptionsItemSelected(item);
	}

	@Override
	protected void onPause() {
		// TODO Auto-generated method stub
		super.onPause();
		gameView.saveMap();

	}

	@Override
	protected void onDestroy() {
		// TODO Auto-generated method stub
		super.onDestroy();

	}
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文含有隐藏内容,请 开通VIP 后查看