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

news2024/11/28 16:30:07

目录

1.1课程设计的目的

1.2本选题的内容要求

1.3 软件开发运行环境

2.1设计思路

2.2软件总体结构图

2.3主要功能模块的设计

3.1 开始界面模块

3.1.1进入游戏设计

3.1.2退出游戏设计

3.1.3开始界面主要代码

3.2 游戏主界面显示模块

3.2.1游戏界面设计

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

3.2.3游戏界面的主要代码

3.3 游戏按钮模块设计

3.3.1游戏开始按钮功能设计

3.3.2游戏暂停按钮功能设计

3.3.3游戏规则按钮功能设计

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

3.3.5游戏退出按钮功能设计

3.3.6游戏继续按钮功能设计


1.引言

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();
    }
});

代码见我主页发布

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/646586.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++---面向对象预备】

C---面向对象预备 一 、内存的分区&#xff1a;1.1 代码区&#xff1a;1.2 全局区&#xff1a;1.3 栈区&#xff1a;1.4 堆区&#xff1a; 二 、引用&#xff1a;2.1、引用注意事项&#xff1a;2.2、引用作函数参数&#xff1a;2.3、引用作函数的返回值&#xff1a;2.4、引用的…

explain | 索引优化的这把绝世好剑,你真的会用吗?

对于互联网公司来说&#xff0c;随着用户量和数据量的不断增加&#xff0c;慢查询是无法避免的问题。 一般情况下如果出现慢查询&#xff0c;意味着接口响应慢、接口超时等问题&#xff0c;如果是高并发的场景&#xff0c;可能会出现数据库连接被占满的情况&#xff0c;直接导…

MAC电脑设置权限

​​​​​​​ click on your background to go to finderclick on go and go to folder /usrright click on local and do get infounlock the lock at the bottomclick sign and add your user to the list and give read/write privilegesclick on the gear sign at the …

Java Map 所有的值转为String类型

可以使用 Java 8 中的 Map.replaceAll() 方法将所有的值转为 String 类型&#xff1a; Map<String, Object> map new HashMap<>(); // 添加一些键值对 map.put("key1", 123); map.put("key2", true); map.put("key3", new Date())…

Android Studio入门

首先确保系统已经安装好JDK和Android SDK Android SDK的安装有两种方案 方案一&#xff1a;直接下载包安装 官网下载 国内下载 方案二&#xff1a;使用命令行工具进行安装 在Android Studio官网下载Command line tools 最新&#xff1a;如果使用 Android Studio&#xff0c;…

特征维度降维算法——平均影响值算法(MIV)免费MATLAB代码获取,西储大学数据为例

1. 原理概述 众所周知&#xff0c;常用的特征维度降维方法有主成分分析&#xff0c;因子分析法&#xff0c;平均值影响法。而平均影响值算法&#xff08;MIV&#xff09;是神经网络对输入变量进行降维的最好方法之一。 在神经网络模型实际应用中&#xff0c;由于没有明确的…

高压功率放大器的作用和用途是什么

高压功率放大器是一种用于产生高电压和高功率信号的电子设备&#xff0c;通常采用功率放大器电路来实现。它主要起到以下作用&#xff1a; 提供高电压信号 在一些应用中需要产生高电压信号&#xff0c;如高压变频器、医疗设备等。高压功率放大器可以提供稳定的高电压信号&#…

c4d云渲染几款好用的云渲染平台

C4D是指Maxon公司所开发的3D建模、动画和渲染软件Cinema 4D。它是一款非常流行的三维图形软件&#xff0c;被广泛用于电影、电视、游戏等领域中的动画制作、视觉效果、建筑可视化、工业设计、广告设计、虚拟现实等方面。其用户界面简单易用&#xff0c;功能丰富&#xff0c;可以…

之江实验室: 如何基于 JuiceFS 为超异构算力集群构建存储层 ?

今天&#xff0c;高性能计算结合人工智能技术正在推动科研创新。例如通过破解水稻基因密码推动作物育种从“试验选优”向“计算选优”发展&#xff0c;在医药领域快速分析分子与蛋白之间的相互作用&#xff0c;发现潜在的能够有效干预疾病发生的药物分子。 之江实验室就是上述科…

Apikit 自学日记: Apikit 如何发起测试

进入 API 文档详情页&#xff0c;点击上方 测试 标签&#xff0c;进入 API 测试页&#xff0c;系统会根据API文档自动生成测试界面并且填充测试数据。 填写请求参数 首先填写好请求参数。 请求头部 您可以输入或导入请求头部。批量导入的数据格式为 key : value &#xff0c;…

