当前位置:   article > 正文

小飞机大作战(Android Studio)+java语言_android studio课程设计java

android studio课程设计java
  1. 概述
    1. 课程设计概述

       移动平台应用程序技术课程主要学习针对目前手机、平板电脑等移动终端的软件开发。我们的课程主要是在Android Studio平台上进行,通过一学期的学习,基本了解和掌握了Android开发的主要组件和软件实现方法。

       这次的课程设计报告主要是完成了一个小飞机大作战的游戏软件,在用户移动终端联网的情况下,用户注册并且登录进入游戏,操控飞机击败敌机,获取得分的记录。

    1. 主要内容

       本次课程设计报告的主要内容包括以下几点:

       (1)对于所设计软件的需求分析。

       (2)搭建Android工程的开发环境、测试环境。

       (3)基本功能的实现,美化软件界面,提高用户输入操作性和界面显示友好性。

       (4)说明开发过程中使用的新技术,以及使用这些技术所需要注意的问题,以及解决了什么问题;

       (5)思考总结开发过程中的问题和想法,在此基础上考虑软件的可扩展性和性能优化。

  1. 系统需求分析
    1. 业务需求分析

       用户通过注册模块,获取到一个账号权限。通过账号登录到小飞机大作战软件的主界面,进行游玩获取分数。

小飞机大作战游戏中不仅可以上下左右操控飞机攻击敌人,还可以捡取掉落物品提升能力,类似回复血量或者增加火力等。攻击这一行为看似简单,实际上涉及到游戏中碰撞机制的设定。

    1. 模型需求分析

       虽然小飞机大作战是一个小应用,但是仍然需要对其模型进行详细的分析。如下图2-1所示:

 

图2-1 小飞机大作战模型需求分析

    1. 界面需求分析

       移动平台软件的界面友好是一个比较重要的方面,界面的友好是用户使用软件的先决条件。

       小飞机大作战的登录界面设计模仿QQ等聊天软件,为玩家显示账号密码输入框,下方提供注册及登录按钮。游戏主界面简洁显示出包括开始游戏、设置、背景等选项并在语句下放置气泡类型图片与背景区分开。

  1. 系统设计    
    1. 主要功能设计

       1)布局文件

       小飞机大作战的页面有五个:登录注册页面、游戏菜单主页面、设置页面、背景页面以及排行榜页面。其中本节点主要讲解登录界面的布局设计。菜单界面使用LinearLayout布局,使用一个FrameLayout来承载播放背景视频的videoView控件,

登录注册页面上方是用户名与密码的TextView控件,页面中央是注册与登录按钮,如图3-1所示。

                                                               图3-1 注册界面布局

       2)主配置文件

       由于这个应用需要使用服务器,所以需要特别在AndroidManifest.xml文件中注册应用访问网络的权限,如下所示:

<uses-permission android:name="android.permission.INTERNET"/>

    1. 网络通讯设计

       游戏用户的登录注册需要使用到服务器,使用Java提供的相关类,可以很方便的进行书写,它的代码如下。

package myserver;

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.OutputStream;

import java.net.ServerSocket;

import java.net.Socket;

import java.util.ArrayList;

public class MyServer

{

 // 定义保存所有 Socket 的 ArrayList

 public static ArrayList<Socket>socketList= new

ArrayList<Socket>();

 public static void main(String[] args) throws IOException

 {

 ServerSocket ss = new ServerSocket(9920);

 System.out.println("服务器已准备好");

 

while(true)

 {

 //此行代码会阻塞,将一直等待别人的连接

 Socket s = ss.accept();

 System.out.println("连接一个客户端");

 socketList.add(s);

 // 每当客户端连接后启动一条 ServerThread 线程为该客户端服务

 new Thread(new ServerThread(s)).start();

 }

 }

}

// 负责处理每个线程通信的线程类

class ServerThread implements Runnable

{

 // 定义当前线程所处理的 Socket

 Socket s =null;

 // 该线程所处理的 Socket 所对应的输入流

 BufferedReader br =null;

 public ServerThread(Socket s) throws IOException

 {

 this.s = s;

 // 初始化该 Socket 对应的输入流

 br =new BufferedReader(new

InputStreamReader(s.getInputStream() ,"utf-8"));

 }

