安卓课程设计(台球游戏) - 范文中心

安卓课程设计(台球游戏)

08/05

计算机学院课程设计

专 业:课程名称:课题名称: 教 师: 学 号:

计算机应用技术 3G开发基础 台球游戏系统 姓 名:

2013 年 9月 20 日 ——2013 年 12 月 25 日 目录

前言

Android是基于开放性内核的,是公司在2007年11月5日公布的手机操作系统。早期由原名为“Android”的公司开发,谷歌在2005年收购“Android.Inc”后,继续进行对Android系统开发运营,它采用了软件堆层的架构,主要分为三部分。底层Linux内核只提供基本功能,其他的应用软件则由各公司自行开发,部分程序以Java编写。

2011年初数据显示,仅正式上市两年的操作系统Android已经超越称霸十年的塞班系统,使之跃居全球最受欢迎的智能手机平台。现在,Android系统不但应用于智能手机,也在平板电脑市场急速扩张。

综合本学期的学习,开发一款基于android环境的台球游戏,熟练掌握android应用开发。

一.课程设计目的

1.1关于java

1、熟悉Java开发环境,熟悉用Java完成一个应用程序的设计过程,掌握有关编 辑、调试和整合程序的方法和技巧。

2、通过此设计,了解Java语言的特点;熟悉Java程序的编写;体会Java语言在问题求解中的特点。 3、总结学习Java语言的心得和体会,并对Java课程设置提出自己的意见和建议。

1.2关于android

熟悉android开发环境,熟悉用java语言实现一个安卓程序的设计过程,掌握有关的设计技巧

1、熟悉android开发环境,熟悉用java语言实现一个安卓程序的设计过程,掌握有关的设计技巧

2、通过此课程设计,了解android系统的特点,掌握android相关的知识点。 3、总结学习android开发环境,熟悉用java语言实现一个安卓程序的设计过程,掌握有关的设计技巧

总结学习android的心得和体会,并且android课程提出自己的意见和建议,从中得到自己的学习心得和体会。

二.设计任务及要求

根据android课程学习,将手机台球游戏设计的总体设计框架以及详细的设计和实现过程通老师讲解和自己的理解将其全部以课程设计的方式书写出来。

三.总体设计框架

四.详细设计和实现过程

4.1配置开发环境

1、 安装JDK

首先将下载的jdk-6u24-windows-i586安装到C:\下 2、配置环境变量

选择计算机>右键>属性>高级设置>环境变量

CLASSPATH : .;%JAVA_HOME%\lib;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;

JAVA_HOME : C:\Program Files(x86)\Java\jdk1.6.0_24 Path : %JAVA_HOME%\bin; 将以上三个配置到环境变量中

3、安装eclipse

双击eclipse快捷方式图标,它会在你选择的路径下生成一个workspace文件夹,以后的项目都在这里面。 4、安装ADT

离线安装ADT:

点击eclipse上的help进入如图所示,点击add将ADT导入

若安装成功则会出现如图所示的navigate下面手机图标。

5、安装SDK

点击window进入preference,然后点击android,在SDK Location中导入SDK,安装成功之后如图所示。

4.2功能定义

台球游戏是根据人们日常中打台球的模式进行模拟式的通过点击按钮来调准角度并出击球杆。

选择【开始游戏】之后可选择【倒计时模式】和【练习模式】进行玩台球游戏,另外还可以点击【排行榜】查看分数情况,倒计时模式是在一定的时间进行玩游戏,练习模式是对于初次玩台球游戏的玩家或者不熟练的玩家。

4.3类的设计

4.4类的功能

各个类功能清单

4.5类的特点

4.5.1抽象类WhatMessage的描述

