手把手教学Android游戏--轮船大战小游戏(文末有代码)

        

1.1课程设计的目的

        轮船大战游戏是一款经典的射击游戏,玩家需要通过控制战舰来消灭敌人并获得高分。本次课程设计通过开发轮船大战游戏,帮助学生掌握Android Studio开发工具的使用,深入了解Android平台的开发流程,提高学生的编程能力和实践经验。

1.2本选题的内容要求

        游戏界面:游戏界面应该具有美观性和用户体验性,能够吸引玩家的眼球并提供良好的游戏体验。

        游戏玩法:游戏玩法应该简单易懂,容易上手,同时要有足够的挑战性,让玩家能够体验到游戏的乐趣和刺激感。

        游戏操作:游戏操作应该简单明了,易于掌握,不会让玩家感到疲惫或烦躁。

       游戏规则:游戏规则应该明确简单,让玩家能够清楚地知道如何得分、如何获胜、如何失败等。

1.3 软件开发运行环境

本软件开发平台: Windows10系统

本软件集成开发环境:  Android studio

本软件运行环境: Windows 7 或 以上版本

2.总体设计

2.1设计思路

        游戏界面设计:游戏界面应该具有良好的视觉效果和用户体验,实现更加流畅的游戏效果和更高的游戏性能。游戏界面应该注重美观性和用户体验,保证游戏的可玩性和趣味性。

        游戏玩法设计:游戏玩法应该简单易懂,容易上手,同时要有足够的挑战性,让玩家能够体验到游戏的乐趣和刺激感。

        游戏操作设计:游戏操作应该简单明了,玩家可以通过屏幕来控制自己的舰艇进行移动和攻击。

        代码质量设计:代码应该具有良好的可读性和可维护性,符合Android开发的规范和标准。代码中应该注重代码的重用性和模块化设计,让代码更加易于维护和扩展。

2.2软件总体结构图

图 2-1 轮船大战总体结构图

2.3主要功能模块的设计

  1. 开始界面模块

           模块布局:该模块实现是进入游戏界面和退出游戏界面,单击进入游戏界面,会绘制游戏场景,还有得分、等级、生命等。

  1. 游戏主界面显示模块

         主界面的布局:从上往下依次是天空、玩家船舰和海底以及随机生成的敌方船舰。

  1. 游戏按钮模块设计

        游戏按钮模块布局:分别是开始按钮和退出按钮,如果点击了开始按钮,游戏开始,开始按钮Text变为暂停按钮,如果继续点击暂停按钮,会弹出对话框,显示继续游戏、游戏规则、重开开始、退出游戏。

3.详细设计与实现

3.1 开始界面模块

3.1.1进入游戏设计

        开始游戏界面模块主要有进入游戏和退出游戏按钮,可以方便玩家进入游戏和退出游戏。

3.1.2退出游戏设计

        开始游戏的主界面如下图所示,在主界面中对按钮的参数进行了调整使其更加美观。整体布局采用纵向排列。

图 3-1 开始界面图

3.1.3开始界面主要代码

(1) 进入游戏、退出游戏按钮的点击事件  

 public void onClick(View v) {
         switch (v.getId()){
            case R.id.start_btn:
                //跳转界面GameActivity
                startActivity(new  
Intent(MainActivity.this,GameActivity.class));
                //当您的活动完成并应该关闭时调用此函数。
                finish();
                break;
            case R.id.exit_btn:
                System.exit(0);
                break;
           }
         }

3.2 游戏主界面显示模块

3.2.1游戏界面设计

        顶部左边是得分、等级和生命的显示,顶部右边是开始、退出按钮的显示,实现开始游戏和退出游戏功能。下方是天空、轮船、敌方船舰和炸弹,实现场景显示,让用户更有画面体验感。底部三个按钮:分别是左移、右移以及射击,方便用户进行操作。

3.2.2游戏界面鱼雷、炸弹、船艇设计

1. 鱼雷设计:轮船大战中的鱼雷是玩家发送的,玩家可以通过鱼雷与敌方战舰战斗,鱼雷的数量会每2s/个,当玩家发射鱼雷击中敌方战舰,敌方战舰产生爆炸,玩家计分,并随着累计,等级提升。

图 3-3 鱼雷设计图

2. 得分、等级、生命设计:轮船大战中玩家可以通过发射鱼雷,消灭敌方船舰,等级提升。

图 3-4 得分、等级和生命设计图

    3.玩家船舰设计图,用来显示玩家船舰:

 图 3-5玩家船舰设计图

       4.左移、右移和发射按钮设计图:玩家可以通过向左向右移动进行控制船舰,躲避炸弹伤害,可通过发射按钮攻击敌方船舰,获得计分以及等级提升。

 图 3-6左移、右移和发射按钮设计图

       5.开始、退出按钮设计图:玩家可通过点击退出按钮,实现退出游戏。也以通过点击开始按钮开始游戏,当玩家点击开始按钮,开始按钮文本更替为暂停,游戏开始。

 图 3-7开始、退出按钮设计图

3.2.3游戏界面的主要代码