 public void run()

 {

 try{

 String content =readFromClient();

 // 采用循环不断从 Socket 中读取客户端发送过来的数据

 while (content !=null)

 {

                System.out.println(content);

 // 遍历 socketList 中的每个 Socket

 // 将读到的内容向每个 Socket 发送一次

for (Socket s : MyServer.socketList)

 {

 OutputStream os = s.getOutputStream();

 os.write((content +"\n").getBytes("utf-8"));

 }

 content =readFromClient();

 }

 }

catch (IOException e)

 {

 e.printStackTrace();

 }

 }

 // 定义读取客户端数据的方法

 private String readFromClient()

 {

 try{

 return br.readLine();

 }

 // 如果捕捉到异常,表明该 Socket 对应的客户端已经关闭

 catch (IOException e)

 {

 System.out.println("发生异常");

 // 删除该 Socket

 MyServer.socketList.remove(s);

 }

 System.out.println("未读到数据");

 return null;

 }

}

    1. 数据库表设计

表3-1 登录用户admin表

字段名

数据类型

能否为空

说明

描述

name

varchar(20)

Not null

用户名或账号

password

varchar(20)

Not null

用户登录密码

  1. 系统实现
    1. 系统界面

 

    1. 系统程序实现
      1. WebServer服务端程序实现

(1)项目整体框架

 

(2)处理登录逻辑的数据访问层核心代码

  1. package myserver;
  2. import java.io.BufferedReader;
  3. import java.io.IOException;
  4. import java.io.InputStreamReader;
  5. import java.io.OutputStream;
  6. import java.net.ServerSocket;
  7. import java.net.Socket;
  8. import java.util.ArrayList;
  9. public class MyServer
  10. {
  11.  // 定义保存所有 Socket 的 ArrayList
  12.  public static ArrayList<Socket>socketList= new
  13. ArrayList<Socket>();
  14.  public static void main(String[] args) throws IOException
  15.  {
  16.  ServerSocket ss = new ServerSocket(9920);
  17.  System.out.println("服务器已准备好");
  18.  while(true)
  19.  {
  20.  //此行代码会阻塞,将一直等待别人的连接
  21.  Socket s = ss.accept();
  22.  System.out.println("连接一个客户端");
  23.  socketList.add(s);
  24.  // 每当客户端连接后启动一条 ServerThread 线程为该客户端服务
  25.  new Thread(new ServerThread(s)).start();
  26.  }
  27.  }
  28. }
  29. // 负责处理每个线程通信的线程类
  30. class ServerThread implements Runnable
  31. {
  32.  // 定义当前线程所处理的 Socket
  33.  Socket s =null;
  34.  // 该线程所处理的 Socket 所对应的输入流
  35.  BufferedReader br =null;
  36.  public ServerThread(Socket s) throws IOException
  37.  {
  38.  this.s = s;
  39.  // 初始化该 Socket 对应的输入流
  40.  br =new BufferedReader(new
  41. InputStreamReader(s.getInputStream() ,"utf-8"));
  42.  }
  43.  public void run()
  44.  {
  45.  try{
  46.  String content =readFromClient();
  47.  // 采用循环不断从 Socket 中读取客户端发送过来的数据
  48.  while (content !=null)
  49.  {
  50.         System.out.println(content);
  51.  // 遍历 socketList 中的每个 Socket,
  52.  // 将读到的内容向每个 Socket 发送一次
  53.  for (Socket s : MyServer.socketList)
  54.  {
  55.  OutputStream os = s.getOutputStream();
  56.  os.write((content +"\n").getBytes("utf-8"));
  57.  }
  58.  content =readFromClient();
  59.  }
  60.  }
  61.  catch (IOException e)
  62.  {
  63.  e.printStackTrace();
  64.  }
  65.  }
  66.  // 定义读取客户端数据的方法
  67.  private String readFromClient()
  68.  {
  69.  try{
  70.  return br.readLine();
  71.  }
  72.  // 如果捕捉到异常,表明该 Socket 对应的客户端已经关闭
  73.  catch (IOException e)
  74.  {
  75.  System.out.println("发生异常");
  76.  // 删除该 Socket
  77.  MyServer.socketList.remove(s);
  78.  }
  79.  System.out.println("未读到数据");
  80.  return null;
  81.  }
  82. }
  83. 3)处理登录逻辑的访问请求Servlet核心代码
  84. public class MyServer
  85. {
  86.  // 定义保存所有 Socket 的 ArrayList
  87.  public static ArrayList<Socket>socketList= new
  88. ArrayList<Socket>();
  89.  public static void main(String[] args) throws IOException
  90.  {
  91.  ServerSocket ss = new ServerSocket(9920);
  92.  System.out.println("服务器已准备好");
  93.  while(true)
  94.  {
  95.  //此行代码会阻塞,将一直等待别人的连接
  96.  Socket s = ss.accept();
  97.  System.out.println("连接一个客户端");
  98.  socketList.add(s);
  99.  // 每当客户端连接后启动一条 ServerThread 线程为该客户端服务
  100.  new Thread(new ServerThread(s)).start();
  101.  }
  102.  }
  103. }