public class WhatMessage{

public static final int GOTO_WELLCOME_VIEW=0; //欢迎界面 public static final int GOTO_MAIN_MENU_VIEW=1 ; //主菜单界面 public static final int GOTO_GAME_VIEW=2; //游戏界面 public static final int GOTO_SOUND_CONTORL_VIEW=3; //声音控制界面

public static final int GOTO_WIN_VIEW =4; //胜利界面 public static final int GOTO_FAIL_VIEW =5; //失败界面 public static final int GOTO_HIGH_SCORE_VIEW=6; //排行榜界面 public static final int GOTO_HELP_VIEW =7; //帮助界面 public static final int GOTO_ABOUT_VIEW=8; //关于界面 public static final int GOTO_CHOICE_VIEW=9; //选择界面 public static final int OVER_GAME =10; //游戏结束

}

这个类主要是标识所有SurfaceView的常量,这些界面的常量用数字0至10表示的好处是:在后面的编程过程中更快捷,而且简单明了。

4.5.2界面设置

public class AboutView extends ViewGroup{

Paint paint; //画笔引用

Bitmap bgBitmap; //背景图片 Bitmap bmp; //文字的图片 float bmpx; //文字位置

public AboutView(GameActivity activity) { super(activity); setWillNotDraw(false); paint=new Paint(); //创建画笔 paint.setAntiAlias(true); //打开抗锯齿 initBitmap(); //初始化位图资源 }

//确定View的大小 @Override

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { this.setMeasuredDimension(bgBitmap.getWidth(), bgBitmap.getHeight()); }

//确定各子控件的位置与大小,调用子控件的layout函数进行 @Override

protected void onLayout(boolean changed, int l, int t, int r, int b) { }

//显示函数 @Override

public void onDraw(Canvas canvas) { canvas.drawBitmap(bgBitmap, 0, 0, paint); canvas.drawBitmap(bmp, bmpx+Constant.X_OFFSET, Constant.BMP_Y+Constant.Y_OFFSET, paint); }

//加载图片的方法

public void initBitmap(){ bgBitmap=BitmapFactory.decodeResource(this.getResources(), R.drawable.help);

bmp=BitmapFactory.decodeResource(this.getResources(), R.drawable.bmp0); bgBitmap=PicLoadUtil.scaleToFitFullScreen(bgBitmap, Constant.wRatio, Constant.hRatio); bmp=PicLoadUtil.scaleToFit(bmp, Constant.ssr.ratio);

} } //初始化图片的位置 bmpx=(Constant.SCREEN_WIDTH-bmp.getWidth())/2;

界面设置的类继承ViewGroup,使用onMeasure确定view大小、onLayo确定各个子控件的位置与大小,onDraw方法显示函数,initBitmao方法加载图片。

4.5.3监听器

public class KeyThread extends Thread {

private boolean flag=true;

GameView gameView;

private int sleepSpan=40;

private float changeSpeedTime=80f;//改变速度的时间点

public KeyThread(GameView gameView)

{

this.gameView=gameView;

}

@Override

public void run()

{

while(flag)

{

if(!((gameView.keyState&0x20)==0))//第6位是1,可以改变按下按钮时间

{

gameView.btnPressTime+=3.5f;

}

if(!((gameView.keyState&0x1)==0))//和00001按位或,判断第1位是否为1,标志向左移

{

if(gameView.btnPressTime

{

gameView.cue.rotateLeftSlowly();//将球杆慢速左转 }

else//如果按键超过规定时间

{

gameView.cue.rotateLeftFast();//将大炮快速左转

}

}

else if(!((gameView.keyState&0x2)==0))//和00010按位或,判断第2位是否为1,标志向右移

{

if(gameView.btnPressTime

{

gameView.cue.rotateRightSlowly();//将球杆慢速右转 }

else//如果按键超过规定时间

{

gameView.cue.rotateRightFast();//将大炮快速右转

}

}

try{

Thread.sleep(sleepSpan);//睡眠指定毫秒数

}

catch(Exception e){

e.printStackTrace();//打印堆栈信息

}

}

}

public void setFlag(boolean flag) {

this.flag = flag;

}

}

这监听器是起监听作用的线程类,这段代码是监听触控按键的线程类,这个线程是对球杆角度偏移进行控制。

4.5.4线程间通信

Handler myHandler = new Handler(){//处理各个SurfaceView发送的消息 public void handleMessage(Message msg) {

switch(msg.what)

{

case WhatMessage.GOTO_MAIN_MENU_VIEW:

gotoMainMenuView();

break;

case WhatMessage.GOTO_GAME_VIEW:

gotoGameView();

break;

case WhatMessage.GOTO_SOUND_CONTORL_VIEW:

gotoSoundControlView();

break;

case WhatMessage.GOTO_WIN_VIEW:

gotoWinView();

break;

case WhatMessage.GOTO_FAIL_VIEW:

gotoFailView();

break;

case WhatMessage.GOTO_HIGH_SCORE_VIEW:

gotoHighScoreView();

break;

case WhatMessage.GOTO_WELLCOME_VIEW:

gotoWellcomeView();

break;

case WhatMessage.GOTO_HELP_VIEW:

gotoHelpView();

break;

case WhatMessage.GOTO_ABOUT_VIEW:

gotoAboutView();

break;

case WhatMessage.GOTO_CHOICE_VIEW:

gotoChoiceView();

break;

case WhatMessage.OVER_GAME:

goToOverView();

break;

}

}

};

线程间的通信需要用到Handler来发送消息。线程之间的通信的原理是,线程通过Handler将消息发送出去,发出去的消息就会到进入到MessageQueue中,然后再通过Looper将消息循环的发送出去。msg.what是Messge对象的属性,起到标示作用。

4.5.5自定义按钮

public class ImageButtonEx extends Button {

protected Bitmap btBitmap;

protected boolean bButtonPressed=false;

public ImageButtonEx(Context context){

super(context);

}

public ImageButtonEx(Context context,Bitmap btBitmap){

super(context);

this.btBitmap=btBitmap;

setBackgroundDrawable(null);

}

自定义按钮的好处是,可以根据自己的喜爱和需要来绘制按钮,可以使你的游戏界面做得更漂亮,吸引大众的眼球。在这个游戏中的自定义按钮需要用到图形图像处理中的画布(Canvas)、画笔(Paint)和位图(Bitmap)。

4.5.6定时器

//绘制时间的方法

public void drawSelf(Canvas canvas,Paint paint){

int second=this.leftSecond%60;

int minute=this.leftSecond/60;

//绘制秒钟

drawNumberBitmap(second,numberBitmaps,endX+Constant.X_OFFSET,endY+Constant.Y_OFFSET,canvas, paint);

//绘制分隔符

int secondLength=(second+"").length()

float breakMarkX=endX-secondLength*numberWidth-breakMarkWidth; float breakMarkY=endY;

canvas.drawBitmap(breakMarkBitmap, breakMarkX+Constant.X_OFFSET, breakMarkY+Constant.Y_OFFSET,paint);//绘制时间分隔符图片

//绘制分钟

float miniteEndX=breakMarkX;

float miniteEndY=endY;

drawNumberBitmap(minute,numberBitmaps,miniteEndX+Constant.X_OFFSET,miniteEndY+Constant.Y_OFFSET,canvas, paint);

}

4.5.7 数据存储

//打开或创建数据库的方法

public void openOrCreateDatabase()

{

try

{

sld=SQLiteDatabase.openDatabase

(

"/data/data/com.bn.d2.bill/mydb", //数据库所在路径

null, //CursorFactory

SQLiteDatabase.OPEN_READWRITE|SQLiteDatabase.CREATE_IF_NECESSARY //读写、若不存在则创建

);

String sql="create table if not exists highScore" +

"( " +

"score integer," +

"date varchar(20)" +

");";

sld.execSQL(sql);

}

catch(Exception e)

{

Toast.makeText(this, "数据库错误:"+e.toString(),

Toast.LENGTH_SHORT).show();

}

}

//关闭数据库的方法

public void closeDatabase()

{

try

{

sld.close();

}

catch(Exception e)

{

Toast.makeText(this, "数据库错误:"+e.toString(),

Toast.LENGTH_SHORT).show();;

}

}

//插入记录的方法

public void insert(int score,String date)

{

try

{

String sql="insert into highScore values("+score+",'"+date+"');"; sld.execSQL(sql);

sld.close();

}

catch(Exception e)

{

Toast.makeText(this, "数据库错误:"+e.toString(),

Toast.LENGTH_SHORT).show();;

}

}

//查询的方法

public String query(int posFrom,int length) //开始的位置,要查寻的记录条数

{

StringBuilder sb=new StringBuilder(); //要返回的结果

Cursor cur=null;

openOrCreateDatabase();

String sql="select score,date from highScore order by score desc;"; cur=sld.rawQuery(sql, null);

{

cur.moveToPosition(posFrom); //将游标移动到指定的开始位置

int count=0; //当前查询记录条数

while(cur.moveToNext()&&count

{

int score=cur.getInt(0);

String date=cur.getString(1);

sb.append(score);

sb.append("/");

sb.append(date);

sb.append("/"); //将记录用"/"分隔开 count++;

}

}

catch(Exception e)

{

Toast.makeText(this, "数据库错误:"+e.toString(),

Toast.LENGTH_SHORT).show();

}

finally

{

cur.close();

closeDatabase();

}

//转换成字符,并返回

return sb.toString();

}

//得到数据库中记录条数的方法

public int getRowCount()

{

int result=0;

Cursor cur=null;

openOrCreateDatabase();

try

{

String sql="select count(score) from highScore;";

cur=sld.rawQuery(sql, null);

if(cur.moveToNext())

{

result=cur.getInt(0);

}

catch(Exception e)

{

Toast.makeText(this, "数据库错误:"+e.toString(),

Toast.LENGTH_SHORT).show();

}

finally

{

cur.close();

closeDatabase();

}

return result;

}

这个游戏中的数据存储用到的是SQLite数据库。SQLite是一个开源的嵌入式关系数据库,它可以减少应用程序管理数据的开销,可移植性好,很容易使用,它本身很小,但却高效而且可靠。嵌入式数据库的一大好处是在程序内部不需要网络配置,也不需要管理。使用SQLite数据存储需要熟悉SQL语句的使用。使用SQLite数据库首先需要创建数据库,相关记录就会在数据库中。

4.5.8多线程

public void run(){

for(int i=0;i

SurfaceHolder myholder=WinView.this.getHolder();

Canvas canvas = myholder.lockCanvas();

try {

synchronized (myholder) {

render(canvas);

}

} finally {

if (canvas != null) {

myholder.unlockCanvasAndPost(canvas);

}

}

try{

Thread.sleep(sleepSpan);

}

catch(Exception e){

e.printStackTrace();

}

}

该run方法是实现 Runnable 接口的。关键字synchronized用来与对象的互斥锁联系。当某个对象用synchronized修饰时,表明该对象在任一时刻只能有一个线程访问。当线程执行到synchronized块结束时,需要释放对象锁。当在synchronized块中遇到break,return或抛出Exception,则自动释放对象锁。

4.5.9信息提示

Toast.makeText(this, "数据库错误:"+e.toString(), Toast.LENGTH_SHORT).show();

Toast(提示)是Android中用来显示提示消息的一种机制。Toast没有焦点且显示的时间有限,不会打断用户的当前操作,不能与用户交互,显示一段时间后会自动消失。显示时长有有两个:一个是Toast.LENGTH_SHORT(短时间),另一种是Toast.LENGTH_LONG(长时间)。

4.5.10布局管理

android:layout_width="fill_parent"

android:layout_height="fill_parent"

>

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="@string/hello"

/>

此次布局用到的是线性布局,排列方式是相对于手机屏幕垂直排布,宽高占满整个手机屏幕,文字大小的高是包裹内容,宽是占满手机屏幕。

五.设计小结

在本次课程设计中,我学到了很多的知识,我个人认为这个台球游戏编程需要一定的物理和数学基础,并且头脑要保持时刻清醒,要不然很容易绕晕。在对Android的学习上是我学会了怎么将学到的理论知识用到实践中去,改变了过去的学习方法和学习态度,找到了一门自己很喜欢的学科。在这次课程设计中本课程设计中,深深的感受到了一个人力量的单薄,了解到了在完成一个完整的项目上团队的重要性,在实际的程序开发中,团队的力量往往比个人力量之和要大上很多,并且在今后的开发中,我们都将是以团队的形式展开工作的,所以我们应该在现在学习的时候养成一种良好的团队精神,以为将来的开发打下一顶的基础。


相关内容

  • 被App淹没的生活
    这是一个中国城市年轻人的典型一天: 在闹铃响起后,取过手机,看一下今天的天气预报和空气污染情况,然后起床,听着手机音乐或晨间新闻,或是查看一下微信.出门前,用打车软件订了一部出租车,在车上看一下今天的日程安排,然后处理一批工作邮件,或是背一 ...
  • 沈阳中专学校有哪些?
    www.lnbdqn.com 沈阳中专学校有哪些? 随着移动互联网的普及,手机游戏开发岗位成了香饽饽的岗位, 很多同学都想加入手机游戏开发行业来,但是由于学习的人太多,手机游戏软件培训机构也逐渐的增多,导致大家在选择培训机构的时候出现不同程 ...
  • 手机微型投影仪,体积越来越小,亮度越来越高,应用越来越广
    智能手机已成为人们的随身装备,准确的说已成为人们生活的必需品,打电话.上网.交友.阅读.娱乐.游戏.购物,很难想象,没有手机的生活是多么的恐怖. 手机功能强大,但也有一个弱点,就是屏幕比较小,最大的手机屏幕也就是6寸,平板电脑最小的屏幕也有 ...
  • 关于20**年界北服毕业设计展论文观后感
    关于2011界北服毕业设计展 [1**********]9 严淑 2011北服的毕业设计展此次在时代美术馆开幕,当天下午我们就前往展馆,开始我们的学习之旅.当然,这也是为我们2年后的毕业设计能做到更完美而做的准备. 一到时代美术馆35楼,走 ...
  • 台球英语词汇
    台球英语词汇 作者:minjieabc 来源:华奥星空 点击数: 1189 更新时间:2007年01月12日 Font Size: Large | Medium | Small cue 球杆 rest 架杆 lamp shade 灯罩 ch ...
  • 14-自助点餐系统(美承提供)
    自助点餐系统 餐饮行业的信息化 1. 背景说明 [整体背景] 中国餐饮行业市场进入2015年增长趋势开始加快.2010年中国餐饮行业整体市场规模为17681亿元,经过4年的发展,2014年市场规模达到28132亿元,同比上涨8.1%,201 ...
  • 学生会社团部个人工作计划
    文新学院社团部10-11学年下学期工作计划 文新学院社团部在以往的活动经验的基础上,改进其中的不足之处,发扬经过多年已经 积累起来的丰富的工作经验,争取将文新学院社团部的各项活动搞得有声有色,协调好各社 团之间的关系,促进各社团发展和壮大. ...
  • 苹果iphone6怎么恢复通讯录?手机通讯录恢复软件
    苹果iphone6怎么恢复通讯录?手机通讯录恢复软件 本篇将会教大家苹果iphone6怎么恢复通讯录,苹果手机为了防范数据丢失本身就研制了不少的功能.我们可以打开照片流备份手机照片,可以打开通讯录备份手机通讯录,或是直接打开iCloud整机 ...
  • 怎么在手机上裁剪视频|安卓手机能剪切视频吗
    视频剪辑软件哪个好是很多朋友都在问的,但是专业的视频剪辑软件要用电脑,太麻烦而且又复杂.现在手机的普及,手机拍摄视频和剪辑视频是非常方便的,随着智能手机功能的越来越强大,视频剪辑也越来越简单,一款安卓手机也能剪出神作. 手机视频剪切软件下载 ...
  • 南风劲吹20XX年第6期
    广州国际汽车改装服务业展览会(AAITF)一向被誉为中国汽车用品行业的风向标,由于要赶上每年全国买家南下广州采购的黄金季节,该展会定在每年的农历正月十八至二十举行,一开年马上召开,确实够早的,怪不得它被业内称为"中国汽车用品第一展 ...