赞
踩
移动平台应用程序技术课程主要学习针对目前手机、平板电脑等移动终端的软件开发。我们的课程主要是在Android Studio平台上进行,通过一学期的学习,基本了解和掌握了Android开发的主要组件和软件实现方法。
这次的课程设计报告主要是完成了一个小飞机大作战的游戏软件,在用户移动终端联网的情况下,用户注册并且登录进入游戏,操控飞机击败敌机,获取得分的记录。
本次课程设计报告的主要内容包括以下几点:
(1)对于所设计软件的需求分析。
(2)搭建Android工程的开发环境、测试环境。
(3)基本功能的实现,美化软件界面,提高用户输入操作性和界面显示友好性。
(4)说明开发过程中使用的新技术,以及使用这些技术所需要注意的问题,以及解决了什么问题;
(5)思考总结开发过程中的问题和想法,在此基础上考虑软件的可扩展性和性能优化。
用户通过注册模块,获取到一个账号权限。通过账号登录到小飞机大作战软件的主界面,进行游玩获取分数。
小飞机大作战游戏中不仅可以上下左右操控飞机攻击敌人,还可以捡取掉落物品提升能力,类似回复血量或者增加火力等。攻击这一行为看似简单,实际上涉及到游戏中碰撞机制的设定。
虽然小飞机大作战是一个小应用,但是仍然需要对其模型进行详细的分析。如下图2-1所示:
图2-1 小飞机大作战模型需求分析
移动平台软件的界面友好是一个比较重要的方面,界面的友好是用户使用软件的先决条件。
小飞机大作战的登录界面设计模仿QQ等聊天软件,为玩家显示账号密码输入框,下方提供注册及登录按钮。游戏主界面简洁显示出包括开始游戏、设置、背景等选项并在语句下放置气泡类型图片与背景区分开。
(1)布局文件
小飞机大作战的页面有五个:登录注册页面、游戏菜单主页面、设置页面、背景页面以及排行榜页面。其中本节点主要讲解登录界面的布局设计。菜单界面使用LinearLayout布局,使用一个FrameLayout来承载播放背景视频的videoView控件,
登录注册页面上方是用户名与密码的TextView控件,页面中央是注册与登录按钮,如图3-1所示。
图3-1 注册界面布局
(2)主配置文件
由于这个应用需要使用服务器,所以需要特别在AndroidManifest.xml文件中注册应用访问网络的权限,如下所示:
<uses-permission android:name="android.permission.INTERNET"/>
游戏用户的登录注册需要使用到服务器,使用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; } } |
表3-1 登录用户admin表
字段名 | 数据类型 | 能否为空 | 说明 | 描述 |
name | varchar(20) | Not null | 用户名或账号 | |
password | varchar(20) | Not null | 用户登录密码 |
(1)项目整体框架
(2)处理登录逻辑的数据访问层核心代码
- 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;
-
- }
-
- }
-
- (3)处理登录逻辑的访问请求Servlet核心代码
-
- 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();
-
- }
-
- }
-
- }
(3)处理注册逻辑的数据访问层核心代码
- // 负责处理每个线程通信的线程类
-
- 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;
-
- }
-
- }
-
- (5)处理注册逻辑的访问请求Servlet核心代码
-
- class ClientThread implements Runnable
-
- {
-
- private Socket s;
-
- // 定义向 UI 线程发送消息的 Handler 对象
-
- private Handler handler;
-
- // 定义接收 UI 线程的消息的 Handler 对象
-
- public Handler revHandler;
-
- // 该线程所处理的 Socket 所对应的输入流
-
- BufferedReader br =null;
-
- OutputStream os =null;
-
- public ClientThread(Handler handler)
-
- {
-
- this.handler = handler;
-
- }
-
- public void run()
-
- {
-
- try {
-
- //10.0.2.2 为本机的 ip 地址
-
- s =new Socket("10.0.2.2", 9920);
-
- br =new BufferedReader(new
-
- InputStreamReader(s.getInputStream()));
-
- os =s.getOutputStream();
-
- // 启动一条子线程来读取服务器响应的数据
-
- new Thread()
-
- {
-
- public void run()
-
- {
-
- String content =null;
-
- // 不断读取 Socket 输入流中的内容
-
- try{
-
- while ((content
-
- =br.readLine()) !=null)
-
- {
-
- // 每当读到来自服务器的数据之后,发送消息通知程序界面显示该数据
-
- Message msg =new
-
- Message();
-
- msg.what = 0x123;
-
- msg.obj = content;
-
-
-
- handler.sendMessage(msg);
-
- }
-
- }
-
- catch (IOException e)
-
- {
-
- e.printStackTrace();
-
- }
-
- }
-
- }.start();
-
- // 为当前线程初始化 Looper
-
- Looper.prepare();
-
- // 创建 revHandler 对象
-
- revHandler =new Handler(){
-
- public void handleMessage(Message msg)
-
- {
-
- // 接收到 UI 线程中用户输入的数据
-
-
-
- // 将用户在文本框内输入的内容写入网络
-
- try
-
- {
-
- os.write((msg.obj.toString() + "\r\n").getBytes("utf-8"));
-
- }
-
- catch (Exception e)
-
- {
-
- e.printStackTrace();
-
- }
-
- }
-
-
-
- };
-
- // 启动 Looper
-
- Looper.loop();
-
- }
-
- catch (SocketTimeoutException e)
-
- {
-
- System.out.println("网络连接超时!!");
-
- }
-
- catch (Exception e)
-
- {
-
- e.printStackTrace();
-
- }
-
- }
-
- }
(2)Register中的登录按钮点击事件
- reday.setOnClickListener(new View.OnClickListener() {
-
- public void onClick(View v) {
-
- String name = username.getText().toString().trim();
-
- String password = userpassword.getText().toString().trim();
-
- if(!TextUtils.isEmpty(name)&&!TextUtils.isEmpty(password)){
-
- mSQlite.add(name,password);
-
- Intent intent1 = new Intent(Register.this,MainActivity.class);
-
- startActivity(intent1);
-
- finish();
-
- Toast.makeText(Register.this,"注册成功",Toast.LENGTH_SHORT).show();
-
- }else {Toast.makeText(Register.this,"信息不完备,注册失败",Toast.LENGTH_SHORT).show();}
-
- }
-
- });
-
- mSQlite = new SQlite(Register.this);
-
- back.setOnClickListener(new View.OnClickListener() {
-
- @Override
-
- public void onClick(View v) {
-
- String name = username.getText().toString().trim();
-
- String password = userpassword.getText().toString().trim();
-
- if (!TextUtils.isEmpty( name ) && !TextUtils.isEmpty( password )) {
-
- ArrayList<User> data = mSQlite.getAllDATA();
-
- boolean user = false;
-
- for (int i = 0; i < data.size(); i++) {
-
- User userdata = data.get( i ); //可存储账号数量
-
- if (name.equals( userdata.getName() ) && password.equals( userdata.getPassword() )) {
-
- user = true;
-
- break;
-
- } else {
-
- user = false;
-
- }
-
- }
-
- if (user) {
-
- Toast.makeText( Register.this, "登录成功", Toast.LENGTH_SHORT ).show();
-
- Intent intent = new Intent( Register.this, MainActivity.class );
-
- intent.putExtra( "username", name );
-
- intent.putExtra( "password", password ); //展示账号密码功能
-
- startActivity( intent );
-
- finish();
-
- } else {
-
- Toast.makeText( Register.this, "用户名或密码不正确", Toast.LENGTH_SHORT ).show();
-
- }
-
- } else {
-
- Toast.makeText( Register.this, "用户名或密码不能为空", Toast.LENGTH_SHORT ).show();
-
- }
-
- }
-
- });
- public class Father_Object {
-
- public RectF rf=new RectF();//获取物体所在的矩形用于碰撞检测
-
- public int hp;//血量
-
- public int hurt;
-
- public float w,h;//物体的宽高
-
- public Bitmap img;//图片
-
- //用set方法设置该物体的位置
-
- public void setX(float x){
-
- rf.left=x;
-
- rf.right=x+w;
-
- }
-
- public void setY(float y){
-
- rf.top=y;
-
- rf.bottom=y+h;
-
- }
-
- //碰撞检测
-
- public boolean collision(Father_Object obj_z,Father_Object obj_bz,float px){//传入主动撞与被动撞两个对象,以及忽略像素
-
- px*=Static_data.scale;
-
- 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){
-
- 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){
-
- return true;
-
- }
-
- }
-
- return false;
-
- }
-
- }
- public class Buff extends Father_Object implements Runnable {
-
- public int property;
-
- public int add_hp;
-
- private float direction =(float)(Math.random()*2)-1;//方向
-
- public Buff(){
-
- property = (int) (Math.random()*2+1);//随机生成1-2的2个整数
-
- w = 100*Static_data.scale;//乘比例
-
- h = 100*Static_data.scale;
-
- if(property==1){
-
- img = Static_data.buff1;//炮弹加成
-
- }
-
- if (property==2){
-
- img = Static_data.buff2;//生命加成
-
- add_hp = 50;
-
- }
-
- setX((float)( Math.random() * (Static_data.Screen_w - w)));//x是随机的
-
- setY(-h);
-
- Static_data.paint_list.add(this);//放进这个集合里才能被画出来
-
- new Thread(this).start();
-
- }
-
- @Override
-
- public void run() {
-
- boolean mark = false;//标记buff有没有碰到我
-
- while (true){
-
- try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); }
-
- //如果碰到两边的墙壁,取反方向
-
- if (rf.left<=0||rf.right>=Static_data.Screen_w)
-
- direction=-direction;
-
- setX(rf.left+direction*10*Static_data.scale);
-
- setY(rf.top+2*Static_data.scale);
-
- try {
-
- //这里判断有没有和我的飞机发生碰撞
-
- My_plane mp = Static_data.my_Plane;
-
- if (collision(this,mp,10)) {//判断碰撞
-
- if(property==2)
-
- mp.hp += add_hp;//我的飞机的生命+add buff
-
- else mp.shell_buff++;
-
- mark = true;//标记炮弹击中了我的飞机
-
- Static_data.score+=50;
-
- break;
-
- }
-
- if(mp.hp>200)//判断我的生命不超过200
-
- mp.hp=200;
-
- if (mp.shell_buff>3)//判断子弹加成不超过3
-
- mp.shell_buff=3;
-
- } catch (Exception e) {
-
- e.printStackTrace();
-
- break;
-
- }
-
- //如果子弹击中我 或者超出屏幕范围跳出循环
-
- if (mark || rf.top>=Static_data.Screen_h) break;
-
- }
-
- Static_data.paint_list.remove(this);//从集合删除
-
- }
-
- }
- public class MusicService extends Service {
-
- static boolean isplay=true;//播放状态
-
- MediaPlayer mediaPlayer;
-
- public MusicService() {
-
- }
-
-
-
- @Override
-
- public IBinder onBind(Intent intent) {
-
- // TODO: Return the communication channel to the service.
-
- throw new UnsupportedOperationException("Not yet implemented");
-
- }
-
-
-
- @Override
-
- public void onCreate() {
-
- //创建 mediaPlayer对象,加载音乐
-
- mediaPlayer = MediaPlayer.create(this,R.raw.music);
-
- super.onCreate();
-
- }
-
-
-
- @Override
-
- public int onStartCommand(Intent intent, int flags, int startId) {
-
- if(!mediaPlayer.isPlaying()){
-
-
-
- mediaPlayer.start();//播放音乐
-
- mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
-
- @Override
-
- public void onCompletion(MediaPlayer mediaPlayer) {
-
- mediaPlayer.start();
-
- }
-
- });
-
- isplay = mediaPlayer.isPlaying();
-
-
-
- }
-
- return super.onStartCommand(intent, flags, startId);
-
- }
-
-
-
- @Override
-
- public void onDestroy() {
-
- mediaPlayer.stop();//停止播放
-
- isplay = mediaPlayer.isPlaying();
-
- mediaPlayer.release();
-
- super.onDestroy();
-
- }
-
- }
- public void control_myPlane(){
-
- setOnTouchListener(new OnTouchListener() {
-
- @Override
-
- public boolean onTouch(View view, MotionEvent e) {
-
- if(e.getAction()== MotionEvent.ACTION_DOWN){//ACTION_DOWN:按下时
-
- click_x=e.getX();
-
- click_y=e.getY();
-
- click_my_plane_x=Static_data.my_Plane.rf.left;
-
- click_my_plane_y=Static_data.my_Plane.rf.top;
-
- }
-
- float move_x=click_my_plane_x+e.getX()-click_x;
-
- float move_y=click_my_plane_y+e.getY()-click_y;
-
- //我的飞机不能飞出屏幕
-
- 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;
-
- move_x=move_x>-Static_data.my_Plane.w/2?move_x:-Static_data.my_Plane.w/2;
-
- 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;
-
- move_y=move_y>-Static_data.my_Plane.h/2?move_y:-Static_data.my_Plane.h/2;
-
- Static_data.my_Plane.setX(move_x);
-
- Static_data.my_Plane.setY(move_y);
-
- return true;
-
- }
-
- });
-
- }
- public class RankActivity extends AppCompatActivity {
-
-
-
- TextView tv_rank;
-
- @Override
-
- protected void onCreate(Bundle savedInstanceState) {
-
- super.onCreate(savedInstanceState);
-
- setContentView(R.layout.activity_rank);
-
-
-
- tv_rank = findViewById(R.id.tv_rank);
-
- // 将读取的分数按“,”切割成字符数组
-
- String[] ScoreStrArr = getScore().split(",");
-
- // Log.i("score", "得分为: "+ScoreArr[0]);
-
- int[] ScoreIntArr = new int[ScoreStrArr.length];//定义一个int数组存分数
-
-
-
- for (int i=0;i<ScoreStrArr.length;i++){
-
- ScoreIntArr[i]= Integer.valueOf(ScoreStrArr[i]);//将字符串数组中的值转为int存到int型数组中
-
- }
-
- Arrays.sort(ScoreIntArr);//用sort函数排序(从小到大排)
-
- int count = 1;//计数器,我们只输出前10名
-
-
-
- String msg = "";//shuchu到前端的msg
-
- String saveMsg = "";//存入文件的msg
-
-
-
- // Log.i("score", "得分为: "+ScoreIntArr[0]);
-
- for (int i=ScoreIntArr.length-1;i>=0;i--){//因为是从小到大排,所以倒着输出
-
- msg +="NO."+count+" :"+ScoreIntArr[i]+"\n";
-
- saveMsg += String.valueOf(ScoreIntArr[i])+",";
-
- count++;
-
- if (count>10)break;
-
- }
-
- tv_rank.setText(msg);
-
- //这里我们将排名重新存一下,把低分删除掉
-
- // Log.i("saveMsg", saveMsg);
-
- saveScore(saveMsg);
-
-
-
-
-
-
-
- }
-
- private void saveScore(String s) {
-
- FileOutputStream outputStream;
-
- BufferedWriter writer = null;
-
- try {
-
- //指定文件名和保存方式,Context.MODE_PRIVATE会覆盖文件,MODE_APPEND会追加文件内容
-
- outputStream = openFileOutput("rank", Context.MODE_PRIVATE);
-
- writer = new BufferedWriter(new OutputStreamWriter(outputStream));
-
- writer.write(s);//写入内容
-
- Log.e("save", "文件已保存");
-
- } catch (IOException e) {
-
- e.printStackTrace();
-
- } finally {
-
- try {
-
- if (writer != null) {
-
- writer.close();
-
- }
-
- } catch (IOException e) {
-
- e.printStackTrace();
-
- }
-
- }
-
- }
-
-
-
- private String getScore() {
-
- FileInputStream inputStream;
-
- BufferedReader reader = null;
-
- StringBuilder builder = new StringBuilder();
-
- try {
-
- inputStream = openFileInput("rank");
-
- reader = new BufferedReader(new InputStreamReader(inputStream));
-
- String line;
-
- while ((line = reader.readLine()) != null) {
-
- builder.append(line);
-
- // tv_rank.setText(line);
-
- }
-
- } catch (IOException e) {
-
- e.printStackTrace();
-
- Log.e("IOException", "读取文件错误: " + e.toString());
-
- } finally {
-
- if (reader != null) {
-
- try {
-
- reader.close();
-
- } catch (IOException e) {
-
- e.printStackTrace();
-
- }
-
- }
-
- }
-
- return builder.toString();
-
- }
-
- }
- public class video extends VideoView {
-
- public video(Context context) {
-
- super(context);
-
- }
-
-
-
- public video(Context context, AttributeSet attrs) {
-
- super(context, attrs);
-
- }
-
-
-
- public video(Context context, AttributeSet attrs, int defStyleAttr) {
-
- super(context, attrs, defStyleAttr);
-
- }
-
- @Override
-
- protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
-
- int width = getDefaultSize(0, widthMeasureSpec);
-
- int height = getDefaultSize(0, heightMeasureSpec);
-
- setMeasuredDimension(width, height);
-
- }
-
- }
表4-1 登录功能测试用例
测试项目 | 登录功能 | 测试编号 | 01 | ||
测试目的 | 登录信息的验证及容错处理 | ||||
序号 | 测试内容 | 测试结果 | 测试结果是否合格 | ||
1 | 不输入任何内容 | 提示:请输入账号或密码 | 合格 | ||
2 | 只输入账号、不输入密码 | 提示:请输入账号或密码 | 合格 | ||
3 | 输入错误的账号密码 | 提示:账号或密码错误 | 合格 | ||
4 | 输入正确的账号密码 | 成功登录到聊天界面 | 合格 | ||
5 | 输入中文账号和密码 | 成功登录到聊天界面 | 合格 | ||
表4-2 注册功能测试用例
测试项目 | 注册功能 | 测试编号 | 02 | ||
测试目的 | 注册信息的验证及容错处理 | ||||
序号 | 测试内容 | 测试结果 | 测试结果是否合格 | ||
1 | 不输入任何内容 | 提示:请输入完整信息! | 合格 | ||
2 | 只输入账号 | 提示:请输入完整信息! | 合格 | ||
3 | 两次密码输入不一致 | 提示:两次密码不一致! | 合格 | ||
4 | 注册已有账号 | 提示:请勿重复注册! | 合格 | ||
5 | 注册新账号 | 提示:注册成功! | 合格 | ||
表4-3 聊天功能测试用例
测试项目 | 分数记录功能 | 测试编号 | 03 | ||
测试目的 | 检验能否正确记录玩家数次分数 | ||||
序号 | 测试内容 | 测试结果 | 测试结果是否合格 | ||
1 | 不得分 | 软件无异常,正常显示 | 合格 | ||
2 | 击败单架敌机 | 软件无异常,正常显示 | 合格 | ||
3 | 击败数个敌机 | 软件无异常,正常显示 | 合格 | ||
4 | 击败BOSS类飞机 | 软件无异常,正常显示 | 合格 | ||
5 | 通过一关 | 软件无异常,正常显示 | 合格 | ||
6 | 通过数关 | 软件无异常,正常显示 | 合格 |
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。