(3)处理注册逻辑的数据访问层核心代码

  1. // 负责处理每个线程通信的线程类
  2. class ServerThread implements Runnable
  3. {
  4.  // 定义当前线程所处理的 Socket
  5.  Socket s =null;
  6.  // 该线程所处理的 Socket 所对应的输入流
  7.  BufferedReader br =null;
  8.  public ServerThread(Socket s) throws IOException
  9.  {
  10.  this.s = s;
  11.  // 初始化该 Socket 对应的输入流
  12.  br =new BufferedReader(new
  13. InputStreamReader(s.getInputStream() ,"utf-8"));
  14.  }
  15.  public void run()
  16.  {
  17.  try{
  18.  String content =readFromClient();
  19.  // 采用循环不断从 Socket 中读取客户端发送过来的数据
  20.  while (content !=null)
  21.  {
  22.         System.out.println(content);
  23.  // 遍历 socketList 中的每个 Socket,
  24.  // 将读到的内容向每个 Socket 发送一次
  25.  for (Socket s : MyServer.socketList)
  26.  {
  27.  OutputStream os = s.getOutputStream();
  28.  os.write((content +"\n").getBytes("utf-8"));
  29.  }
  30.  content =readFromClient();
  31.  }
  32.  }
  33.  catch (IOException e)
  34.  {
  35.  e.printStackTrace();
  36.  }
  37.  }
  38.  // 定义读取客户端数据的方法
  39.  private String readFromClient()
  40.  {
  41.  try{
  42.  return br.readLine();
  43.  }
  44.  // 如果捕捉到异常,表明该 Socket 对应的客户端已经关闭
  45.  catch (IOException e)
  46.  {
  47.  System.out.println("发生异常");
  48.  // 删除该 Socket
  49.  MyServer.socketList.remove(s);
  50.  }
  51.  System.out.println("未读到数据");
  52.  return null;
  53.  }
  54. }
  55. 5)处理注册逻辑的访问请求Servlet核心代码
  56. class ClientThread implements Runnable
  57. {
  58.     private Socket s;
  59.     // 定义向 UI 线程发送消息的 Handler 对象
  60.     private Handler handler;
  61.     // 定义接收 UI 线程的消息的 Handler 对象
  62.     public Handler revHandler;
  63.     // 该线程所处理的 Socket 所对应的输入流
  64.     BufferedReader br =null;
  65.     OutputStream os =null;
  66.     public ClientThread(Handler handler)
  67.     {
  68.         this.handler = handler;
  69.     }
  70.     public void run()
  71.     {
  72.         try {
  73.             //10.0.2.2 为本机的 ip 地址
  74.             s =new Socket("10.0.2.2", 9920);
  75.             br =new BufferedReader(new
  76.                     InputStreamReader(s.getInputStream()));
  77.             os =s.getOutputStream();
  78.             // 启动一条子线程来读取服务器响应的数据
  79.             new Thread()
  80.             {
  81.                 public void run()
  82.                 {
  83.                     String content =null;
  84. // 不断读取 Socket 输入流中的内容
  85.                     try{
  86.                         while ((content
  87.                                 =br.readLine()) !=null)
  88.                         {
  89.                             // 每当读到来自服务器的数据之后,发送消息通知程序界面显示该数据
  90.                             Message msg =new
  91.                                     Message();
  92.                             msg.what = 0x123;
  93.                             msg.obj = content;
  94.                             handler.sendMessage(msg);
  95.                         }
  96.                     }
  97.                     catch (IOException e)
  98.                     {
  99.                         e.printStackTrace();
  100.                     }
  101.                 }
  102.             }.start();
  103.             // 为当前线程初始化 Looper
  104.             Looper.prepare();
  105.             // 创建 revHandler 对象
  106.             revHandler =new Handler(){
  107.                 public void handleMessage(Message msg)
  108.                 {
  109.                     // 接收到 UI 线程中用户输入的数据
  110.                         // 将用户在文本框内输入的内容写入网络
  111.                         try
  112.                         {
  113.                             os.write((msg.obj.toString() + "\r\n").getBytes("utf-8"));
  114.                         }
  115.                         catch (Exception e)
  116.                         {
  117.                             e.printStackTrace();
  118.                         }
  119.                     }
  120.             };
  121.             // 启动 Looper
  122.             Looper.loop();
  123.         }
  124.         catch (SocketTimeoutException e)
  125.         {
  126.             System.out.println("网络连接超时!!");
  127.         }
  128.         catch (Exception e)
  129.         {
  130.             e.printStackTrace();
  131.         }
  132.     }
  133. }
      1. Android客户端程序实现
  1. 项目整体框架