//绘制
@Override
protected void onDraw(Canvas canvas) {
    //绘制天空
    Rect say = new Rect(0,0,width,420);
    colors = new int[]{Color.parseColor("#FF5ED6C2"),Color.parseColor("#FFC1EFE8"),Color.WHITE};
    GradientDrawable mDrawable1 = new GradientDrawable(GradientDrawable.Orientation.TOP_BOTTOM,colors);
    mDrawable1.setShape(GradientDrawable.RECTANGLE);
    mDrawable1.setGradientType(GradientDrawable.LINEAR_GRADIENT);
    //设置矩形绘制区域为say
    mDrawable1.setBounds(say);
    mDrawable1.draw(canvas); //绘制
    //绘制海洋
    Rect sea = new Rect(0,420,width,height);
    colors = new int[]{Color.parseColor("#FF3C60D5"),Color.BLUE};
    GradientDrawable mDrawable2 = new GradientDrawable(GradientDrawable.Orientation.TOP_BOTTOM,colors);
    mDrawable2.setShape(GradientDrawable.RECTANGLE); //形状
    mDrawable2.setGradientType(GradientDrawable.LINEAR_GRADIENT); //渐变
    mDrawable2.setBounds(sea); //边界框
    mDrawable2.draw(canvas);
    //绘制数字
    paint.setColor(Color.YELLOW);
    paint.setTextSize(100f); //设置字体大小
    //285-255
    //分别画
    canvas.drawText(String.valueOf(score),305,155,paint);
    canvas.drawText(String.valueOf(pass),675,155,paint);
    canvas.drawText(String.valueOf(liveNum),1050,155,paint);
    //绘制玩家船舰
    ship.drawShip(canvas);
    drawBombNum(canvas);
    /*
        游戏触发事件检测
     */
    //炸弹
    if(!bumbArray.isEmpty()){
        for(int i = 0;i < bumbArray.size();i++){
            if(!bumbArray.get(i).flag){
                bumbArray.get(i).drawBumb(canvas);
            }
            if(bumbArray.get(i).flag){
                bumbArray.remove(i);
            }
        }
    }
    //爆炸
    if(!blastArray.isEmpty()) {
        for(int i = 0; i < blastArray.size(); i++)
        {
            if(!blastArray.get(i).isFlag()) {
                blastArray.get(i).drawBlast(canvas);
            }
            if(blastArray.get(i).isFlag()) {
                blastArray.remove(i);
            }
        }
    }
    //鱼雷
    if(!torpedoArray.isEmpty()){
        for(int i = 0; i < torpedoArray.size(); i ++) {
            if(!torpedoArray.get(i).isFlag()) {
                torpedoArray.get(i).drawTorpedo(canvas);
            }
            if(torpedoArray.get(i).isFlag()) {
                torpedoArray.remove(i);
            }
        }
    }
    //潜艇
    if(!submarineArray.isEmpty()){
        for(int i = 0; i < submarineArray.size(); i ++) {
            if(!submarineArray.get(i).isFlag()) {
                submarineArray.get(i).drawSubmarine(canvas);
            }
            if(submarineArray.get(i).isFlag()) {
                submarineArray.remove(i);
            }
        }
    }
    //有效攻击
    if(!hitArray.isEmpty()){
        for(int i = 0; i < hitArray.size(); i ++) {
            if(!hitArray.get(i).isRunning()) {
                hitArray.get(i).drawHitting(canvas);
            }
            if(hitArray.get(i).isRunning()) {
                hitArray.remove(i);
            }
        }
    }
}

//绘制指定数量炸弹
public void drawBombNum(Canvas canvas) {
    Bitmap bomb= BitmapFactory.decodeResource(getContext().getResources(), R.drawable.bomb);
    for(int i = 0;i < ship.getBombNum();i ++) {
        canvas.drawBitmap(bomb,width/2+100 + 50*i + 70, 75,null);
    }
}

3.3 游戏按钮模块设计

3.3.1游戏开始按钮功能设计

        当玩家点击开始按钮:开始按钮文本替换为暂停,游戏立刻开始,敌方船舰和炸弹随机生成,玩家鱼雷数量增加,直到最多鱼雷数量5个。

游戏开始按钮主要代码:

public void onClick(View v) {
    switch (v.getId()){
        case R.id.pause_text:
            if(gameText.getText().equals("开始")){
                startGame();
            }else{
                //不是开始,置标志为false,暂停
                //绘制暂停界面
                gameView.getShip().setRunning(false);
                showPauseDialog();
            }
            break;
        case R.id.exit_text:
            System.exit(0);
            break;
        case R.id.left_btn:
            gameView.getShip().moveLeft();
            //船左移动,重新绘制界面
            gameView.invalidate();
            break;
        case R.id.right_btn:
            gameView.getShip().moveRight();
            gameView.invalidate();
            break;
        case R.id.shoot_btn:
            //获取船的子弹数量
            int bombNun = gameView.getShip().getBombNum();
            //判断开始游戏
            if(isRunning){
                if( bombNun> 0 && bombNun <= 5) { //子弹判断
                    //新建子弹类
                    Bumb bumb = new  

Bumb(GameActivity.this,gameView.getShip(),gameView);
                    bumbArray.add(bumb);
                    gameView.setBumbArray(bumbArray);
                    Thread t1 =  new Thread(bumb); //创建线程
                    t1.start(); //启动
                    bombNun -- ; //发射子弹后,对数量 - 1
                    gameView.getShip().setBombNum(bombNun); //重新设置子弹数量
                }
            }
            break;
    }
}
//游戏运行
private void startGame(){
    //初始未点击开始按钮状态
    if(isRunning){
        isRunning = false;
        gameView.setLiveNum(3);
        gameView.setPass(1);
        gameView.setScore(0);
        tm1.setSpeed(1000);
        gameView.getShip().setBombNum(5);
        isRunning = true;
        gameView.getShip().setRunning(true);
        for(int i = 0; i < gameView.getBumbArray().size(); i++)
        {
            ((Bumb) gameView.getBumbArray().get(i)).flag = true;
        }
        for(int i = 0; i <  gameView.getSubmarineArray().size(); i++)
        {
            ((Submarine)gameView.getSubmarineArray().get(i)).setFlag(true);
        }
        for(int i = 0; i <gameView.getTorpedoArray().size(); i++)
        {
            ((Torpedo)gameView.getTorpedoArray().get(i)).setFlag(true);
        }
    }
    //开始游戏
    if(!isRunning){
        gameText.setText("暂停");
        gameView.getShip().setRunning(true);
        isRunning = true;
        tm1 = new TimeManager(gameView.getShip(),GameActivity.this,submarine,gameView);
        Thread t = new Thread(tm1);
        t.start();
        for(int i = 0; i < gameView.getBumbArray().size(); i++)
        {
            gameView.getBumbArray().get(i).flag = true;
            gameView.getBumbArray().remove(i);
        }
        for(int i = 0; i < gameView.getSubmarineArray().size(); i++)
        {
            gameView.getSubmarineArray().get(i).setFlag(true);
            gameView.getSubmarineArray().remove(i);
        }
        for(int i = 0; i < gameView.getTorpedoArray().size(); i++)
        {
            gameView.getTorpedoArray().get(i).setFlag(true);
            gameView.getTorpedoArray().remove(i);
        }
    }
}

3.3.2游戏暂停按钮功能设计

       当玩家点击暂停按钮:主界面船舰和炸弹停止移动,页面静止,弹出对话框,显示图片如下。

图3-8 暂停按钮功能设计界面

游戏暂停按钮主要代码:

//绘制暂停界面
private void showPauseDialog(){
    AlertDialog.Builder builder = new AlertDialog.Builder(GameActivity.this);
    final AlertDialog dialog = builder.create();
    dialog.setCancelable(false);
    //动态加载布局
    View view = View.inflate(GameActivity.this, R.layout.pausedialog, null);
    Button rule = (Button)view.findViewById(R.id.rule);
    Button contiueBtn = (Button) view.findViewById(R.id.contiue);
    rule.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            showRuleDialog();
            dialog.dismiss();
        }
    });

3.3.3游戏规则按钮功能设计

当玩家点击游戏规则按钮:弹出对话框游戏规则,如下图。

图3-9 游戏规则按钮功能设计图

游戏规则按钮功能主要代码:

//绘制暂停界面
private void showPauseDialog(){
    AlertDialog.Builder builder = new AlertDialog.Builder(GameActivity.this);
    final AlertDialog dialog = builder.create();
    dialog.setCancelable(false);
    //动态加载布局
    View view = View.inflate(GameActivity.this, R.layout.pausedialog, null);
    Button rule = (Button)view.findViewById(R.id.rule);
    Button contiueBtn = (Button) view.findViewById(R.id.contiue);
    rule.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            showRuleDialog();
            dialog.dismiss();
        }
    });
    //继续

3.3.4游戏重新开始按钮功能设计

当玩家点击重新开始按钮:玩家得分、等级、生命,重置,游戏重新加载开始。

重新开始按钮功能主要代码:

//重新开始
Button again = (Button)view.findViewById(R.id.about);
again.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        startGame();
        synchronized(GameActivity.subLock) {
            GameActivity.subLock.notifyAll();
        }
        dialog.dismiss();
        gameView.invalidate();
    }
});

3.3.5游戏退出按钮功能设计

当玩家点击退出按钮:游戏退出。如若想再次玩游戏,重新启动即可。

游戏退出按钮功能主要代码:

//退出
Button exit =(Button)view.findViewById(R.id.tuichu);
exit.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        System.exit(0);
    }
});

3.3.6游戏继续按钮功能设计

当玩家点击继续按钮:游戏继续,关闭对话框。

图3-10 继续按钮功能设计图

游戏继续按钮功能主要代码:

//继续
contiueBtn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        gameText.setText("暂停");
        gameView.getShip().setRunning(true);

        synchronized(GameActivity.subLock) {
            //线程同步
            GameActivity.subLock.notifyAll();
        }
        dialog.dismiss();
    }
});

代码见我主页发布

猜你喜欢

转载自blog.csdn.net/m0_65635427/article/details/131213743
今日推荐