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

时间:2024.3.31

 计算机学院课程设计

专    业:       计算机应用技术            

课程名称:       3G开发基础            

课题名称:        台球游戏系统               

教    师:                      

学    号: 姓    名:

                 20## 年 9月 20 日 ——2013 年 12 月 25 日

目录

前言

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

20##年初数据显示,仅正式上市两年的操作系统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<changeSpeedTime)//如果按键时间不足

                            {

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

                            }

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

                            {

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

                            }           

                     }

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

                     {

                            if(gameView.btnPressTime<changeSpeedTime)//如果按键时间不足

                            {

                                   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()<=1 ? (second+"").length()+1 : (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);

          try

          {              

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

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

             while(cur.moveToNext()&&count<length)

             {

                    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<totalSleepTime/sleepSpan;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布局管理

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:orientation="vertical"

    android:layout_width="fill_parent"

    android:layout_height="fill_parent"

    >

<TextView 

    android:layout_width="fill_parent"

    android:layout_height="wrap_content"

    android:text="@string/hello"

    />

</LinearLayout>

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

五.设计小结

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

更多相关推荐:
建筑结构课程设计设计总结

工程结构设计心得课程设计对学生而言是其对所学课程内容掌握情况的一次自我验证,从而有着极其重要的意义。通过课程设计能提高学生对所学知识的综合应用能力,能全面检查并掌握所学内容;《建筑结构》从课程性质上讲是一门专业…

课程设计心得体会

心得体会通过这次课程设计,让我更加深刻了解课本知识,和以往对知识的疏忽得以补充,在设计过程中遇到一些模糊的公式和专业用语,比如说经济刮板运输机及皮带运输的选择,在选择选择刮板皮带运输选型时,在使用手册时,有的数…

课程设计个人小结

个人小结三周的课程设计结束了,我和同学们一起度过了这段忙碌而充实的时光。这次的课程设计深刻的反映出实践是检验真理的唯一标准这句话的真谛。课程设计是我们专业课程知识综合应用的实践训练,是我们迈向社会,从事职业工作…

信息工程学院课程设计总结

通过近两周的奋斗,课程设计接近了尾声。经过两周的奋战我的课程设计终于完成了。在没有做课程设计以前觉得课程设计只是对信号与系统这门课程所学知识的单纯总结,但是通过这次做课程设计发现自己的看法有点太片面。课程设计不…

课程设计心得体会(通用)

课程设计心得体会通用通过此次课程设计使我更加扎实的掌握了有关方面的知识在设计过程中虽然遇到了一些问题但经过一次又一次的思考一遍又一遍的检查终于找出了原因所在也暴露出了前期我在这方面的知识欠缺和经验不足实践出真知...

课程设计总结模板

两周的课程设计结束了,在这次的课程设计中不仅检验了我所学习的知识,也培养了我如何去把握一件事情,如何去做一件事情,又如何完成一件事情。在设计过程中,与同学分工设计,和同学们相互探讨,相互学习,相互监督。学会了合…

万能课程设计心得体会2个

1两周的课程设计结束了,在这次的课程设计中不仅检验了我所学习的知识,也培养了我如何去把握一件事情,如何去做一件事情,又如何完成一件事情。在设计过程中,与同学分工设计,和同学们相互探讨,相互学习,相互监督。学会了…

asp net 课程设计小结

课程设计小结又过去了一周这次aspnet的课程设计中学习到了很多通过这次的课程设计检验和巩固了我平时所学的知识让我知道了平时学习中的不足教会了我如何去完整地完成简单的系统在设计的过程之中遇见问题是一定的有时候就...

数据结构课程设计总结

课程设计说明书课程名:《数据结构课程设计》题目:一元多项式运算系统20##年1月一、课程认识数据结构课程主要是研究非数值计算的程序设计问题中所出现的计算机操作对象以及它们之间的关系和操作的学科。数据结构是介于数…

课程设计心得

嵌入式系统开发课程设计题目基于6410ARM的嵌入式WEB服务器的移植院系信息工程学院专业班级11计科特色班学生姓名邵飞飞学号1142157115设计地点13号楼605指导教师王华本起止时间20xx年4月21日...

课程设计心得感想体会29篇

课程设计心得感想体会在做实验前一定要将课本上的知识吃透因为这是做实验的基础否则在老师讲解时就会听不懂这将使你在做实验时的难度加大浪费做实验的宝贵时间比如做应变片的实验你要清楚电桥的各种接法如果你不清楚在做实验时...

课程设计心得

课程设计心得篇一课程设计心得本学期实时测量技术实验以电子设计大赛的形式老师命题学生可以选择老师的题目也可以自己命题并且组队操作其他的事情包括设计总体方案硬件电路软件设计焊接调试等工作趣味性强同时也可以学到很多东...

课程设计设计总结(40篇)