(2)Register中的登录按钮点击事件

  1. reday.setOnClickListener(new View.OnClickListener() {
  2.     public void onClick(View v) {
  3.         String name = username.getText().toString().trim();
  4.         String password = userpassword.getText().toString().trim();
  5.         if(!TextUtils.isEmpty(name)&&!TextUtils.isEmpty(password)){
  6.             mSQlite.add(name,password);
  7.             Intent intent1 = new Intent(Register.this,MainActivity.class);
  8.             startActivity(intent1);
  9.             finish();
  10.             Toast.makeText(Register.this,"注册成功",Toast.LENGTH_SHORT).show();
  11.         }else {Toast.makeText(Register.this,"信息不完备,注册失败",Toast.LENGTH_SHORT).show();}
  12.     }
  13. });
  14. mSQlite = new SQlite(Register.this);
  15. back.setOnClickListener(new View.OnClickListener() {
  16.     @Override
  17.     public void onClick(View v) {
  18.         String name = username.getText().toString().trim();
  19.         String password = userpassword.getText().toString().trim();
  20.         if (!TextUtils.isEmpty( name ) && !TextUtils.isEmpty( password )) {
  21.             ArrayList<User> data = mSQlite.getAllDATA();
  22.             boolean user = false;
  23.             for (int i = 0; i < data.size(); i++) {
  24.                 User userdata = data.get( i );   //可存储账号数量
  25.                 if (name.equals( userdata.getName() ) && password.equals( userdata.getPassword() )) {
  26.                     user = true;
  27.                     break;
  28.                 } else {
  29.                     user = false;
  30.                 }
  31.             }
  32.             if (user) {
  33.                 Toast.makeText( Register.this, "登录成功", Toast.LENGTH_SHORT ).show();
  34.                 Intent intent = new Intent( Register.this, MainActivity.class );
  35.                 intent.putExtra( "username", name );
  36.                 intent.putExtra( "password", password );  //展示账号密码功能
  37.                 startActivity( intent );
  38.                 finish();
  39.             } else {
  40.                 Toast.makeText( Register.this, "用户名或密码不正确", Toast.LENGTH_SHORT ).show();
  41.             }
  42.         } else {
  43.             Toast.makeText( Register.this, "用户名或密码不能为空", Toast.LENGTH_SHORT ).show();
  44.         }
  45.     }
  46. });

  1. Father_Object游戏核心碰撞机制
  1. public class Father_Object {
  2.     public RectF rf=new RectF();//获取物体所在的矩形用于碰撞检测
  3.     public int hp;//血量
  4.     public int hurt;
  5.     public float w,h;//物体的宽高
  6.     public Bitmap img;//图片
  7.     //用set方法设置该物体的位置
  8.     public void setX(float x){
  9.         rf.left=x;
  10.         rf.right=x+w;
  11.     }
  12.     public void setY(float y){
  13.         rf.top=y;
  14.         rf.bottom=y+h;
  15.     }
  16.     //碰撞检测
  17.     public boolean collision(Father_Object obj_z,Father_Object obj_bz,float px){//传入主动撞与被动撞两个对象,以及忽略像素
  18.         px*=Static_data.scale;
  19.         if(obj_z.rf.left-obj_bz.rf.left+px<=obj_bz.w&&obj_bz.rf.left-obj_z.rf.left+px<=obj_z.w){
  20.             if(obj_z.rf.top-obj_bz.rf.top+px<=obj_bz.h&&obj_bz.rf.top-obj_z.rf.top+px<=obj_z.h){
  21.                 return true;
  22.             }
  23.         }
  24.         return false;
  25.     }
  26. }
  1. Buff类加载游戏道具
  1. public class Buff extends Father_Object implements Runnable {
  2.     public int property;
  3.     public int add_hp;
  4.     private float direction =(float)(Math.random()*2)-1;//方向
  5.     public Buff(){
  6.         property = (int) (Math.random()*2+1);//随机生成1-2的2个整数
  7.         w = 100*Static_data.scale;//乘比例
  8.         h = 100*Static_data.scale;
  9.         if(property==1){
  10.             img = Static_data.buff1;//炮弹加成
  11.         }
  12.         if (property==2){
  13.             img = Static_data.buff2;//生命加成
  14.             add_hp = 50;
  15.         }
  16.         setX((float)( Math.random() * (Static_data.Screen_w - w)));//x是随机的
  17.         setY(-h);
  18.         Static_data.paint_list.add(this);//放进这个集合里才能被画出来
  19.         new Thread(this).start();
  20.     }
  21.     @Override
  22.     public void run() {
  23.         boolean mark = false;//标记buff有没有碰到我
  24.         while (true){
  25.             try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); }
  26.             //如果碰到两边的墙壁,取反方向
  27.             if (rf.left<=0||rf.right>=Static_data.Screen_w)
  28.             direction=-direction;
  29.             setX(rf.left+direction*10*Static_data.scale);
  30.             setY(rf.top+2*Static_data.scale);
  31.             try {
  32.                 //这里判断有没有和我的飞机发生碰撞
  33.                 My_plane mp = Static_data.my_Plane;
  34.                 if (collision(this,mp,10)) {//判断碰撞
  35.                     if(property==2)
  36.                         mp.hp += add_hp;//我的飞机的生命+add buff
  37.                     else mp.shell_buff++;
  38.                     mark = true;//标记炮弹击中了我的飞机
  39.                     Static_data.score+=50;
  40.                     break;
  41.                 }
  42.                 if(mp.hp>200)//判断我的生命不超过200
  43.                     mp.hp=200;
  44.                 if (mp.shell_buff>3)//判断子弹加成不超过3
  45.                     mp.shell_buff=3;
  46.             } catch (Exception e) {
  47.                 e.printStackTrace();
  48.                 break;
  49.             }
  50.             //如果子弹击中我 或者超出屏幕范围跳出循环
  51.             if (mark || rf.top>=Static_data.Screen_h) break;
  52.         }
  53.         Static_data.paint_list.remove(this);//从集合删除
  54.     }
  55.     }

  1. MusicService提供游戏音乐背景服务
  1. public class MusicService extends Service {
  2.     static boolean isplay=true;//播放状态
  3.     MediaPlayer mediaPlayer;
  4.     public MusicService() {
  5.     }
  6.     @Override
  7.     public IBinder onBind(Intent intent) {
  8.         // TODO: Return the communication channel to the service.
  9.         throw new UnsupportedOperationException("Not yet implemented");
  10.     }
  11.     @Override
  12.     public void onCreate() {
  13.         //创建 mediaPlayer对象,加载音乐
  14.         mediaPlayer = MediaPlayer.create(this,R.raw.music);
  15.         super.onCreate();
  16.     }
  17.     @Override
  18.     public int onStartCommand(Intent intent, int flags, int startId) {
  19.         if(!mediaPlayer.isPlaying()){
  20.                 mediaPlayer.start();//播放音乐
  21.             mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
  22.                 @Override
  23.                 public void onCompletion(MediaPlayer mediaPlayer) {
  24.                     mediaPlayer.start();
  25.                 }
  26.             });
  27.                 isplay = mediaPlayer.isPlaying();
  28.         }
  29.         return super.onStartCommand(intent, flags, startId);
  30.     }
  31.     @Override
  32.     public void onDestroy() {
  33.         mediaPlayer.stop();//停止播放
  34.         isplay = mediaPlayer.isPlaying();
  35.         mediaPlayer.release();
  36.         super.onDestroy();
  37.     }
  38. }

  1. Plane类加载所有飞机
  1. public void control_myPlane(){
  2.     setOnTouchListener(new OnTouchListener() {
  3.         @Override
  4.         public boolean onTouch(View view, MotionEvent e) {
  5.             if(e.getAction()== MotionEvent.ACTION_DOWN){//ACTION_DOWN:按下时
  6.                 click_x=e.getX();
  7.                 click_y=e.getY();
  8.                 click_my_plane_x=Static_data.my_Plane.rf.left;
  9.                 click_my_plane_y=Static_data.my_Plane.rf.top;
  10.             }
  11.             float move_x=click_my_plane_x+e.getX()-click_x;
  12.             float move_y=click_my_plane_y+e.getY()-click_y;
  13.             //我的飞机不能飞出屏幕
  14.             move_x=move_x<Static_data.Screen_w-Static_data.my_Plane.w/2?move_x:Static_data.Screen_w-Static_data.my_Plane.w/2;
  15.             move_x=move_x>-Static_data.my_Plane.w/2?move_x:-Static_data.my_Plane.w/2;
  16.             move_y=move_y<Static_data.Screen_h-Static_data.my_Plane.h/2?move_y:Static_data.Screen_h-Static_data.my_Plane.h/2;
  17.             move_y=move_y>-Static_data.my_Plane.h/2?move_y:-Static_data.my_Plane.h/2;
  18.             Static_data.my_Plane.setX(move_x);
  19.             Static_data.my_Plane.setY(move_y);
  20.             return true;
  21.         }
  22.     });
  23. }
  1. RankActivity中存放得分
  1. public class RankActivity extends AppCompatActivity {
  2.     TextView tv_rank;
  3.     @Override
  4.     protected void onCreate(Bundle savedInstanceState) {
  5.         super.onCreate(savedInstanceState);
  6.         setContentView(R.layout.activity_rank);
  7.         tv_rank = findViewById(R.id.tv_rank);
  8. //        将读取的分数按“,”切割成字符数组
  9.         String[] ScoreStrArr = getScore().split(",");
  10. //        Log.i("score", "得分为: "+ScoreArr[0]);
  11.         int[] ScoreIntArr = new int[ScoreStrArr.length];//定义一个int数组存分数
  12.         for (int i=0;i<ScoreStrArr.length;i++){
  13.             ScoreIntArr[i]= Integer.valueOf(ScoreStrArr[i]);//将字符串数组中的值转为int存到int型数组中
  14.         }
  15.         Arrays.sort(ScoreIntArr);//用sort函数排序(从小到大排)
  16.         int count = 1;//计数器,我们只输出前10名
  17.         String msg = "";//shuchu到前端的msg
  18.         String saveMsg = "";//存入文件的msg
  19. //        Log.i("score", "得分为: "+ScoreIntArr[0]);
  20.         for (int i=ScoreIntArr.length-1;i>=0;i--){//因为是从小到大排,所以倒着输出
  21.             msg +="NO."+count+"  :"+ScoreIntArr[i]+"\n";
  22.             saveMsg += String.valueOf(ScoreIntArr[i])+",";
  23.             count++;
  24.             if (count>10)break;
  25.         }
  26.         tv_rank.setText(msg);
  27.         //这里我们将排名重新存一下,把低分删除掉
  28. //        Log.i("saveMsg", saveMsg);
  29.         saveScore(saveMsg);
  30.     }
  31.     private void saveScore(String s) {
  32.         FileOutputStream outputStream;
  33.         BufferedWriter writer = null;
  34.         try {
  35.             //指定文件名和保存方式,Context.MODE_PRIVATE会覆盖文件,MODE_APPEND会追加文件内容
  36.             outputStream = openFileOutput("rank", Context.MODE_PRIVATE);
  37.             writer = new BufferedWriter(new OutputStreamWriter(outputStream));
  38.             writer.write(s);//写入内容
  39.             Log.e("save", "文件已保存");
  40.         } catch (IOException e) {
  41.             e.printStackTrace();
  42.         } finally {
  43.             try {
  44.                 if (writer != null) {
  45.                     writer.close();
  46.                 }
  47.             } catch (IOException e) {
  48.                 e.printStackTrace();
  49.             }
  50.         }
  51.     }
  52.     private String getScore() {
  53.         FileInputStream inputStream;
  54.         BufferedReader reader = null;
  55.         StringBuilder builder = new StringBuilder();
  56.         try {
  57.             inputStream = openFileInput("rank");
  58.             reader = new BufferedReader(new InputStreamReader(inputStream));
  59.             String line;
  60.             while ((line = reader.readLine()) != null) {
  61.                 builder.append(line);
  62. //                tv_rank.setText(line);
  63.             }
  64.         } catch (IOException e) {
  65.             e.printStackTrace();
  66.             Log.e("IOException", "读取文件错误: " + e.toString());
  67.         } finally {
  68.             if (reader != null) {
  69.                 try {
  70.                     reader.close();
  71.                 } catch (IOException e) {
  72.                     e.printStackTrace();
  73.                 }
  74.             }
  75.         }
  76.         return builder.toString();
  77.     }
  78. }

  1. video视频配置
  1. public class video extends VideoView {
  2.     public video(Context context) {
  3.         super(context);
  4.     }
  5.     public video(Context context, AttributeSet attrs) {
  6.         super(context, attrs);
  7.     }
  8.     public video(Context context, AttributeSet attrs, int defStyleAttr) {
  9.         super(context, attrs, defStyleAttr);
  10.     }
  11.     @Override
  12.     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  13.         int width = getDefaultSize(0, widthMeasureSpec);
  14.         int height = getDefaultSize(0, heightMeasureSpec);
  15.         setMeasuredDimension(width, height);
  16.     }
  17. }

  1. 系统测试
    1. 登录功能测试