Linux之多线程(上)——Linux下的线程概念

文章目录 前言一、地址空间和页表1.二级页表2.例子 二、线程1.概念重新理解前面讲的进程&#xff1a;在内核的视角&#xff0c;进程是承担分配系统资源的基本实体。站在CPU角度&#xff0c;能否去识别当前调度的task_struct是进程还是线程&#xff1f;Linux下并不存在真正的线程…

漫谈程序员创业

很多程序员选择辞职创业&#xff0c;成为了自己公司的创始人或者合伙人。他们选择离开原有的公司&#xff0c;是因为想要实现自己的梦想&#xff0c;追求更高的创业成就。辞职创业是一项具有挑战性的决定&#xff0c;需要勇气、决心和毅力。一些成功的创业者通过坚持不懈和不断…

知乎视频发布软件使用方法视频

知乎视频发布软件使用方法视频&#xff0c;知乎批量发布软件效果怎么样 #小红书视频上传#抖音seo软件#网络推广#视频营销 软件有月卡、季卡、半年卡、年卡 【其中推荐&#xff1a;百家号 哔哩哔哩B站&#xff0c;微博等软件发帖】 服务时间&#xff1a;&#xff08;8&#xf…

Win10 IE11浏览器,您正在查看的页使用 Java,Microsoft 网站提供有关 Java 支持的更多信息 解决

最近工作需要支持下IE11浏览器&#xff0c;使用java applet控件。 以前IE10及以下版本都比较正常&#xff0c;但是IE11会出现一些比较奇怪的现象。 记录下解决的方法和过程&#xff0c;便于有需要的同学自取。 1.首先是报错&#xff0c;如下图所示&#xff1b;这个网上搜索了…

B站热点预测,提前解码流量关口

“追热点”是创作者的必修课。互联网信息更迭迅速&#xff0c;热点千变万化&#xff0c;今天是这个明天可能就不热了&#xff0c;或者敏锐度不够的创作者甚至会错过最佳进场时期&#xff0c;反倒蹭了热点但只抹到一点奶油。 与此同时&#xff0c;还很考验创作者对热点的发散性…

Layui禁止表格部分复选框,layui禁止表格自带第一列复选框,layui禁止表格部分复选框,layui获取表格复选框选中数据

前言 禁止某些行可以勾选操作&#xff0c;及选中后的操作和行操作 效果 实现 执行一个table示例 <table id"data_table" class"layui-hide" lay-filter"data_table"></table>cols 的第一列就是需要重写的复选框 table.render({…

为什么针对API的Bot自动化攻击越来越多?

API是连接现代应用程序的基石&#xff0c;越来越多的企业意识到API的重要性&#xff0c;其数量迎来爆发式增长&#xff0c;但API面临的安全威胁却比API调用增长更加迅猛。Salt Security于今年2月发布的报告显示&#xff0c;2022年有91%的公司存在与API相关的安全问题&#xff0…

门禁巨头遭勒索攻击,北约、阿里集团等多个实体受到影响

Cyber News 网站披露&#xff0c;疑似与俄罗斯有关的勒索软件团伙 ALPV/BlackCat 袭击了安全门禁制造商Automatic Systems&#xff0c;北约、阿里巴巴、泰雷兹等多个实体组织可能受到影响。 攻击事件发生后&#xff0c;ALPV/BlackCat 在暗网泄露网站上发布了安全门禁制造商 Aut…

基于Citespace、vosviewer文献计量学发表的论文-让您增加一条轻松搞定SCI论文途径

Citespace和vosviewer是使用最广泛的文献信息可视化软件工具&#xff0c;在理工、经管、法学、教育、农学、文史、医学、艺术等学科中普遍应用&#xff0c;发文量逐年显著上升。理论与实践相结合&#xff0c;通过文献计量学讲解、高效选题、数据库检索数据下载、软件使用等八个…

实战项目!ModbusRTU协议电磁泵驱动器温控器通讯讲解

大家好&#xff0c;我是华山自控编程的朱老师。 在之前的网课中&#xff0c;我们已经讲解了以下内容 1.C#与PLC的串口通讯 2.C#与变频器的通讯 3.C#的服务器和客户端的网络通讯 今天&#xff0c;我要视频和大家分享的是关于C#与我们的电磁泵驱动器以及C#与温控器的Modbus通…