表4-1 登录功能测试用例

测试项目

登录功能

测试编号

01

测试目的

登录信息的验证及容错处理

序号

测试内容

测试结果

测试结果是否合格

1

不输入任何内容

提示:请输入账号或密码

合格

2

只输入账号、不输入密码

提示:请输入账号或密码

合格

3

输入错误的账号密码

提示:账号或密码错误

合格

4

输入正确的账号密码

成功登录到聊天界面

合格

5

输入中文账号和密码

成功登录到聊天界面

合格

    1. 注册功能测试

表4-2 注册功能测试用例

测试项目

注册功能

测试编号

02

测试目的

注册信息的验证及容错处理

序号

测试内容

测试结果

测试结果是否合格

1

不输入任何内容

提示:请输入完整信息!

合格

2

只输入账号

提示:请输入完整信息!

合格

3

两次密码输入不一致

提示:两次密码不一致!

合格

4

注册已有账号

提示:请勿重复注册!

合格

5

注册新账号

提示:注册成功!

合格

    1. 游戏得分测试

表4-3 聊天功能测试用例

测试项目

分数记录功能

测试编号

03

测试目的

检验能否正确记录玩家数次分数

序号

测试内容

测试结果

测试结果是否合格

1

不得分

软件无异常,正常显示

合格

2

击败单架敌机

软件无异常,正常显示

合格

3

击败数个敌机

软件无异常,正常显示

合格

4

击败BOSS类飞机

软件无异常,正常显示

合格

5

通过一关

软件无异常,正常显示

合格

6

通过数关

软件无异常,正常显示

合格

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/798253
推荐阅读
相关标签
  

闽ICP备14008679号